タイトル: テーブル一覧を表示
SEOタイトル: DB テーブル一覧表示完全ガイド (MySQL/PostgreSQL/Oracle/SQL Server)
| この記事の要点 |
|
MySQL / MariaDB
基本: SHOW TABLES
-- 接続中の 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 に近い)
-- 全テーブル + 件数 + サイズ
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 スキーマのテーブル
\dt+ -- サイズ・所有者付き
\dt *.* -- 全スキーマ
\dt myschema.* -- 特定スキーマ
\dv -- VIEW 一覧
\di -- インデックス
\ds -- シーケンス
\d table_name -- テーブル定義 (CREATE TABLE 相当)
\d+ table_name -- 詳細 (サイズ・統計付き)
-- 出力をファイルに
\o tables.txt
\dt
\o
SQL クエリで取得
-- 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
-- 自分が所有するテーブル
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
-- 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
-- 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 / MariaDB | SHOW TABLES | DESC tbl / SHOW CREATE TABLE tbl | information_schema.TABLES |
| PostgreSQL | \dt | \d tbl | pg_total_relation_size() |
| Oracle | USER_TABLES | DESC tbl | USER_SEGMENTS |
| SQL Server | sys.tables | sp_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 / DBeaver — SQL Server
- DBeaver はマルチ DB 対応で 1 本で済む
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。InnoDB の概算は最大 50% ズレることもある。
Q: information_schema は全 RDBMS で使える?
A: MySQL / PostgreSQL / SQL Server / MariaDB は標準対応。Oracle のみ非対応で、代わりに USER_TABLES / ALL_TABLES を使う。