【Oracle】テーブル一覧を確認するSQL完全ガイド|USER_TABLES・ALL_TABLES・DBA_TABLES・カラム・サイズ・コメントまで網羅

【Oracle】データベース内の全テーブルを確認する方法 Oracle

「このデータベースにどんなテーブルがあるか調べたい」「特定のキーワードを含むテーブルを検索したい」「テーブルのカラム構成やサイズを一覧で把握したい」——Oracleを使っていれば必ず直面する場面です。

Oracleのテーブル情報はデータディクショナリビューに格納されており、USER_TABLESALL_TABLESDBA_TABLES の3つを使い分けることであらゆるケースに対応できます。さらにカラム構造・行数・テーブルサイズ・コメント(論理名)・制約・インデックスまで、関連ビューを組み合わせれば未知のデータベースを完全に把握できます。

この記事では、テーブル一覧の取得から詳細情報の確認まで、実務で使えるSQLをすべて解説します。

この記事でわかること
・USER_TABLES / ALL_TABLES / DBA_TABLES の使い分け
・テーブル名のLIKE検索・スキーマ指定・件数集計
・カラム構造(データ型・NOT NULL・デフォルト値)の一覧確認
・テーブルの行数・サイズ・表領域の確認方法
・テーブル・カラムのコメント(論理名)を取得するSQL
・制約・インデックス・シノニムも含めたオブジェクト全体の把握
・テーブルが見つからないときのトラブルシューティング
スポンサーリンク
  1. 3つのビューの使い分け
  2. USER_TABLES:自分のテーブル一覧を確認する
    1. 基本のテーブル一覧
    2. テーブル数だけ確認
    3. テーブルの主要情報を一覧表示
    4. テーブル名をLIKE検索する
  3. ALL_TABLES:アクセス可能な全テーブルを確認する
    1. アクセス可能な全テーブル一覧
    2. 特定のスキーマに絞り込む
    3. スキーマごとのテーブル数を集計
    4. 全スキーマを横断してテーブル名を検索
  4. DBA_TABLES:データベース全体のテーブルを確認する(DBA用)
    1. 業務テーブルのみ表示(システムスキーマ除外)
    2. スキーマ別テーブル数(全体把握)
  5. テーブルのカラム構造(列定義)を確認する
    1. 特定テーブルのカラム一覧
    2. 全テーブルのカラム数を一覧表示
    3. 特定のカラム名を持つテーブルを検索
    4. SQL*Plusで手軽にカラム構造を確認(DESC)
  6. テーブルのコメント(論理名・説明)を確認する
    1. テーブルのコメント一覧
    2. テーブル名+コメントの組み合わせで一覧表示
    3. カラムのコメントも含めた詳細一覧
  7. テーブルの行数・サイズを確認する
    1. 統計情報ベースの行数確認(高速)
    2. 正確な行数を取得する(SELECT COUNT)
    3. テーブルサイズをMB単位で確認
    4. テーブルの詳細サイズ情報(行数・平均行長・サイズ)を組み合わせ
  8. テーブルの制約を確認する
    1. 特定テーブルの制約一覧
    2. 制約に対応するカラムも含めて確認
  9. テーブルのインデックスを確認する
  10. ALL_OBJECTS:テーブル以外のオブジェクトも含めて一覧確認
    1. シノニムからテーブルを逆引きする
    2. ビュー一覧の確認
  11. テーブルの作成日・最終DDL変更日を確認する
  12. 未知のデータベースを調査する手順(実践シナリオ)
    1. ステップ1:スキーマの全体像を把握する
    2. ステップ2:テーブル一覧とコメント(論理名)を確認
    3. ステップ3:主要テーブルのカラム構成を確認
    4. ステップ4:テーブルの関連(外部キー)を確認
  13. テーブルが見つからないときのトラブルシューティング
    1. ケース1:ORA-00942: 表またはビューが存在しません
    2. ケース2:USER_TABLESに出ないが実際には参照できる
    3. ケース3:DBA_TABLESにあるのにALL_TABLESに出ない
  14. 実務でよく使う便利クエリ一覧
  15. よくある質問
  16. まとめ
  17. あわせて読みたい

