「このテーブルにはどんなカラムがあったっけ?」
「データ型やNULL制約も一緒に確認したい」
「複数のテーブルのカラム構造を比較したい」
データベース開発やメンテナンス作業において、テーブルの構造を素早く把握することは非常に重要です。
MySQLには、テーブルのカラム情報を確認するための様々な方法があります。
この記事では、MySQLでテーブルのカラム一覧を取得する方法を、基本的なコマンドから応用的な活用法まで、実例を交えながらわかりやすく解説します。
MySQLでカラム情報を確認する重要性

なぜカラム構造の確認が重要なの?
開発効率の向上
- テーブル設計の確認
- SQL文作成時の参考
- データ型の把握によるエラー防止
メンテナンス作業
- 既存システムの調査
- データベース移行の準備
- パフォーマンス改善の検討
チームでの情報共有
- 仕様書がない場合の構造把握
- 新しいメンバーへの説明
- システム改修時の影響範囲調査
基本的なカラム確認方法

DESCRIBE(DESC)コマンド
最も一般的で使いやすいコマンドです。
基本構文
DESCRIBE テーブル名;
-- または短縮形
DESC テーブル名;
実践例:サンプルテーブルでの確認
まず、サンプルテーブルを作成して実際に確認してみましょう。
サンプルテーブルの作成
-- データベースの作成と使用
CREATE DATABASE sample_db;
USE sample_db;
-- ユーザーテーブルの作成
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(255) NOT NULL,
age INT DEFAULT NULL,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- 商品テーブルの作成
CREATE TABLE products (
product_id INT PRIMARY KEY AUTO_INCREMENT,
product_name VARCHAR(100) NOT NULL,
price DECIMAL(10,2) NOT NULL,
stock_quantity INT DEFAULT 0,
category_id INT,
description TEXT,
created_date DATE DEFAULT (CURRENT_DATE)
);
-- 注文テーブルの作成
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
order_date DATETIME DEFAULT CURRENT_TIMESTAMP,
total_amount DECIMAL(12,2) NOT NULL,
status ENUM('pending', 'processing', 'shipped', 'delivered', 'cancelled') DEFAULT 'pending',
FOREIGN KEY (user_id) REFERENCES users(id)
);
DESCRIBE コマンドの実行
ユーザーテーブルの構造確認
DESCRIBE users;
実行結果
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
id | int | NO | PRI | NULL | auto_increment |
username | varchar(50) | NO | UNI | NULL | |
varchar(255) | NO | NULL | |||
age | int | YES | NULL | ||
is_active | tinyint(1) | YES | 1 | ||
created_at | timestamp | YES | CURRENT_TIMESTAMP | DEFAULT_GENERATED | |
updated_at | timestamp | YES | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
結果の見方
- Field:カラム名
- Type:データ型(int、varchar、timestampなど)
- Null:NULL値を許可するか(YES/NO)
- Key:インデックスの種類(PRI=主キー、UNI=ユニーク、MUL=複合インデックス)
- Default:デフォルト値
- Extra:追加情報(auto_increment、on update など)
商品テーブルの構造確認
DESCRIBE products;
実行結果
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
product_id | int | NO | PRI | NULL | auto_increment |
product_name | varchar(100) | NO | NULL | ||
price | decimal(10,2) | NO | NULL | ||
stock_quantity | int | YES | 0 | ||
category_id | int | YES | NULL | ||
description | text | YES | NULL | ||
created_date | date | YES | (curdate()) | DEFAULT_GENERATED |
SHOW COLUMNS FROM コマンド
DESCRIBEと同じ結果を得られる、より標準的なSQLコマンドです。
基本構文
SHOW COLUMNS FROM テーブル名;
実行例
SHOW COLUMNS FROM orders;
実行結果
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
order_id | int | NO | PRI | NULL | auto_increment |
user_id | int | NO | MUL | NULL | |
order_date | datetime | YES | CURRENT_TIMESTAMP | DEFAULT_GENERATED | |
total_amount | decimal(12,2) | NO | NULL | ||
status | enum(‘pending’,’processing’,’shipped’,’delivered’,’cancelled’) | YES | pending |
条件を指定したカラム情報取得
特定のパターンにマッチするカラムのみ表示
-- 'date'を含むカラムのみ表示
SHOW COLUMNS FROM orders LIKE '%date%';
-- 特定のカラムのみ表示
SHOW COLUMNS FROM users LIKE 'created_at';
information_schema.columns を使った詳細検索

