じゃあ今までやったことを全部まとめて、SELECT、WHERE、ORDER BYを組み合わせてシンプルだけど便利なクエリを作る方法を覚えよう!このスキルは、ユーザーリストを取得したり、ちょっとしたレポートを作ったり、いろんな場面で役立つよ。
始める前に、シンプルなSQLクエリの構造をもう一度おさらいしよう:
SELECT カラム1, カラム2, カラム3
FROM テーブル
WHERE 条件
ORDER BY カラム ASC
LIMIT 行数
OFFSET 行数;
もしSQLが小説だったら、SELECTは章のタイトル、FROMはその内容、WHEREはストーリーの説明って感じ。で、ORDER BYは順番をつけて、もっと読みやすくしてくれるんだ!
演算子の順番は絶対に決まってるよ。 いくつか省略するのはOKだけど、順番を変えるのはダメ。
例1: 成績が優秀な学生の名前を選ぶ
例えば、こんな構造とデータを持つstudentsテーブルがあるとしよう:
| id | name | age | grade |
|---|---|---|---|
| 1 | Otto | 21 | A |
| 2 | Maria | 22 | B |
| 3 | Alex | 20 | A |
| 4 | Nat | 23 | C |
| 5 | Dan | 25 | B |
成績が優秀(つまりgrade = 'A')な学生全員のリストを、名前順で取得したいときはこうやる:
SELECT name
FROM students
WHERE grade = 'A'
ORDER BY name ASC;
結果:
| name |
|---|
| Alex |
| Otto |
解説:
SELECT name— 名前だけを選ぶ。いらないデータを取ってくるのは無駄だしね。WHERE grade = 'A'— 成績が優秀な人だけフィルタする。ORDER BY name ASC— 学生の名前をアルファベット順に並べる。
例2: 価格で商品を探す
今度は、productsテーブルに商品情報が入ってるとしよう:
| id | product_name | category | price |
|---|---|---|---|
| 1 | スマートフォン | Electronics | 30000 |
| 2 | テレビ | Electronics | 45000 |
| 3 | 冷蔵庫 | Appliances | 50000 |
| 4 | 掃除機 | Appliances | 15000 |
| 5 | 電球 | Lighting | 500 |
「Electronics」カテゴリの商品だけを、価格が高い順に並べてリストアップしたい場合はこう:
SELECT product_name, price
FROM products
WHERE category = 'Electronics'
ORDER BY price DESC;
結果:
| product_name | price |
|---|---|
| テレビ | 45000 |
| スマートフォン | 30000 |
解説:
SELECT product_name, price— 商品名と価格を選ぶ。WHERE category = 'Electronics'— 「Electronics」カテゴリの商品だけフィルタする。ORDER BY price DESC— 価格が高い順(高いものが最初)で並べる。
例3: 複雑なフィルターとロジック
さっきと同じstudentsテーブルを使うよ。今度は、21歳より上で、成績がBかCの学生を年齢順で探したい。複数の条件を組み合わせる場合はこう:
SELECT name, age, grade
FROM students
WHERE age > 21 AND (grade = 'B' OR grade = 'C')
ORDER BY age ASC;
結果:
| name | age | grade |
|---|---|---|
| Maria | 22 | B |
| Nat | 23 | C |
| Dan | 25 | B |
解説:
WHERE age > 21— 21歳より上の学生だけ選ぶ。AND (grade = 'B' OR grade = 'C')— 成績がBかCの人だけフィルタ。カッコは条件をまとめるために使うよ。ORDER BY age ASC— 年齢が若い順に並べる。
例4: ソートとフィルタの組み合わせ
またproductsテーブルに戻るよ。今度は、価格が50,000未満の商品をカテゴリ順に並べて、さらにカテゴリごとに価格が安い順にしたい。
SELECT product_name, category, price
FROM products
WHERE price < 50000
ORDER BY category ASC, price ASC;
結果:
| product_name | category | price |
|---|---|---|
| 掃除機 | Appliances | 15000 |
| スマートフォン | Electronics | 30000 |
| テレビ | Electronics | 45000 |
| 電球 | Lighting | 500 |
解説:
WHERE price < 50000— まず価格が50,000未満の商品だけフィルタする。ORDER BY category ASC, price ASC— カテゴリ順(アルファベット順)で並べて、さらにカテゴリ内で価格が安い順に並べる。
例5: よくあるミス — 条件の抜け
今度は、どんなミスが起きるか見てみよう。論理演算子を使うときに条件をまとめるのを忘れたらどうなる?
間違ったクエリ:
SELECT name, age, grade
FROM students
WHERE age > 21 AND grade = 'B' OR grade = 'C'
ORDER BY age ASC;
ここではOR grade = 'C'がAND age > 21を無視して実行されるから、21歳以下でも成績がCの人が全部出てきちゃう。
だから、いつもカッコを使って分かりやすくしよう:
WHERE age > 21 AND (grade = 'B' OR grade = 'C')
GO TO FULL VERSION