3つのビューの使い分け

Oracleのテーブル一覧を確認するビューは3種類あります。どれを使うかは、確認対象とログインユーザーの権限によって決まります。

ビュー名 確認できる範囲 必要な権限 使いどころ
USER_TABLES 自分のスキーマが所有するテーブルのみ 不要 開発者が自分のテーブルを確認する場面で最も頻繁に使う
ALL_TABLES 自分がアクセス権を持つすべてのテーブル(他スキーマ含む) 不要 他スキーマのテーブルにもアクセスしている場面
DBA_TABLES データベース内の全テーブル(システム含む) DBA権限 または SELECT_CATALOG_ROLE DBA・インフラ担当が全体を把握する場面
選択基準:まず USER_TABLES を試す。他スキーマのテーブルも必要なら ALL_TABLES へ。DB全体を見たいがDBA権限がない場合は ALL_TABLES + owner 条件で絞り込む。DB全体をシステムテーブルも含めて確認したい場合は DBA_TABLES

USER_TABLES:自分のテーブル一覧を確認する

最もシンプルな確認方法です。現在のログインユーザーが所有するテーブル一覧を取得します。

基本のテーブル一覧

-- テーブル名を五十音順(ABC順)で表示
SELECT table_name
FROM   user_tables
ORDER BY table_name;

テーブル数だけ確認

-- テーブルの総数
SELECT COUNT(*) AS table_count
FROM   user_tables;

テーブルの主要情報を一覧表示

-- テーブル名・行数・表領域・圧縮設定を一覧
SELECT table_name,
       num_rows,
       blocks,
       tablespace_name,
       compression,
       last_analyzed
FROM   user_tables
ORDER BY table_name;

主要カラムの説明:

カラム名 説明 備考
TABLE_NAME テーブル名(大文字)
NUM_ROWS 推定行数(統計情報ベース) ANALYZE/DBMS_STATS収集後の値。リアルタイムではない
BLOCKS 使用されているデータブロック数 サイズの目安に使用
AVG_ROW_LEN 平均行長(バイト) サイズ見積もりに使用
TABLESPACE_NAME テーブルが格納されている表領域
COMPRESSION 圧縮設定(ENABLED / DISABLED) パーティションテーブルはNULL
LAST_ANALYZED 最後に統計収集した日時 NULLは統計未収集
STATUS テーブルの状態(VALID / UNUSABLE) 通常はVALID
PARTITIONED パーティションテーブルか(YES / NO)
IOT_TYPE 索引構成表かどうか(IOT等) NULLは通常ヒープ表

テーブル名をLIKE検索する

-- 「EMP」を含むテーブルを検索
SELECT table_name
FROM   user_tables
WHERE  table_name LIKE '%EMP%'
ORDER BY table_name;

-- 「ORDER_」で始まるテーブルを検索
SELECT table_name
FROM   user_tables
WHERE  table_name LIKE 'ORDER\_%' ESCAPE '\'
ORDER BY table_name;
注意:テーブル名は Oracle 内部では大文字で保存されています。WHERE table_name = 'employees' のように小文字で検索してもヒットしません。常に大文字('EMPLOYEES')または UPPER() 関数を使ってください。
-- 大文字・小文字を気にしない検索
SELECT table_name
FROM   user_tables
WHERE  UPPER(table_name) LIKE UPPER('%employees%')
ORDER BY table_name;

ALL_TABLES:アクセス可能な全テーブルを確認する

自分のテーブルだけでなく、他のスキーマで参照権限があるテーブルも含めて確認します。OWNER カラムでどのスキーマのテーブルかが分かります。

アクセス可能な全テーブル一覧

-- オーナー(スキーマ)とテーブル名を一覧
SELECT owner,
       table_name
FROM   all_tables
ORDER BY owner, table_name;

特定のスキーマに絞り込む

-- HRスキーマのテーブルのみ確認
SELECT table_name,
       num_rows,
       tablespace_name
FROM   all_tables
WHERE  owner = 'HR'
ORDER BY table_name;

スキーマごとのテーブル数を集計