より柔軟で詳細な情報を取得したい場合は、information_schemaデータベースのcolumnsテーブルを使用します。
基本的な使用方法
単一テーブルのカラム情報取得
SELECT
column_name AS カラム名,
data_type AS データ型,
is_nullable AS NULL許可,
column_default AS デフォルト値,
character_maximum_length AS 最大文字数,
numeric_precision AS 数値精度,
numeric_scale AS 小数点桁数
FROM information_schema.columns
WHERE table_schema = 'sample_db'
AND table_name = 'users'
ORDER BY ordinal_position;
実行結果
カラム名 | データ型 | NULL許可 | デフォルト値 | 最大文字数 | 数値精度 | 小数点桁数 |
---|---|---|---|---|---|---|
id | int | NO | NULL | NULL | 10 | 0 |
username | varchar | NO | NULL | 50 | NULL | NULL |
varchar | NO | NULL | 255 | NULL | NULL | |
age | int | YES | NULL | NULL | 10 | 0 |
is_active | tinyint | YES | 1 | NULL | 3 | 0 |
created_at | timestamp | YES | CURRENT_TIMESTAMP | NULL | NULL | NULL |
updated_at | timestamp | YES | CURRENT_TIMESTAMP | NULL | NULL | NULL |
複数テーブルのカラム構造比較
データベース内の全テーブルのカラム一覧
SELECT
table_name AS テーブル名,
column_name AS カラム名,
data_type AS データ型,
is_nullable AS NULL許可,
column_key AS キー情報,
column_default AS デフォルト値
FROM information_schema.columns
WHERE table_schema = 'sample_db'
ORDER BY table_name, ordinal_position;
特定の条件に合うカラムの検索
-- すべてのテーブルからVARCHAR型のカラムを検索
SELECT
table_name AS テーブル名,
column_name AS カラム名,
character_maximum_length AS 最大文字数
FROM information_schema.columns
WHERE table_schema = 'sample_db'
AND data_type = 'varchar'
ORDER BY table_name, character_maximum_length DESC;
-- NULL不許可のカラムを検索
SELECT
table_name AS テーブル名,
column_name AS カラム名,
data_type AS データ型
FROM information_schema.columns
WHERE table_schema = 'sample_db'
AND is_nullable = 'NO'
ORDER BY table_name, ordinal_position;
-- 主キーカラムの一覧
SELECT
table_name AS テーブル名,
column_name AS カラム名,
data_type AS データ型
FROM information_schema.columns
WHERE table_schema = 'sample_db'
AND column_key = 'PRI'
ORDER BY table_name;
実践的な活用パターン
パターン1:データベース全体の構造把握
全テーブルの基本情報一覧
SELECT
table_name AS テーブル名,
COUNT(*) AS カラム数,
SUM(CASE WHEN column_key = 'PRI' THEN 1 ELSE 0 END) AS 主キー数,
SUM(CASE WHEN is_nullable = 'NO' THEN 1 ELSE 0 END) AS 必須カラム数,
SUM(CASE WHEN column_default IS NOT NULL THEN 1 ELSE 0 END) AS デフォルト値設定数
FROM information_schema.columns
WHERE table_schema = 'sample_db'
GROUP BY table_name
ORDER BY table_name;
パターン2:データ型別の統計情報
データ型別カラム数の集計
SELECT
data_type AS データ型,
COUNT(*) AS カラム数,
GROUP_CONCAT(DISTINCT table_name) AS 使用テーブル
FROM information_schema.columns
WHERE table_schema = 'sample_db'
GROUP BY data_type
ORDER BY COUNT(*) DESC;
パターン3:外部キー情報との組み合わせ
外部キー制約があるカラムの特定
SELECT
c.table_name AS テーブル名,
c.column_name AS カラム名,
c.data_type AS データ型,
kcu.referenced_table_name AS 参照先テーブル,
kcu.referenced_column_name AS 参照先カラム
FROM information_schema.columns c
LEFT JOIN information_schema.key_column_usage kcu
ON c.table_schema = kcu.table_schema
AND c.table_name = kcu.table_name
AND c.column_name = kcu.column_name
AND kcu.referenced_table_name IS NOT NULL
WHERE c.table_schema = 'sample_db'
ORDER BY c.table_name, c.ordinal_position;
パターン4:インデックス情報の確認
インデックスが設定されているカラムの確認
SELECT
table_name AS テーブル名,
column_name AS カラム名,
index_name AS インデックス名,
CASE
WHEN non_unique = 0 THEN 'UNIQUE'
ELSE 'INDEX'
END AS インデックス種別
FROM information_schema.statistics
WHERE table_schema = 'sample_db'
ORDER BY table_name, index_name, seq_in_index;
カラム情報を使ったメンテナンス作業

