#
ドキュメント

Document

自分のための備忘録です。

SQL チートシート

1. FROM → WHERE → GROUPBY → HAVING → SELECT → ORDERBY の実行順序

前提

  • テーブルの結合: ON 句
  • SELECT, UPDATE などの条件の絞り込み: WHERE 句
  • GROUP BY の条件絞り込み: HAVING 句

Ref

実行順番
FROM → WHERE → GROUPBY → HAVING → SELECT → ORDERBY

ref. where句とhaving句の実行順番の違い

group by節はwhere節が評価されたあとに実行されるため、そのためのフィルタ条件をwhere節に追加することはできません。

ref. 初めてのSQL(p143)

「そのためのフィルタ条件」とは GROUP BY の条件。この条件を HAVING 句に指定する。

GROUP BY

GROUP BY句を使用する場合、SELECT句で指定できる要素は下記に限られますので注意が必要です。

・GROUP BY句で指定したカラム名

・集約関数

ref. https://tech.pjin.jp/blog/2021/01/28/%E3%80%90sql%E5%85%A5%E9%96%80%E3%80%91group-by%E5%8F%A5%E3%81%AE%E5%9F%BA%E6%9C%AC%E6%A7%8B%E6%96%87/

  • JOIN のみは INNER JOIN の略です
  • table_a.id は table_b.a_id の外部キーです
  • table_a.id は table_c.a_id の外部キーです
  • table_a.foo, table_b.bar, table_c.baz が存在します
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 になります。

2. テーブル結合時の JOIN を省略

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';

3. サブクエリ

サブクエリは非相関サブクエリと相関サブクエリがあります。
本章は非相関サブクエリについて記載します。

サブクエリの詳細はこちらを参照ください。

  • サブクエリは常にカッコ () で囲まれます

非相関サブクエリと相関サブクエリ

  • 非相関サブクエリは単独で実行でき、含む側の SQL を参照しません
  • 相関サブクエリは、含む側の SQL を参照します

相関サブクエリの特徴として以下があげられます。

非相関サブクエリとは異なり、相関サブクエリは含む側の文よりも先に実行されるのではなく、候補行(最終結果に含まれる可能性のある行)ごとに実行されます(初めての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'