-- スキーマ別テーブル数(多い順)
SELECT owner,
       COUNT(*) AS table_count
FROM   all_tables
GROUP BY owner
ORDER BY table_count DESC;

全スキーマを横断してテーブル名を検索

-- DB全体でテーブル名に「ORDER」を含むテーブルを検索
SELECT owner,
       table_name
FROM   all_tables
WHERE  table_name LIKE '%ORDER%'
ORDER BY owner, table_name;

DBA_TABLES:データベース全体のテーブルを確認する(DBA用)

DBA権限がある場合、DBA_TABLES でシステムテーブルも含むDB全体のテーブルを確認できます。

業務テーブルのみ表示(システムスキーマ除外)

-- Oracleシステムスキーマを除外して業務テーブルのみ表示
SELECT owner,
       table_name,
       num_rows,
       tablespace_name
FROM   dba_tables
WHERE  owner NOT IN (
    'SYS','SYSTEM','DBSNMP','OUTLN','MDSYS','CTXSYS',
    'XDB','ORDSYS','EXFSYS','SYSMAN','WMSYS','FLOWS_FILES',
    'APEX_PUBLIC_USER','ANONYMOUS'
)
ORDER BY owner, table_name;

スキーマ別テーブル数(全体把握)

-- スキーマ別テーブル数サマリー(システムスキーマ除外)
SELECT owner,
       COUNT(*)                    AS table_count,
       SUM(num_rows)               AS total_rows,
       SUM(blocks)                 AS total_blocks
FROM   dba_tables
WHERE  owner NOT IN ('SYS','SYSTEM','DBSNMP','OUTLN')
GROUP BY owner
ORDER BY table_count DESC;

テーブルのカラム構造(列定義)を確認する

テーブルのカラム一覧は USER_TAB_COLUMNS(DBA用は DBA_TAB_COLUMNS)で確認します。データ型・桁数・NOT NULL制約・デフォルト値まで取得できます。

特定テーブルのカラム一覧

-- EMPLOYEES テーブルのカラム構造を確認
SELECT column_name,
       data_type,
       data_length,
       data_precision,
       data_scale,
       nullable,
       data_default,
       column_id
FROM   user_tab_columns
WHERE  table_name = 'EMPLOYEES'
ORDER BY column_id;

実行結果の例:

COLUMN_NAME DATA_TYPE DATA_LENGTH NULLABLE DATA_DEFAULT
EMPLOYEE_ID NUMBER 22 N
FIRST_NAME VARCHAR2 20 Y
LAST_NAME VARCHAR2 25 N
HIRE_DATE DATE 7 N
SALARY NUMBER 22 Y
STATUS_FLG CHAR 1 N ‘1’
カラム名 意味
DATA_TYPE データ型(VARCHAR2, NUMBER, DATE, CLOB など)
DATA_LENGTH バイト長(VARCHAR2 は最大バイト長)
DATA_PRECISION NUMBERの全体桁数(例: NUMBER(10,2)なら10)
DATA_SCALE NUMBERの小数桁数(例: NUMBER(10,2)なら2)
NULLABLE N = NOT NULL制約あり / Y = NULL許容
DATA_DEFAULT DEFAULT値(NULLは未設定)
COLUMN_ID テーブル定義時のカラム順序番号

全テーブルのカラム数を一覧表示

-- テーブルごとのカラム数を確認
SELECT table_name,
       COUNT(column_name) AS column_count
FROM   user_tab_columns
GROUP BY table_name
ORDER BY column_count DESC;

特定のカラム名を持つテーブルを検索

-- 「_ID」で終わるカラムを持つテーブルを検索
SELECT table_name,
       column_name,
       data_type
FROM   user_tab_columns
WHERE  column_name LIKE '%_ID'
ORDER BY table_name, column_name;

-- 他スキーマも含めて特定カラム名を検索(DBA用)
SELECT owner,
       table_name,
       column_name,
       data_type
FROM   dba_tab_columns
WHERE  column_name = 'CUSTOMER_ID'
  AND  owner NOT IN ('SYS','SYSTEM')
ORDER BY owner, table_name;

SQL*Plusで手軽にカラム構造を確認(DESC)

