「このテーブルにはどんなカラムがあるの?」
「データ型やNULL制約は?」
──SQLでデータベースを操作する際、こうした情報を確認したくなることは多々あります。
そんなときに役立つのがDESCRIBE
文です。
この記事では、DESCRIBEの基本的な使い方と表示される内容、注意点、他の確認方法との違いをわかりやすく解説します。
DESCRIBE文って何?

DESCRIBEの役割
DESCRIBE
(または DESC
)は、テーブルの構造(列名、データ型、NULL制約、キー情報など)を確認するためのSQL文です。
テーブルの「設計図」を見るようなものですね。
基本的な書き方
DESCRIBE テーブル名;
または、短縮形で:
DESC テーブル名;
どちらも同じ意味です。DESC
の方が短くて便利なので、よく使われます。
実際の使用例
-- usersテーブルの構造を確認
DESCRIBE users;
-- 短縮形での書き方
DESC products;
-- 別のデータベースのテーブルを確認
DESC mystore.customers;
どんなときに使うの?
新しいプロジェクトに参加したとき
- 既存のテーブル構造を把握したい
データを挿入する前
- どんな列があるか、データ型は何かを確認したい
エラーが出たとき
- 列名やデータ型が間違っていないかチェックしたい
システム設計のとき
- 他のテーブルとの関係を理解したい
DESCRIBEの出力内容を理解しよう
表示される項目
DESCRIBEを実行すると、以下のような情報が表形式で表示されます:
カラム名 | 意味 | 例 |
---|---|---|
Field | 列名(カラム名) | id, name, email |
Type | データ型 | int(11), varchar(255), datetime |
Null | NULL許可か | YES(許可)/ NO(不許可) |
Key | インデックス情報 | PRI(主キー), UNI(ユニーク), MUL(通常インデックス) |
Default | デフォルト値 | NULL, 0, ‘active’ |
Extra | 追加情報 | auto_increment, on update CURRENT_TIMESTAMP |
実際の出力例
テーブル作成
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE,
age INT DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
DESCRIBE実行
DESC users;
出力結果
+------------+--------------+------+-----+-------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+-------------------+-------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(100) | NO | | NULL | |
| email | varchar(255) | YES | UNI | NULL | |
| age | int(11) | YES | | 0 | |
| created_at | datetime | YES | | CURRENT_TIMESTAMP | |
| updated_at | datetime | YES | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+------------+--------------+------+-----+-------------------+-------+
各項目の詳しい説明
Field(列名)
- テーブル内のカラム名が表示されます
- INSERT文やSELECT文で使用する名前です
Type(データ型)
int(11)
:整数型(表示幅11桁)varchar(255)
:可変長文字列(最大255文字)datetime
:日時型text
:長いテキストdecimal(10,2)
:小数点数(全体10桁、小数点以下2桁)
Null(NULL許可)
YES
:NULL値を入れることができるNO
:NULL値は入れられない(NOT NULL制約)
Key(キー情報)
PRI
:主キー(Primary Key)UNI
:ユニークキー(重複不可)MUL
:通常のインデックス(重複可)- 空欄:インデックスなし
Default(デフォルト値)
- 値を指定しなかった場合に自動で入る値
NULL
:デフォルト値なし0
:数値の0が入るCURRENT_TIMESTAMP
:現在日時が入る
Extra(追加情報)
auto_increment
:自動で連番が振られるon update CURRENT_TIMESTAMP
:更新時に現在日時が入る
データベース別の対応状況
対応しているデータベース
MySQL
DESC users;
-- または
DESCRIBE users;
MariaDB
DESC users;
-- または
DESCRIBE users;
対応していないデータベース
残念ながら、すべてのデータベースでDESCRIBEが使えるわけではありません。
PostgreSQL DESCRIBEは使えませんが、同様の情報を得る方法があります:
-- 方法1:\d コマンド(psqlコマンドライン)
\d users
-- 方法2:information_schemaを使用
SELECT
column_name,
data_type,
is_nullable,
column_default
FROM information_schema.columns
WHERE table_name = 'users'
ORDER BY ordinal_position;
SQLite
-- PRAGMA文を使用
PRAGMA table_info(users);
SQL Server
-- sp_help ストアドプロシージャを使用
sp_help users;
-- または information_schema を使用
SELECT
COLUMN_NAME,
DATA_TYPE,
IS_NULLABLE,
COLUMN_DEFAULT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'users';
Oracle
-- SQL*Plusでは使える
DESC users;
-- または user_tab_columns を使用
SELECT
column_name,
data_type,
nullable,
data_default
FROM user_tab_columns
WHERE table_name = 'USERS'
ORDER BY column_id;
より詳しい情報を確認する方法

