SQLを利用するにあたって切っても切れない関係にあるのがWHERE句です。
データベースから特定の条件でデータを取得するために使う非常に重要な構文ですが、初心者がよく躓くポインドでもあります。
この記事では、WHERE句の基本的な使い方から、よくあるエラーとその解決策を解説します。
エラーを解消し、効率的にデータを操作できるようになりましょう。
WHERE句とは?
WHERE句は、SQL文で条件を指定してデータを絞り込むために使用します。
SELECT文やUPDATE文、DELETE文などに指定され、処理対象となる行を絞り込むことができます。
一般化した書き方と具体例を用いて確認しましょう。
SELECT 項目1, 項目2
FROM テーブル名
WHERE 条件;
具体例として従業員の年齢が30歳以上いるデータを取得する場合を考えてみましょう。
SELECT *
FROM employees
WHERE age >= 30;
※SELECT *
ですべてのデータを取得することが出来ます。
次に初心者が陥りやすいWHERE句での誤った使い方とその解決策を確認してみましょう。
WHERE句でよくあるエラーと解決策
1.数値型のカラムに文字列を指定するミス
よくあるミスですが、数値型にも関わらず文字列の値を指定するデータの不一致が原因でこのエラーが起きます。
SELECT 項目1, 項目2
FROM テーブル名
WHERE age = "30"; '←ダブルクオーテーションで文字列として扱ってしまっている'
解決策として数値型のカラムにはダブルク、シングルのクオーテーションの使用は避けるようにしましょう。
2.NULL値を扱うミス
NULLは「変数やデータが何も含まれていない状態」のことを表します。
それを踏まえてエラー例のような使い方をしていないか確認してみましょう。
SELECT *
FROM employees
WHERE department = NULL;
SQLでは、=
でNULLを比較することが出来ません。
そのためNULL値と比較する場合は、IS NULL
もしくはIS NOT NULL
を使用します。
SELECT *
FROM employees
WHERE department IS NULL;
3.ANDとORの条件を混ぜたミス
データの絞り込む条件が複数ある場合、AND
やOR
があるのはご存じだと思います。
しかし、このAND
やOR
には算数でいう加減乗除のようにルールがあるので、理解していないとほしいデータを取得できない可能性があります。
優先順位は結論こうです。
NOT>AND>OR
二つのSQLを見てみましょう。
SELECT *
FROM employees
WHERE age > 30 OR position = 'Manager' AND department = 'Sales';
SELECT *
FROM employees
WHERE (age > 30 OR position = 'Manager') AND department = 'Sales';
優先順位の考え方により例①と例②で取得するデータが違うことが分かりますか?
例②のように優先順位を明確にするために、条件を括弧でグループ化しましょう。
4.ワイルドカード(LIKE)の使い方ミス
SELECT *
FROM employees
WHERE name LIKE '*Smith';
さてどこが間違いか分かりますか?
SQLではワイルドカードを使用するときは*
ではなく%
を使います。
これを踏まえて正しい使い方を確認してみましょう。
SELECT *
FROM employees
WHERE name LIKE '%Smith';
5.日付データのフォーマットミス
SELECT *
FROM employees
WHERE hire_date = '2024-12-05'; 'フォーマットが不適切
使用するRDBMS(MySQL、PostgreSQLなど)によって日付データのフォーマットが異なる場合がありますのでしっかり確認しましょう。
MySQLでは問題なかったけど、PostgreSQLでは無理だったというような事象が起きかねません。
解決策として、使っているRDBMSの日付フォーマットを確認する、または明示的に日付型として指定しましょう。
- MySQLの場合
SELECT *
FROM employees
WHERE hire_date = DATE('2024-12-05');
- PostgreSQLの場合
SELECT *
FROM employees
WHERE hire_date = '2024-12-05'::DATE;
3.実務でよく使うWHERE句テクニック
①INで複数条件を指定する
SELECT *
FROM employees
WHERE department IN ('Sales', 'Marketing', 'HR');
この条件では所属部署が「営業」、「マーケティング」、「人事」の社員を取得するSQLです。
②BETWEENで範囲を指定する
SELECT *
FROM employees
WHERE age BETWEEN 30 AND 40;
この条件では年齢が30歳以上40歳以下の社員を取得するSQLです。
BETWEEN
はその数字を含むことに注意して使用しましょう。
③NOTで条件を除外する
SELECT *
FROM employees
WHERE NOT department = 'HR';
この条件では人事以外の社員を所得するSQLです。
4.まとめ
WHERE句はSQLの中でも非常に重要な部分であり、正しく使えば効率的にデータを操作できます。
しかし、条件指定のミスやデータ型の不一致でエラーが発生することもしばしばあります。
エラーを防ぐポイント
- データ型(数値、文字列、日付)を正しく指定する
- NULL値にはIS NULLまたはIS NOT NULLを使用する
- 条件をグループ化して優先順位を明確にする
- ワイルドカードやフォーマットはRDBMSに合わせて使用する
これを意識することでエラーをある程度回避できると思うので、ぜひ参考にしてください。
以上です。