テーブルからデータを抽出 - SELECT
テーブルからデータを取り出す最も基本の句。取り出す列の指定(ワイルドカード/明示列)、エイリアス、計算列の書き方を押さえる
概念図
構文
sql
SELECT [DISTINCT] 列1, 列2, ... FROM テーブルサンプル
明示列指定+計算列+エイリアスの基本形
sql
SELECT id, name, price * 1.1 AS price_with_tax
FROM products;SELECT の役割
SELECT は どの列を結果に含めるかを指定する句です。SQL の問い合わせは概念的には FROM → WHERE → GROUP BY → SELECT → ORDER BY の順に評価され、SELECT は絞り込まれた行から列を射影するステップにあたります。
列を並べるだけでなく、四則演算や関数呼び出し、CASE 式などで計算列を作り出せます。
ワイルドカード * と明示列
SELECT * は全列を返しますが、アプリケーションコードで使うクエリでは明示列指定を推奨します。テーブルに列が追加されたときに結果の形が勝手に変わらないためです。
SELECT *: アドホックな調査・動作確認には便利SELECT col1, col2: 本番コード・ビュー・ストアドで推奨SELECT t.*: JOIN で特定テーブルの全列だけ取り出したいとき
sql
-- 明示列指定の方が将来の列追加に強い
SELECT id, name, email FROM users;エイリアス AS
列や式に別名を付けるには AS を使います。AS は省略可能ですが、可読性のために書くことを推奨します。エイリアスに空白や大文字を含めたい場合は二重引用符(SQL Server は [ ]、MySQL はバッククォート)で囲みます。
sql
SELECT
first_name || ' ' || last_name AS full_name,
DATE_PART('year', AGE(birth_date)) AS age
FROM people;落とし穴: SELECT * の濫用
- 転送量の無駄: 使わない大きなカラム(JSON や BLOB)まで取ってしまう
- インデックスオンリースキャンが使えない: 必要な列だけ選べばインデックスだけで完結できる場合がある
- 列順・列追加に依存するコード:
INSERT ... SELECT *は列定義の変更で壊れる
