SELECT文は、表から必要な列を選び、条件に合う行を取り出すSQLです。この章では、取得する列・絞り込む行・表示順を分けて考え、DISTINCTとJOINまで確認します。例は学習用の架空データです。
同じ商品表で結果を追う
| product_id | name | category | price |
|---|---|---|---|
| 1 | ノート | 文具 | 200 |
| 2 | ペン | 文具 | 100 |
| 3 | マグ | 雑貨 | 500 |
| 4 | ケース | 雑貨 | NULL |
product_idは主キー、priceはNULLを許す数値列とします。SELECT * は全列、SELECT name, price は指定した2列を返します。
SELECT name, price
FROM products
WHERE price >= 200
ORDER BY price DESC, product_id ASC;
結果は「マグ・500」「ノート・200」の順です。WHEREで行を絞り、SELECTで必要な列を選び、ORDER BYで順序を指定します。priceがNULLの行は、この比較では条件が真にならないため残りません。
WHEREの条件を使い分ける
| 書き方 | 意味 |
|---|---|
category = '文具' | 文字列は単一引用符で囲む |
price BETWEEN 100 AND 200 | 両端を含む範囲 |
category IN ('文具', '雑貨') | 列挙した値のいずれかに一致 |
name LIKE 'ノ%' | 「ノ」で始まる文字列。%は任意の長さ、_は1文字 |
price IS NULL | 値がNULLかを調べる |
NULLは「0」や空文字と同じではありません。= NULLではなくIS NULLを使います。ANDはORより先に結び付くため、条件をまとめたい部分には括弧を付けましょう。文字列比較やLIKEの大文字・小文字の扱いはDBMSと照合順序にも依存します。
ORDER BYと件数制限の注意
ASCは昇順、DESCは降順です。ORDER BYがなければ結果の順序は保証されません。同じ価格の行も一定の順にしたいときは、主キーなどを追加の並べ替え条件にします。NULLが先か後かという既定値はDBMSにより異なります。
LIMITはPostgreSQLやMySQLなどで使う件数制限の構文です。他製品ではFETCH FIRSTやTOPなどを使う場合があります。LIMIT 10だけでは「価格上位10件」にはならず、目的のORDER BYも必要です。識別子の引用方法にも製品差があります。
集計問い合わせではORDER BY SUM(amount) DESCのように集計式で並べ替えることもできます。「ORDER BYに集計関数は使えない」とは覚えないでください。
DISTINCTは選んだ列の組で重複を除く
SELECT DISTINCT category
FROM products;
この例では文具・雑貨の2種類になります。DISTINCT category, priceなら、カテゴリーと価格の組合せで重複を判断します。NULL同士も重複除去では同じものとして扱います。COUNT(DISTINCT price)は、NULLを除いた異なる価格の数を数える点に注意します。
JOINは結合条件に合う行を組み合わせる
SELECT p.name, c.category_name
FROM products p
INNER JOIN categories c
ON p.category_id = c.category_id;
この例は、productsにcategory_id列、categoriesにcategory_idとcategory_name列がある別の設計を想定しています。INNER JOINは一致する組、LEFT JOINは左側に対応先がない行も残します。右側に複数の一致行があれば結果は増えます。
カンマで表を列挙しWHEREで内部結合条件を書く形式も有効です。JOIN … ONは結合と絞り込みを読み分けやすくしますが、記法だけで速度の優劣は決まりません。外部結合ではONとWHEREに置く条件の違いにも注意します。
確認問題
priceがNULLの行を検索するとき、WHERE price = NULLでよいでしょうか?
解答・解説を見る
いいえ。WHERE price IS NULLを使います。通常の等号比較ではNULLを含む比較が真になりません。
SQLをnoteの例題で復習する
基礎を確認したら、無料noteのSELECT・JOIN・GROUP BY・サブクエリの解説で、条件の読み取りとSQLの組み立てを復習できます。
資格・目的別のnote教材ナビから、ほかの分野も選べます。
参考資料
PostgreSQL:FROM・WHERE・GROUP BY・HAVING / ORDER BY / 副問い合わせの条件式
コメント