DESCRIBEだけでは分からない情報もあります。そんなときは、以下の方法を使いましょう。
インデックスの詳細情報
-- インデックスの詳細を確認
SHOW INDEX FROM users;
出力例
+-------+------------+----------+--------------+-------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name |
+-------+------------+----------+--------------+-------------+
| users | 0 | PRIMARY | 1 | id |
| users | 0 | email | 1 | email |
+-------+------------+----------+--------------+-------------+
外部キー制約の確認
-- 外部キー制約を確認
SELECT
CONSTRAINT_NAME,
COLUMN_NAME,
REFERENCED_TABLE_NAME,
REFERENCED_COLUMN_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_NAME = 'orders'
AND REFERENCED_TABLE_NAME IS NOT NULL;
テーブル作成文の確認
-- テーブルの作成文を確認
SHOW CREATE TABLE users;
この方法なら、制約やインデックスも含めた完全な定義が分かります。
全カラムの詳細情報
-- より詳しいカラム情報
SELECT
COLUMN_NAME as 'カラム名',
DATA_TYPE as 'データ型',
IS_NULLABLE as 'NULL許可',
COLUMN_DEFAULT as 'デフォルト値',
COLUMN_COMMENT as 'コメント'
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'データベース名'
AND TABLE_NAME = 'users'
ORDER BY ORDINAL_POSITION;
実際の業務での活用例
新しいプロジェクトでの構造把握
-- 主要テーブルの構造を確認
DESC users;
DESC products;
DESC orders;
DESC order_items;
-- テーブル一覧も確認
SHOW TABLES;
データ投入前の確認
-- 投入予定のテーブル構造を確認
DESC import_data;
-- 必須項目(NOT NULL)をチェック
SELECT COLUMN_NAME
FROM information_schema.COLUMNS
WHERE TABLE_NAME = 'import_data'
AND IS_NULLABLE = 'NO';
エラー解決のためのチェック
-- エラーが出た場合のカラム確認
DESC problematic_table;
-- 特定のカラムの詳細を確認
SELECT
COLUMN_NAME,
DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH,
NUMERIC_PRECISION
FROM information_schema.COLUMNS
WHERE TABLE_NAME = 'problematic_table'
AND COLUMN_NAME = 'error_column';
システム設計時の関係確認
-- 複数テーブルの関係を把握
DESC customers;
DESC orders;
DESC products;
-- 外部キーの関係も確認
SELECT
TABLE_NAME,
COLUMN_NAME,
REFERENCED_TABLE_NAME,
REFERENCED_COLUMN_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_NAME IS NOT NULL
AND TABLE_SCHEMA = 'your_database';
注意点とベストプラクティス

DESCRIBEの制限事項
1. ビューには制限がある
-- ビューにも使えるが、表示される情報が限定的
DESC user_summary_view;
2. 外部キー情報は表示されない
-- 外部キーの詳細は別途確認が必要
SHOW CREATE TABLE orders;
3. インデックスの詳細は分からない
-- インデックスの詳細は別コマンドで
SHOW INDEX FROM users;
4. 権限によっては実行できない
-- テーブルへのアクセス権限が必要
-- 権限がない場合はエラーになる
効率的な使い方
複数テーブルを一度に確認
-- スクリプト化して効率化
DESC table1;
DESC table2;
DESC table3;
結果をファイルに保存
# コマンドラインから実行
mysql -u user -p database -e "DESC users" > table_structure.txt
GUIツールとの使い分け
- DESCRIBE:スクリプト化、自動化に適している
- GUIツール:視覚的に分かりやすい、関係図も見える
よくあるトラブルと解決法
テーブルが見つからない
エラー例
Table 'database.users' doesn't exist
解決方法
-- 現在のデータベースを確認
SELECT DATABASE();
-- テーブル一覧を確認
SHOW TABLES;
-- 正しいデータベースに切り替え
USE correct_database;
DESC users;
権限不足
エラー例
Access denied for user 'username'@'host' to database 'database'
解決方法
- データベース管理者に権限を依頼
- 適切なユーザーでログインし直す
文字化け
問題 日本語のカラムコメントが文字化けする
解決方法
-- 文字セットを確認
SHOW VARIABLES LIKE 'character_set%';
-- 必要に応じて文字セットを変更
SET NAMES utf8mb4;
DESCRIBEと他のコマンドの使い分け
目的別の使い分け
基本的な構造確認
DESC table_name; -- 最も簡単
完全な定義確認
SHOW CREATE TABLE table_name; -- 最も詳細
特定の情報だけ確認
-- カラム名だけ知りたい場合
SELECT COLUMN_NAME
FROM information_schema.COLUMNS
WHERE TABLE_NAME = 'table_name';
複数テーブルの一括確認
-- information_schemaで一括取得
SELECT
TABLE_NAME,
COLUMN_NAME,
DATA_TYPE
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'your_database'
ORDER BY TABLE_NAME, ORDINAL_POSITION;
まとめ
DESCRIBE
は、SQLでテーブルの構造を確認する際に最も手軽でわかりやすいコマンドの一つです。
MySQLやMariaDBにおいて、テーブルの定義をすばやくチェックする際に非常に便利です。
重要なポイント
- DESCRIBE(またはDESC):テーブル構造の基本情報を表示
- MySQL/MariaDBで使用可能
- PostgreSQL/SQLiteでは代替方法を使用
- 制限事項:外部キーやインデックス詳細は別途確認が必要
使い方のコツ
- 新しいテーブルを扱う前に必ず構造を確認
- エラーが出たときの原因調査に活用
- 複雑な情報はSHOW CREATE TABLEと併用
- データベースによって代替方法を使い分ける
よく使う場面
- プロジェクト参加時の既存テーブル把握
- データ投入前の構造確認
- エラー解決のための調査
- システム設計時の関係把握
コメント