4.

MySQL データベース一覧の表示方法完全ガイド

編集
この記事の要点
  • SHOW DATABASES; が王道。MySQL CLI / phpMyAdmin / アプリ全てで動く
  • information_schema.SCHEMATASELECT すると、文字コード・照合順序などメタ情報も取れる
  • シェルから 1 行で取得: mysql -uroot -p -e "SHOW DATABASES;"
  • 権限が無い DB はそもそも一覧に出ない。MySQL は権限テーブルでフィルタする仕様
  • PostgreSQL は \l (psql) / SQL Server は sys.databases / Oracle は v$database
  • 特定 DB のテーブル一覧USE db; SHOW TABLES; または SHOW TABLES FROM db;

SHOW DATABASES — 最も基本

SHOW DATABASES;
-- +--------------------+
-- | Database           |
-- +--------------------+
-- | information_schema |
-- | mysql              |
-- | performance_schema |
-- | sys                |
-- | myapp              |
-- +--------------------+

information_schema / mysql / performance_schema / sys は MySQL システムスキーマです。ユーザー作成 DB と区別して見てください。

パターンマッチで絞り込み

-- LIKE で絞る
SHOW DATABASES LIKE 'myapp%';

-- システム DB を除外
SHOW DATABASES WHERE `Database` NOT IN ('information_schema','mysql','performance_schema','sys');

information_schema を直接参照

メタ情報(文字コード等)も同時に取りたい場合:

SELECT schema_name AS db,
       default_character_set_name AS charset,
       default_collation_name AS collation
FROM information_schema.SCHEMATA
ORDER BY schema_name;

-- ユーザー DB のみ
SELECT schema_name
FROM information_schema.SCHEMATA
WHERE schema_name NOT IN ('information_schema','mysql','performance_schema','sys');

シェル / スクリプトから

# CLI から 1 行で取得
mysql -uroot -p -e "SHOW DATABASES;"

# パスワードを .my.cnf 等に書いておくと対話なしで
mysql --defaults-file=~/.my.cnf -e "SHOW DATABASES;"

# ヘッダなし・タブ区切り(パイプ処理向き)
mysql -uroot -p -N -B -e "SHOW DATABASES;"

# mysqlshow ユーティリティ
mysqlshow -uroot -p
mysqlshow -uroot -p myapp        # myapp のテーブル一覧

# ホスト指定
mysql -h dbhost -P 3306 -uuser -p -e "SHOW DATABASES;"

テーブル一覧も合わせて

-- 接続中の DB のテーブル一覧
SHOW TABLES;

-- 別 DB のテーブル一覧
SHOW TABLES FROM myapp;

-- ビューも含む詳細
SHOW FULL TABLES FROM myapp;
-- +-------------+------------+
-- | Tables_in_…  | Table_type |
-- +-------------+------------+
-- | users       | BASE TABLE |
-- | user_stats  | VIEW       |

-- information_schema 経由
SELECT table_schema, table_name, table_type, engine
FROM information_schema.TABLES
WHERE table_schema = 'myapp'
ORDER BY table_name;

-- DB のサイズも一緒に
SELECT table_schema AS db,
       ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS size_mb
FROM information_schema.TABLES
GROUP BY table_schema
ORDER BY size_mb DESC;

他 DBMS での「DB 一覧」

DBMSDB 一覧テーブル一覧
MySQL / MariaDBSHOW DATABASESSHOW TABLES
PostgreSQL (psql)\l または \list\dt
PostgreSQL (SQL)SELECT datname FROM pg_databaseSELECT * FROM pg_tables WHERE schemaname='public'
SQL ServerSELECT name FROM sys.databasesSELECT name FROM sys.tables
OracleSELECT name FROM v$database (1 件しか無い)SELECT table_name FROM all_tables
SQLite.databases (CLI).tables / SELECT name FROM sqlite_master WHERE type='table'

※ Oracle の場合 1 つの「データベース」内に複数のスキーマ(ユーザー)が存在する設計のため、概念が MySQL とずれます。MySQL の DB ≒ Oracle のスキーマ。

JDBC / プログラムから

// Java の例
try (Connection conn = DriverManager.getConnection(url, user, pass)) {
    DatabaseMetaData meta = conn.getMetaData();
    try (ResultSet rs = meta.getCatalogs()) {       // MySQL は CATALOG = DB
        while (rs.next()) {
            System.out.println(rs.getString("TABLE_CAT"));
        }
    }
}
# Python (PyMySQL)
import pymysql
conn = pymysql.connect(host='localhost', user='root', password='xxx')
with conn.cursor() as cur:
    cur.execute("SHOW DATABASES")
    for (db,) in cur.fetchall():
        print(db)

権限が見えない DB を確認

-- 現在のユーザー
SELECT CURRENT_USER();

-- 自分が持つ権限を確認
SHOW GRANTS;

-- root で他ユーザーに権限付与
GRANT SELECT ON myapp.* TO 'reader'@'%';
FLUSH PRIVILEGES;

FAQ

Q: ある DB だけ SHOW DATABASES に出てこない
A: そのユーザーに権限が無い DB は表示されません。root で SHOW GRANTS FOR 'user'@'host' を確認し、必要なら GRANT を付与。

Q: 接続している DB を確認したい
A: SELECT DATABASE(); で現在の DB 名が返ります。NULL なら未選択。

Q: 大文字小文字
A: Linux の MySQL はデフォルトで DB 名・テーブル名が大小区別。lower_case_table_names 設定で挙動が変わります(変更は再初期化必要)。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. MySQLの起動(Windows)
  2. MySQLの起動、停止、再起動(Linux)
  3. MYSQL への接続
  4. データベース一覧の表示
  5. データベースへの接続
  6. テーブル一覧を表示
  7. テーブル定義を確認
  8. ユーザーおよびパスワード一覧の確認