-- SQL*Plus: テーブル構造を表示
DESC EMPLOYEES

-- 実行結果の例
--  Name                 Null?    Type
--  -------------------- -------- ----------------
--  EMPLOYEE_ID          NOT NULL NUMBER(6)
--  FIRST_NAME                    VARCHAR2(20)
--  LAST_NAME            NOT NULL VARCHAR2(25)
--  HIRE_DATE            NOT NULL DATE
--  SALARY                        NUMBER(8,2)

テーブルのコメント(論理名・説明)を確認する

USER_TAB_COMMENTSUSER_COL_COMMENTS でテーブルやカラムに設定されたコメント(日本語の論理名など)を確認できます。

テーブルのコメント一覧

-- テーブルに設定されたコメント(論理名)を確認
SELECT table_name,
       table_type,
       comments
FROM   user_tab_comments
WHERE  comments IS NOT NULL
ORDER BY table_name;

テーブル名+コメントの組み合わせで一覧表示

-- テーブル物理名・論理名・カラム数を一覧
SELECT t.table_name,
       tc.comments          AS table_comment,
       COUNT(c.column_name) AS col_count
FROM   user_tables t
LEFT   JOIN user_tab_comments tc ON tc.table_name = t.table_name
LEFT   JOIN user_tab_columns  c  ON c.table_name  = t.table_name
GROUP BY t.table_name, tc.comments
ORDER BY t.table_name;

カラムのコメントも含めた詳細一覧

-- テーブル・カラムのコメントを一覧
SELECT c.table_name,
       c.column_name,
       c.data_type,
       cc.comments          AS col_comment
FROM   user_tab_columns  c
LEFT   JOIN user_col_comments cc
    ON  cc.table_name  = c.table_name
    AND cc.column_name = c.column_name
WHERE  c.table_name = 'EMPLOYEES'
ORDER BY c.column_id;
コメントの設定方法COMMENT ON TABLE テーブル名 IS '論理名'; / COMMENT ON COLUMN テーブル名.カラム名 IS '論理名'; で設定できます。コメントは削除しても NULL になるだけで、ビューには行が残ります(WHERE comments IS NOT NULL で除外)。

テーブルの行数・サイズを確認する

統計情報ベースの行数確認(高速)

USER_TABLES.NUM_ROWS は統計収集時点の値です。DBMS_STATS が最後に実行された時刻も合わせて確認できます。

-- テーブルの行数と統計更新日時
SELECT table_name,
       num_rows,
       last_analyzed
FROM   user_tables
WHERE  num_rows IS NOT NULL
ORDER BY num_rows DESC;
注意NUM_ROWS は統計情報の収集タイミングによって実際の行数と異なる場合があります。LAST_ANALYZED が古い(またはNULL)場合は SELECT COUNT(*) で正確な件数を確認してください。

正確な行数を取得する(SELECT COUNT)

-- 正確な行数を取得(大規模テーブルは時間がかかる)
SELECT COUNT(*) FROM EMPLOYEES;

-- 全テーブルの行数を一括取得するスクリプト(DBA用)
BEGIN
    FOR tbl IN (SELECT table_name FROM user_tables ORDER BY table_name) LOOP
        EXECUTE IMMEDIATE
            'SELECT COUNT(*) FROM ' || tbl.table_name
            INTO :cnt;
        DBMS_OUTPUT.PUT_LINE(tbl.table_name || ': ' || :cnt);
    END LOOP;
END;
/

テーブルサイズをMB単位で確認

-- 自分のテーブルのサイズ(MB)一覧
SELECT segment_name                     AS table_name,
       ROUND(bytes / 1024 / 1024, 2)    AS size_mb,
       bytes                            AS size_bytes,
       blocks
FROM   user_segments
WHERE  segment_type = 'TABLE'
ORDER BY bytes DESC;

テーブルの詳細サイズ情報(行数・平均行長・サイズ)を組み合わせ

-- テーブル名・行数・平均行長・実サイズ(MB)を一覧
SELECT t.table_name,
       t.num_rows,
       t.avg_row_len,
       ROUND(s.bytes / 1024 / 1024, 2) AS size_mb,
       t.tablespace_name
