◀ 6.

MySQL/MariaDBのテーブル一覧|表・ビュー・権限と絞り込み

▶

MySQLの表一覧:DB・権限・表とビューを確認する

サーバーへ接続したあと、既定DBを選ぶか、SHOW TABLES FROM DB名;で対象を指定します。一覧を得るためにDB/表の作成、統計収集、権限拡大を追加しません。

同じ接続で対象DBを選択し、権限内の表とビューを確認する手順

表とビューを分け、対象を固定する

cwiki_w29_aは隔離検体名です。SHOW TABLESにもビューが含まれ、FULLを付けると種類を区別できます。TEMPORARY表はMySQLの通常のSHOW TABLESには出ません。0件/欠落は不存在の保証ではなく、接続先・フィルタ・権限・対象版も確認します。

SHOW FULL TABLES FROM cwiki_w29_a;
SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'cwiki_w29_a'
ORDER BY CAST(TABLE_SCHEMA AS BINARY), CAST(TABLE_NAME AS BINARY);

検体ではBASE TABLE5個とVIEW1個を確認しました。itemsだけのSELECT権限を持つreaderにはitemsだけが見えました。別に作ったTEMPORARY表はMySQL8.4.13のSHOW TABLESには出ず、MariaDB11.8.9には出ました。MariaDBは11.2以降でこの表示が変わっており、両製品を同一視しません。一覧と実際のSELECT可否も別に確認します。

名前中のunderscoreを文字として検索する

LIKEの_は1文字のワイルドカードです。%_logは「文字としての_logで終わる」と同じではありません。明示ESCAPEを使った次のSQLではapp_logだけが一致し、applog/appXlogは一致しません。バックスラッシュ既定やSQL modeへの依存を避けますが、大小文字/照合規則は対象版/設定を別に確認します。

SELECT TABLE_SCHEMA, TABLE_NAME
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'cwiki_w29_a'
  AND TABLE_NAME LIKE '%!_log' ESCAPE '!'
ORDER BY CAST(TABLE_SCHEMA AS BINARY), CAST(TABLE_NAME AS BINARY);

容量・件数と一覧の並び

次は対象DBのBASE TABLEだけの容量/統計照会です。TABLE_ROWSはInnoDBの推定で、データ行/全物理ファイルや削除後の即時回収量の計測ではありません。正確なCOUNTでも観測時点/transactionの範囲があり、大きい表へのCOUNTを無条件で追加しません。同値はschema/表名のBINARY比較で順序を固定します。メタデータの照合規則はDB既定のcollationとは別で、単に名前を並べると大小文字等が同値になる場合があるためです。これは表データの照合/設定変更ではありません。

SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_ROWS, DATA_LENGTH, INDEX_LENGTH
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'cwiki_w29_a'
  AND TABLE_TYPE = 'BASE TABLE'
ORDER BY DATA_LENGTH DESC, CAST(TABLE_SCHEMA AS BINARY), CAST(TABLE_NAME AS BINARY);

列数の上位も同値があり得るため、LIMIT前の順序にschema/表名のバイト比較を含めます。GROUP BYにも同じ区別を入れ、大小文字を同一視するメタデータの照合規則でItemsとitemsの列数を合算しないようにしています。可視なCOLUMNSだけの集計であり、見えない列を含む完全なschema比較とは限りません。

SELECT TABLE_SCHEMA, TABLE_NAME, COUNT(*) AS column_count
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'cwiki_w29_a'
GROUP BY TABLE_SCHEMA, TABLE_NAME,
         CAST(TABLE_SCHEMA AS BINARY), CAST(TABLE_NAME AS BINARY)
ORDER BY column_count DESC, CAST(TABLE_SCHEMA AS BINARY), CAST(TABLE_NAME AS BINARY)
LIMIT 10;

他製品の旧比較を読むとき

psqlの\dtはpublic固定ではなくsearch_path上で可視な対象です。OracleのNUM_ROWS/BLOCKSは統計で、blocks×8が全DBの実サイズになるわけではありません。SQL Serverのallocation unitの結合条件やLOB/row-overflow/partition等も区別し、旧集計を完全な容量集計として再利用しません。SQLiteのdot commandはshell専用で、SQL文や全RDBMS共通のinformation_schemaではありません。

GUIは対象製品/版を確認します。Azure Data Studioは2026-02-28で廃止され、更新/セキュリティ修正のない状態なので、新規導入の推奨候補から外します。既存の名称は履歴の説明として残します。

次はテーブル定義、列/索引/FKの区別はメタデータを参照してください。元の確認順とコマンド一覧への導線も戻しています。

既存の接続・一覧資料(製品別の補足)

