実行順番
FROM → WHERE → GROUPBY → HAVING → SELECT → ORDERBY
group by節はwhere節が評価されたあとに実行されるため、そのためのフィルタ条件をwhere節に追加することはできません。
ref. 初めてのSQL(p143)
「そのためのフィルタ条件」とは GROUP BY の条件。この条件を HAVING 句に指定する。
GROUP BY句を使用する場合、SELECT句で指定できる要素は下記に限られますので注意が必要です。
・GROUP BY句で指定したカラム名
・集約関数
SELECT
a.id
FROM table_a a ; JOIN は INNNER JOIN
JOIN table_b b ; 結合条件は ON 句
ON a.id = b.a_id
JOIN table_c c
ON a.id = c.a_id
WHERE a.foo = 'foo' ; WHERE 句 は GROUP BY の前に適用
AND b.bar = 'bar'
AND c.baz = 'baz'
GROUP BY a.id
HAVING a.id > 1000 ; HAVING は GROUP BY に適用
ORDER BY a.id DESC ; ORDER BY は最後に適用
※ MySQL は HAVING 句の後に WHERE 句を置くと syntax error になります。
INNER JOIN は JOIN 句を省略して以下のように記載できます。
(個人的には JOIN 句を省略せず、結合条件を ON 句で指定するようにしています。)
; JOIN を明示する方法 推奨の方法
SELECT a.id, b.bar FROM table_a a
JOIN table_b b ON a.id = b.a_id
WHERE b.bar = 'bar';
; JOIN を省略する方法
SELECT a.id, b.bar FROM table_a a, table_b b
WHERE a.id = b.a_id
AND b.bar = 'bar';
サブクエリは非相関サブクエリと相関サブクエリがあります。
本章は非相関サブクエリについて記載します。
サブクエリの詳細はこちらを参照ください。
()
で囲まれます相関サブクエリの特徴として以下があげられます。
非相関サブクエリとは異なり、相関サブクエリは含む側の文よりも先に実行されるのではなく、候補行(最終結果に含まれる可能性のある行)ごとに実行されます(初めてのSQL(p167))
著者注 ただし、候補行に対する個別の実行は、サブクエリを含む側の文より先に実行されることに変わりはありません。
SELECT
a.id,
b.bar
FROM table_a a
WHERE a.id in (
; 非相関サブクエリ
SELECT b.a_id FROM table_b b
WHERE b.bar = 'bar'
);
上記は JOIN を使用して以下のようにも記載できます。
SELECT
a.id,
b.bar
FROM table_a a
JOIN table_b b ON a.id = b.a_id
WHERE b.bar = 'bar'