FROM   user_tables t
LEFT   JOIN user_segments s
    ON  s.segment_name = t.table_name
    AND s.segment_type = 'TABLE'
ORDER BY s.bytes DESC NULLS LAST;

テーブルの制約を確認する

主キー・外部キー・NOT NULL・ユニーク制約などは USER_CONSTRAINTSUSER_CONS_COLUMNS で確認します。

特定テーブルの制約一覧

-- テーブルの制約情報
SELECT constraint_name,
       constraint_type,
       status,
       r_constraint_name  -- 外部キーの場合、参照先制約名
FROM   user_constraints
WHERE  table_name = 'EMPLOYEES'
ORDER BY constraint_type, constraint_name;
CONSTRAINT_TYPE 制約の種類
P 主キー(PRIMARY KEY)
U ユニーク制約(UNIQUE)
R 外部キー(REFERENCES / FOREIGN KEY)
C CHECK制約(NOT NULL も含む)
V ビューの WITH CHECK OPTION

制約に対応するカラムも含めて確認

-- 制約名とカラム名を結合して表示
SELECT con.constraint_name,
       con.constraint_type,
       col.column_name,
       col.position
FROM   user_constraints  con
JOIN   user_cons_columns col
    ON  col.constraint_name = con.constraint_name
WHERE  con.table_name = 'EMPLOYEES'
ORDER BY con.constraint_type, col.position;

テーブルのインデックスを確認する

テーブルに作成されているインデックスは USER_INDEXESUSER_IND_COLUMNS で確認します。

-- テーブルのインデックス一覧
SELECT index_name,
       index_type,
       uniqueness,
       status,
       partitioned
FROM   user_indexes
WHERE  table_name = 'EMPLOYEES'
ORDER BY index_name;
-- インデックスのカラム構成を確認
SELECT i.index_name,
       i.uniqueness,
       c.column_name,
       c.column_position,
       c.descend
FROM   user_indexes     i
JOIN   user_ind_columns c ON c.index_name = i.index_name
WHERE  i.table_name = 'EMPLOYEES'
ORDER BY i.index_name, c.column_position;

ALL_OBJECTS:テーブル以外のオブジェクトも含めて一覧確認

テーブルだけでなく、ビュー・シノニム・プロシージャ・ファンクションなどすべてのオブジェクトタイプを一覧したい場合は ALL_OBJECTS を使います。

-- テーブル・ビュー・シノニム・プロシージャを一覧
SELECT object_type,
       object_name,
       status,
       created,
       last_ddl_time
FROM   user_objects
WHERE  object_type IN ('TABLE', 'VIEW', 'SYNONYM', 'PROCEDURE', 'FUNCTION')
ORDER BY object_type, object_name;

-- オブジェクトタイプ別の件数集計
SELECT object_type,
       COUNT(*) AS cnt
FROM   user_objects
GROUP BY object_type
ORDER BY cnt DESC;

シノニムからテーブルを逆引きする

-- シノニム名から実体のテーブルを確認
SELECT synonym_name,
       table_owner,
       table_name,
       db_link
FROM   all_synonyms
WHERE  synonym_name = 'EMP'
ORDER BY synonym_name;

ビュー一覧の確認

-- ビューの一覧を確認
SELECT view_name,
       read_only
FROM   user_views
ORDER BY view_name;

-- マテリアライズドビューの一覧
SELECT mview_name,
       refresh_mode,
       refresh_method,
       last_refresh_date
FROM   user_mviews
ORDER BY mview_name;

テーブルの作成日・最終DDL変更日を確認する

-- テーブルの作成日と最終DDL変更日
SELECT object_name  AS table_name,
       created,
       last_ddl_time
FROM   user_objects
WHERE  object_type = 'TABLE'
ORDER BY last_ddl_time DESC;

-- 直近1ヶ月以内に変更されたテーブル
SELECT object_name  AS table_name,
       last_ddl_time
FROM   user_objects
WHERE  object_type  = 'TABLE'
  AND  last_ddl_time >= SYSDATE - 30
ORDER BY last_ddl_time DESC;