この記事の要点
  • MySQL: SHOW TABLES / SHOW TABLES FROM dbname / information_schema.tables
  • PostgreSQL: psql で \dt / \dt+ / pg_catalog.pg_tables
  • Oracle: USER_TABLES (自分) / ALL_TABLES (権限あり) / DBA_TABLES (管理者)
  • SQL Server: sys.tables / INFORMATION_SCHEMA.TABLES
  • 共通の標準: information_schema.tables は標準部分/製品固有項目と可視権限が異なり、全RDBMS共通ではない

MySQL / MariaDB

基本: SHOW TABLES

旧例の注意:SHOW TABLESにもビューが含まれます。LIKEの_は任意1文字なので%_logを文字列_logと同じに扱いません。可視権限/対象DBも確認します。

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

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

-- ワイルドカードで絞り込み
SHOW TABLES LIKE 'user%';     -- user で始まる
SHOW TABLES LIKE '%_log';     -- _log で終わる

-- VIEW も含めるか
SHOW FULL TABLES;
-- +------------------+------------+
-- | Tables_in_mydb   | Table_type |
-- +------------------+------------+
-- | users            | BASE TABLE |
-- | active_users     | VIEW       |
-- +------------------+------------+

-- VIEW だけ
SHOW FULL TABLES WHERE Table_type = 'VIEW';

information_schema 経由 (標準 SQL に近い)

旧例の注意:TABLE_ROWS/容量は推定やengine依存です。旧top10は同値順序がなく、FKも参照先schema/列順を省略しています。対象と一意順序を含む読取例を参照します。

-- 全テーブル + 件数 + サイズ
SELECT
    TABLE_NAME,
    TABLE_ROWS,
    ROUND(DATA_LENGTH/1024/1024, 2) AS data_mb,
    ROUND(INDEX_LENGTH/1024/1024, 2) AS index_mb,
    ENGINE,
    TABLE_COLLATION
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'mydb'
ORDER BY DATA_LENGTH DESC;

-- カラム数の多いテーブル top10
SELECT TABLE_NAME, COUNT(*) AS cols
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'mydb'
GROUP BY TABLE_NAME
ORDER BY cols DESC
LIMIT 10;

-- 外部キー一覧
SELECT TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = 'mydb'
  AND REFERENCED_TABLE_NAME IS NOT NULL;

PostgreSQL

psql のメタコマンド

旧例の注意:psqlの\dtはpublic固定ではなくsearch_path上で可視な対象です。\dはDDL完全復元ではなく、出力ファイルも既存データを上書きしないよう確認します。

-- psql 接続後
\dt              -- public スキーマのテーブル
\dt+             -- サイズ・所有者付き
\dt *.*          -- 全スキーマ
\dt myschema.*   -- 特定スキーマ

\dv              -- VIEW 一覧
\di              -- インデックス
\ds              -- シーケンス
\d table_name    -- テーブル定義 (CREATE TABLE 相当)
\d+ table_name   -- 詳細 (サイズ・統計付き)

-- 出力をファイルに
\o tables.txt
\dt
\o

SQL クエリで取得

旧例の注意:PGの情報schemaとcatalog/統計は範囲が異なり、n_live_tupは推定です。全DBMS共通の実行例ではありません。

-- pg_catalog 経由 (PostgreSQL ネイティブ)
SELECT schemaname, tablename, tableowner
FROM pg_catalog.pg_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
ORDER BY schemaname, tablename;

-- information_schema 経由 (標準 SQL)
SELECT table_schema, table_name, table_type
FROM information_schema.tables
WHERE table_schema NOT IN ('pg_catalog', 'information_schema');

-- サイズ付き (実用)
SELECT
    schemaname,
    relname AS table_name,
    pg_size_pretty(pg_total_relation_size(relid)) AS total_size,
    pg_size_pretty(pg_relation_size(relid))       AS table_size,
    n_live_tup AS row_count
FROM pg_stat_user_tables
ORDER BY pg_total_relation_size(relid) DESC;

Oracle

旧例の注意:Oracle専用です。NUM_ROWS/BLOCKSは統計で、block長8KBの決め打ちは全環境の実サイズではありません。GATHER_SCHEMA_STATSは読取ではなく、一覧確認のために実行しません。

-- 自分が所有するテーブル
SELECT table_name FROM user_tables ORDER BY table_name;

-- 自分がアクセス可能な全テーブル (他スキーマ含む)
SELECT owner, table_name FROM all_tables
WHERE owner NOT IN ('SYS', 'SYSTEM', 'OUTLN', 'DBSNMP')
ORDER BY owner, table_name;

-- DBA 権限がある場合 (全テーブル)
SELECT owner, table_name FROM dba_tables;

-- VIEW
SELECT view_name FROM user_views;

