SQLで条件を指定するwhere句。当ページでは、where句のサンプルコードを紹介しています。
以下、データベースとして、MySQLのサンプルデータベースEmployeesを使っています。SQL実行結果の表示にはphpMyAdminを使用しています。
SQL Where句の基本的な使い方
select文、update文、insert文、delete文などの条件指定に使われます。
SELECT * FROM employees WHERE emp_no = '10001'
上記のSQLは、employees(社員テーブル)から、emp_no(社員番号)が10001のデータを取得します。
演算子には等号(=)のほか、不等号(<、>)、否定(not、!=)が使用可能です。
実行するとこうなります。
where句に指定する条件は、andとorで接続して、複数の条件を指定することができます。
SQL Where句のサンプルコード集
inで、含む・含まないを指定するサンプルコード
対象のカラムの内容がリストに含まれていたらデータを取得する場合は、in句を使います。
「カラム名 in (リスト内容1,リスト内容2,リスト内容3…)」と指定します。
select * from employees where emp_no in (10001,10002,10005,10007)
上記のSQLは、employees(社員テーブル)から、emp_no(社員番号)が10001、10002、10005、10007のものを取得します。
実行するとこうなります。
in句の指定には複数カラムの指定が可能。また、リストの代わりにサブクエリを指定することも可能です。
【関連記事】
▶SQL in句のサンプルコード集 複数カラムの指定方法とは?
また、指定したリストを含まないデータのみ取得する場合は、not inを指定します。
select * from employees where emp_no not in (10001,10002,10005,10007)
【関連記事】
▶SQL not in データの除外指定 NULLや複数カラムを扱う方法
likeで、あいまい検索をするサンプルコード
ワイルドカードを指定して、あいまい検索をおこなうにはlikeを使います。
「like ‘X%’」などと指定します。文字列中の「%」「_」(アンダースコア)はワイルドカード文字で、複数指定可能です。
SELECT * FROM employees WHERE first_name like 'A%' and last_name not like 'S%'
上記SQLは、employees(社員テーブル)から、first_name(姓名の名)がAで始まり、last_name(姓名の姓)がSで始まらないデータを取得します。
実行するとこうなります。
likeを多用すると、条件次第でクエリのレスポンスが遅くなる(スロークエリ)ケースがあります。explain(実行計画)をチェックして、スロークエリにならないようチェックしましょう。
【関連記事】
▶sql likeを使ったサンプル集 likeは本当に遅いのか?
betweenで、範囲指定をするサンプルコード
「カラム名 between A and B」で、指定カラムの内容がA~Bの範囲のデータが取得できます。
SELECT * FROM employees where emp_no between 20000 and 20050
上記のSQLは、employees(社員テーブル)から、emp_no(社員番号)が20000~20050のデータを取得します。
実行するとこうなります。
betweenには、日付や文字列も指定可能です。betweenは、以上・以下(境界値を含む)指定になりますが、not inや、!=を組み合わせることで、「未満」「より大きい」を指定することも可能です。
【関連記事】
▶SQL betweenで範囲指定するサンプルコード 速度アップにもつながる?
日付の条件を指定するサンプルコード
MySQLの場合、日付指定は’YYYY-MM-DD’形式で可能です。
SELECT * FROM employees where hire_date between '1990-01-01' and '1991-01-01'
上記SQLは、employees(社員テーブル)から、hire_date(雇用日)が1990年1月1日~1991年1月1日のデータを取得します。
実行結果はこうなります。
「’1990-01-01′ interval 1 year」指定で、日付から1年後を指定することも可能。1 yearの部分を変えることで、秒、分、時、日、週、月指定も可能です。
なお、DBMSによっては、date_formatなどの日付関数を条件に組み合わせると速度が著しく低下する可能性があります。条件指定にdate_formatなどの関数を使う場合は、explain(実行計画)をチェックしておきましょう。
【関連記事】
▶SQL betweenで範囲指定するサンプルコード 速度アップにもつながる?
条件にサブクエリを使うサンプルコード
条件指定にサブクエリ(副問い合わせ)を使うこともできます。サブクエリとは、条件値を指定する箇所を別のクエリで置き換えたもののことを言います。
下記例では、birth_date=以下の「( select min(birth_date) from employees b)」がサブクエリとなります。
SELECT first_name, last_name, birth_date FROM employees a WHERE birth_date = ( select min(birth_date) from employees b )
上記SQLは、employees(社員テーブル)から、birth_date(誕生日)が最も古い(min)データのfirst_name(姓名の名)、last_name(姓名の姓)、birth_date(誕生日)を取得します。
実行するとこうなります。
サブクエリを条件に組み込む場合、existsやnot existsを使うことも可能です。
【関連記事】
▶【使いこなせる?】SQLのEXISTS文の使い方を初心者向けに解説
▶SQL not exists サンプルコード 2テーブルの片方にしかないデータを抽出
サブクエリは複雑化すると、クエリのレスポンスが落ちるケースがあります。explain(実行計画)でチェックして、データ件数が多いテーブルにフルスキャンが起こるようなら、インデックス利用が可能なSQLに置き換えを検討しましょう。
NULL判定をするサンプルコード
指定カラムがNULLのデータを抽出したい場合、カラム名=NULLという条件指定ではデータ抽出ができません。そこで、IS NULLを使って条件指定します。
select * from salaries where salary IS NULL
上記SQLは、salaries(年収テーブル)から、salary(年収)がNULLのデータを取得します。
NULL以外を指定する場合は、「IS NOT NULL」を指定します。
select * from salaries where salary IS NULL
【関連記事】
▶SQL isnullの使い方 NULL判定やNULL置換の方法 case式でも対応可能
まとめ
- 「含む・含まない」条件はin句を使う
- ワイルドカードでのあいまい検索はlikeを使う
- 範囲指定条件はbetweenを使う
- 日付の条件指定に関数を使うと、速度低下の可能性あり
- サブクエリを条件に使うときはinやexistsと組み合わせる
- NULL判定にはIS NULLを使う