未知のデータベースを調査する手順(実践シナリオ)

初めてアクセスするデータベースの全体像をつかむための調査手順をステップで紹介します。

ステップ1:スキーマの全体像を把握する

-- どんなスキーマ(ユーザー)があるか
SELECT owner,
       COUNT(*) AS table_count
FROM   dba_tables
WHERE  owner NOT IN ('SYS','SYSTEM','DBSNMP','OUTLN','MDSYS')
GROUP BY owner
ORDER BY table_count DESC;

ステップ2:テーブル一覧とコメント(論理名)を確認

-- テーブル物理名と論理名を一覧
SELECT t.table_name,
       NVL(tc.comments, '(コメントなし)') AS table_comment,
       t.num_rows
FROM   all_tables      t
LEFT   JOIN all_tab_comments tc
    ON  tc.owner      = t.owner
    AND tc.table_name = t.table_name
WHERE  t.owner = 'ターゲットスキーマ名'
ORDER BY t.table_name;

ステップ3:主要テーブルのカラム構成を確認

-- テーブルのカラム情報(論理名付き)
SELECT c.column_name,
       c.data_type,
       c.data_length,
       c.nullable,
       NVL(cc.comments, '-') AS col_comment
FROM   all_tab_columns  c
LEFT   JOIN all_col_comments cc
    ON  cc.owner       = c.owner
    AND cc.table_name  = c.table_name
    AND cc.column_name = c.column_name
WHERE  c.owner      = 'ターゲットスキーマ名'
  AND  c.table_name = '調査したいテーブル名'
ORDER BY c.column_id;

ステップ4:テーブルの関連(外部キー)を確認

-- 外部キーで繋がっているテーブルを確認
SELECT con.table_name          AS 元テーブル,
       col.column_name         AS 元カラム,
       rcon.table_name         AS 参照先テーブル,
       rcol.column_name        AS 参照先カラム
FROM   user_constraints  con
JOIN   user_cons_columns col  ON col.constraint_name = con.constraint_name
JOIN   user_constraints  rcon ON rcon.constraint_name = con.r_constraint_name
JOIN   user_cons_columns rcol ON rcol.constraint_name = rcon.constraint_name
WHERE  con.constraint_type = 'R'
ORDER BY con.table_name, col.position;

テーブルが見つからないときのトラブルシューティング

ケース1:ORA-00942: 表またはビューが存在しません

-- 原因1: テーブル名の大文字・小文字
-- NG: 小文字で検索
SELECT * FROM user_tables WHERE table_name = 'employees';  -- ヒットしない

-- OK: 大文字で検索
SELECT * FROM user_tables WHERE table_name = 'EMPLOYEES';  -- ヒットする

-- 原因2: 別スキーマのテーブル → ALL_TABLES で検索
SELECT owner, table_name
FROM   all_tables
WHERE  table_name = 'EMPLOYEES';

-- 原因3: シノニムで参照している場合
SELECT synonym_name, table_owner, table_name
FROM   all_synonyms
WHERE  synonym_name = 'EMPLOYEES';

ケース2:USER_TABLESに出ないが実際には参照できる

-- ビューかもしれない
SELECT view_name FROM all_views WHERE view_name = 'テーブル名';

-- マテリアライズドビューかもしれない
SELECT mview_name FROM all_mviews WHERE mview_name = 'テーブル名';

-- オブジェクトタイプを全体で確認
SELECT object_type, owner, object_name
FROM   all_objects
WHERE  object_name = 'テーブル名';

ケース3:DBA_TABLESにあるのにALL_TABLESに出ない

-- 権限がない → 権限付与が必要(DBAが実行)
GRANT SELECT ON スキーマ名.テーブル名 TO 自分のユーザー名;

-- または SELECT_CATALOG_ROLE を付与
GRANT SELECT_CATALOG_ROLE TO 自分のユーザー名;

実務でよく使う便利クエリ一覧