-- サイズ・行数 (統計が必要)
SELECT table_name, num_rows, blocks * 8 / 1024 AS size_mb
FROM user_tables
ORDER BY num_rows DESC;

-- 統計再収集
EXEC DBMS_STATS.GATHER_SCHEMA_STATS(USER);

-- SQL*Plus 上で
DESC table_name;

SQL Server

旧例の注意:SQL Server専用です。旧allocation unitの結合/partition/LOB等とschemaを省略した集計は完全容量を保証しません。USEもMySQLと同じ全接続の挙動と扱いません。

-- sys.tables 経由
SELECT s.name AS schema_name, t.name AS table_name, t.create_date
FROM sys.tables t
JOIN sys.schemas s ON t.schema_id = s.schema_id
ORDER BY s.name, t.name;

-- INFORMATION_SCHEMA 経由 (標準 SQL)
SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE';

-- サイズ・行数付き
EXEC sp_spaceused;             -- DB 全体
EXEC sp_spaceused 'dbo.users'; -- 個別テーブル

-- 動的: 全テーブルのサイズ一覧
SELECT
    t.NAME AS TableName,
    p.rows AS RowCounts,
    SUM(a.total_pages) * 8 / 1024 AS TotalSpaceMB
FROM sys.tables t
JOIN sys.indexes i ON t.OBJECT_ID = i.object_id
JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
JOIN sys.allocation_units a ON p.partition_id = a.container_id
WHERE i.index_id <= 1
GROUP BY t.NAME, p.rows
ORDER BY TotalSpaceMB DESC;

-- sqlcmd で
USE mydb;
EXEC sp_tables;

SQLite

旧例の注意:SQLiteのdot commandはshell専用です。sqlite_masterの対象/内部表/ATTACHの範囲も確認し、全RDBMSで同じカタログを使えると扱いません。

-- sqlite3 コンソール
.tables
.schema table_name
.indexes table_name

-- SQL から
SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;
SELECT name FROM sqlite_master WHERE type='index';
SELECT sql  FROM sqlite_master WHERE name='users';

各 DB の対応表

DBテーブル一覧定義表示サイズ
MySQL / MariaDBSHOW TABLESDESC tbl / SHOW CREATE TABLE tblinformation_schema.TABLES
PostgreSQL\dt\d tblpg_total_relation_size()
OracleUSER_TABLESDESC tblUSER_SEGMENTS
SQL Serversys.tablessp_help 'tbl'sp_spaceused
SQLite.tables.schema tbl—

クライアントツール GUI

  • MySQL Workbench / phpMyAdmin / DBeaver / HeidiSQL — MySQL/MariaDB
  • pgAdmin / DBeaver / Postico — PostgreSQL
  • SQL Developer / Toad / DBeaver — Oracle
  • SSMS / Azure Data Studio(2026-02-28廃止。新規導入の推奨ではない) / DBeaver — SQL Server
  • DBeaver も接続先製品/driver/認証/TLSの対応版を個別に確認する

FAQ

Q: 大量のテーブルがあって絞り込みたい
A: MySQL は SHOW TABLES LIKE 'prefix_%'、PostgreSQL は \dt prefix_*、Oracle は WHERE table_name LIKE 'PREFIX\_%' ESCAPE '\'。

Q: 行数が知りたい
A: MySQL information_schema.TABLES.TABLE_ROWS は概算。正確には SELECT COUNT(*) FROM tbl。推定値に固定の最大誤差を保証せず、観測条件/負荷も確認します。

Q: information_schema は全 RDBMS で使える?
A: 標準由来でも全製品/項目の共通性は保証しません。OracleのUSER/ALL等やSQLiteのschemaは別の仕組みで、可視範囲/対象版を合わせて確認します。

元の書式付きコマンド

元例の注意:元のコマンド表示です。DB名は置換箇所で、既定DB/接続先/権限を確認します。表一覧は未選択ならFROM指定を使い、USEはサーバーへの再接続とは区別します。

show tables;

元の確認順と次のページ

元の確認表を保持します。DB一覧を見ただけでは既定DBは選択されないので、SHOW TABLESの前にUSEで選ぶかFROMで指定します。

順番 やること
1 MYSQLへの接続で接続する
2 データベース一覧の表示で対象DBを確認する
3 show tables; を実行する
4 必要に応じて テーブル定義を確認 へ進む

検証範囲と一次資料

新規の小規模MySQL8.4.13/MariaDB11.8.9検体の同一接続/別接続、限定権限と各製品の同梱CLIで検証した範囲です。全言語driver/GUI/接続pool/実SSH経路/各OSの導入や証明書運用・PG/Oracle/SQL Serverの旧例の実行成功を保証しません。本番のschema/認証/設定を変更していません。

子ページ

子ページはありません

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

最近更新/作成されたページ