データ型変更の影響調査
VARCHAR型カラムの長さ調査
-- 現在のVARCHAR型カラムの設定確認
SELECT
table_name AS テーブル名,
column_name AS カラム名,
character_maximum_length AS 現在の最大長,
CASE
WHEN character_maximum_length < 50 THEN '短い'
WHEN character_maximum_length < 255 THEN '標準'
ELSE '長い'
END AS 長さ分類
FROM information_schema.columns
WHERE table_schema = 'sample_db'
AND data_type = 'varchar'
ORDER BY character_maximum_length;
NULL制約の見直し
NULL値を許可しているカラムで実際にNULLが入っているかチェック
-- この例では、動的SQLを生成してNULL値の存在をチェック
SELECT
CONCAT(
'SELECT ''', table_name, '.', column_name, ''' AS column_info, ',
'COUNT(*) AS total_rows, ',
'SUM(CASE WHEN ', column_name, ' IS NULL THEN 1 ELSE 0 END) AS null_count ',
'FROM ', table_name, ';'
) AS check_sql
FROM information_schema.columns
WHERE table_schema = 'sample_db'
AND is_nullable = 'YES'
AND table_name IN ('users', 'products', 'orders')
ORDER BY table_name, column_name;
テーブル設計の妥当性チェック
命名規則の確認
-- カラム名に使用されている命名パターンの分析
SELECT
table_name AS テーブル名,
column_name AS カラム名,
CASE
WHEN column_name LIKE '%_id' THEN 'ID系'
WHEN column_name LIKE '%_at' THEN 'タイムスタンプ系'
WHEN column_name LIKE '%_date' THEN '日付系'
WHEN column_name LIKE 'is_%' THEN 'フラグ系'
ELSE 'その他'
END AS 命名パターン
FROM information_schema.columns
WHERE table_schema = 'sample_db'
ORDER BY 命名パターン, table_name, column_name;
GUIツールでの確認方法
phpMyAdmin での確認
基本的な操作手順
- データベースを選択
- 対象テーブルをクリック
- 「構造」タブを選択
- カラム一覧が表形式で表示される
phpMyAdminの利点
- 視覚的にわかりやすい
- カラムの追加・編集が簡単
- インデックス情報も同時に確認可能
MySQL Workbench での確認
基本的な操作手順
- データベース接続を開く
- 左側の「Schemas」パネルでデータベースを展開
- 「Tables」を展開してテーブルを選択
- 右クリックで「Table Inspector」を選択
MySQL Workbenchの利点
- ER図での視覚的な関係確認
- 詳細なテーブル統計情報
- クエリエディタとの連携
コマンドライン環境での効率的な確認
複数テーブルを一度に確認するスクリプト例
#!/bin/bash
# テーブル構造一覧出力スクリプト
DB_NAME="sample_db"
MYSQL_USER="root"
MYSQL_PASSWORD="your_password"
echo "=== データベース ${DB_NAME} のテーブル構造一覧 ==="
# すべてのテーブル名を取得
TABLES=$(mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} -D${DB_NAME} -e "SHOW TABLES;" -s)
for table in $TABLES; do
echo ""
echo "--- ${table} テーブル ---"
mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} -D${DB_NAME} -e "DESCRIBE ${table};"
done
パフォーマンスに関する考慮事項
information_schema.columns の使用時の注意
大規模データベースでの注意点
- information_schemaへのクエリは若干重い場合がある
- 必要な情報のみを取得するよう条件を絞る
- 頻繁に実行する場合は結果をキャッシュする
効率的なクエリの書き方
-- 良い例:必要な情報のみを取得
SELECT column_name, data_type, is_nullable
FROM information_schema.columns
WHERE table_schema = 'sample_db'
AND table_name = 'users';
-- 避けるべき例:不要な情報も取得
SELECT *
FROM information_schema.columns
WHERE table_schema = 'sample_db';
トラブルシューティング

よくあるエラーと解決方法
「Table doesn’t exist」エラー
-- 問題:テーブル名の確認
SHOW TABLES LIKE 'user%';
-- データベースの確認
SELECT DATABASE();
-- 正しいデータベースの選択
USE correct_database_name;
権限不足エラー
-- 現在のユーザー権限確認
SHOW GRANTS FOR CURRENT_USER();
-- information_schemaへのアクセス権限確認
SELECT * FROM information_schema.schemata;
まとめ
MySQLでテーブルのカラム一覧を取得する方法は、用途や状況に応じて使い分けることが重要です。
この記事のポイント
基本的な方法の理解
- DESCRIBE/DESC:最も簡単で日常的に使用
- SHOW COLUMNS FROM:標準SQL準拠で互換性が高い
- information_schema.columns:詳細な情報と柔軟な検索が可能
実践的な活用法
- 複数テーブルの構造比較
- データ型や制約の統計分析
- 外部キーやインデックス情報との組み合わせ
- メンテナンス作業での活用
効率的な作業のコツ
- 目的に応じた方法の選択
- 条件を絞った効率的なクエリ
- GUIツールとの使い分け
- スクリプト化による自動化
注意すべきポイント
- 大規模データベースでのパフォーマンス
- 権限設定の確認
- 正確なデータベース・テーブル名の指定
コメント