【これだけ】SQLの条件指定の方法【現役エンジニアが解説】

PROGRAM

今回は、SQLの条件指定の方法について、レコードとカラムの条件指定に分け、簡単に解説していきます。

レコード(行)の条件指定

まず、レコード(エクセルで言うところの行)を絞り込む条件指定はWHERE句で実現できます。

SELECT user_id FROM users WHERE user_name = '山田太郎';

内部結合であれば、WHERE句の中身をON句の中に移しても同じ結果を得られます。

SELECT p.post_id FROM posts AS p INNER JOIN users u ON p.user_id = u.user_id AND u.user_name = '山田太郎'

一般に、条件指定と言えば、このようにWHERE句やON句を使ったレコードの絞込みを指すことが多いです。

カラム(列)の条件指定

一方で、カラム(エクセルで言うところの列)の条件指定はCASE文を使って実現することができます。

SELECT user_id, user_name, (CASE WHEN user_id <= 10 THEN '10位以内' ELSE '11位以降' END) AS 登録順位 FROM users;

上記のSQL文では、user_idの採番された数値の大小によって、カラムの値を分岐させる条件を指定しています。

CASE文では、WHENの後ろが条件式となり、THENの後ろが条件式の結果が真の場合の値、ELSEの後ろが偽の場合の値となります。

SELECT user_id, user_name, (CASE WHEN user_id <= 5 THEN '5位以内' WHEN user_id <= 10 THEN '10位以内' ELSE '11位以降' END) AS 登録順位 FROM users;

上記のように、単純な二択ではない場合は、WHEN THENで1つのセットとなりますので、もう一つこのセットを増やして、最後に「それ以外」の処理が必要であればELSEを書き足すようにしましょう。

WHERE句とHAVING句の違い

読者の方の中には、条件を指定する句として、WHERE句以外にもHAVING句があることを知っている方も多いと思います。

SELECT user_id FROM users WHERE user_name = '山田太郎';
SELECT user_id FROM users HAVING user_name = '山田太郎';

上記のSQL文は、この場合には、いずれも同じ結果を返すことになります。

違いが出てくるケースは、GROUP BY句を使って特定カラムでグループ化を行っているときです。

WHERE句はグループ化以前に、HAVING句はグループ化後に、それぞれ絞込みを行うため、条件指定の順序に注意する必要があります。

個人的には、ほとんどの場合ではWHERE句やON句の条件指定でどうにかなることが多いため、HAVING句を使う局面はそれらに比べればかなり少ないという印象です。