やりたいこと SQL(簡略) ビュー
自分のテーブル一覧 SELECT table_name FROM user_tables USER_TABLES
他スキーマも含む全テーブル SELECT owner,table_name FROM all_tables ALL_TABLES
特定スキーマのテーブル WHERE owner = 'スキーマ名' ALL_TABLES
テーブル名をLIKE検索 WHERE table_name LIKE '%キーワード%' 任意
カラム構造の確認 SELECT ... FROM user_tab_columns WHERE table_name='T' USER_TAB_COLUMNS
テーブルのコメント(論理名) SELECT ... FROM user_tab_comments USER_TAB_COMMENTS
行数・サイズ SELECT num_rows,... FROM user_tables USER_TABLES
テーブルの実サイズ(MB) SELECT ... FROM user_segments WHERE segment_type='TABLE' USER_SEGMENTS
制約一覧 SELECT ... FROM user_constraints WHERE table_name='T' USER_CONSTRAINTS
インデックス一覧 SELECT ... FROM user_indexes WHERE table_name='T' USER_INDEXES
作成日・最終変更日 SELECT ... FROM user_objects WHERE object_type='TABLE' USER_OBJECTS
シノニム逆引き SELECT ... FROM all_synonyms WHERE synonym_name='T' ALL_SYNONYMS

よくある質問

USER_TABLESとALL_TABLESの結果が同じになる場合は?
他のスキーマへのアクセス権限がない場合、ALL_TABLESUSER_TABLES と同じ結果になります。他スキーマのテーブルも一覧したい場合は、DBAに SELECT ANY TABLE 権限か個別のオブジェクト権限を付与してもらう必要があります。
NUM_ROWSがNULLになっているテーブルがある
統計情報がまだ収集されていないテーブルは NUM_ROWSNULL になります。EXEC DBMS_STATS.GATHER_TABLE_STATS('スキーマ名', 'テーブル名') で統計収集すると更新されます。本番環境では定期的な統計収集がパフォーマンスにも影響します。
テーブルがUSER_TABLESに出るのにSELECTできない
USER_TABLES は自分が所有するテーブルなので、通常はSELECTできます。ただし、STATUS = 'UNUSABLE' の場合や、表領域がオフラインの場合にSELECTできないことがあります。SELECT status, tablespace_name FROM user_tables WHERE table_name = 'T' で状態を確認してください。
DBA_TABLESを参照しようとするとORA-00942が出る
DBA権限がない一般ユーザーが DBA_TABLES を参照するとこのエラーになります。DBAに GRANT SELECT_CATALOG_ROLE TO ユーザー名 を依頼するか、ALL_TABLES を使ってください。
テーブル名に記号や日本語は使えるか
Oracle では "テーブル名" のようにダブルクォートで囲むと記号や日本語もテーブル名に使えます(引用符付き識別子)。ただしこの場合、データディクショナリには入力した大文字・小文字のまま保存されます。USER_TABLES で検索する際も同じ大文字・小文字で指定する必要があります。

まとめ

ビュー 範囲 利用シーン 必要権限
USER_TABLES 自分が所有するテーブル 日常の開発・テーブル確認 なし
ALL_TABLES 自分がアクセスできる全テーブル 他スキーマのテーブルも確認したい なし
DBA_TABLES DB内の全テーブル DBA作業・全体把握 DBA権限 or SELECT_CATALOG_ROLE
USER_TAB_COLUMNS カラム構造 カラム定義・型・NOT NULLの確認 なし
USER_TAB_COMMENTS テーブルコメント 論理名(日本語名)の確認 なし
USER_SEGMENTS セグメントサイズ 実際のテーブルサイズをMBで確認 なし
USER_CONSTRAINTS 制約情報 PK・FK・UNIQUE・CHECK なし
USER_INDEXES インデックス情報 インデックスの種類・対象カラム なし
USER_OBJECTS 全オブジェクト 作成日・最終更新日・オブジェクト種別 なし
組み合わせを活用しよう:テーブル一覧の確認は USER_TABLES が基本ですが、「論理名も含めて一覧したい」「カラム数も知りたい」「サイズも把握したい」といった場面ではLEFT JOIN で複数のビューを結合するクエリが実務では最も役立ちます。この記事で紹介したSQLをベースに、自分の環境に合わせてカスタマイズしてください。

あわせて読みたい