複数条件でのSQLデータ抽出に戸惑う方は多いと思います。大きなくくりではAND,ORを使う方法とIN句を利用する方法があります。単純に複数条件を記載する方法がわからない方から優先順位の決め方やnot,nullなどの条件が出た場合に、目的のデータを抽出するための書き方がわからないケースです。
本記事では、複数条件をSQLで指定し、様々なデータ抽出のパターンを図示およびサンプルコードで提供します。コードのコピペと修正(利用目的にカスタマイズ)で、皆様がSQLで複数条件抽出ができることを目指します。
複数条件は論理演算子のANDとORを用いる
ANDを用いたSQL(基本)
AND演算子を利用すると「AかつB」の条件で抽出できます。(下記コード)
SELECT カラム(項目名) FROM テーブル
WHERE 条件式A AND 条件式B ;
仮に変数を代入した例を書くと下記
- テーブル名:table_1
- カラム:* ※全項目抽出を示す記号
- 条件式A:Categoly「和菓子」を抽出
- 条件式B:Price「1,000円以上」を抽出
SELECT * FROM table_1
WHERE Categoly='和菓子' AND Price >= 1000 ;
上記SQLを実行すると和菓子且つ、1,000円以上の商品のみ抽出されます。
条件を2つ以上にする時もANDでつないでいくだけです。
SELECT * FROM table_1
WHERE Categoly='和菓子' AND Price >= 1000 AND 条件式C AND 条件式D ;
ORを用いたSQL(基本)
OR演算子を利用すると「AまたはB」の条件で抽出できます。(下記コード)
どちらかの条件に合致していればデータが抽出されます。
SELECT * FROM table_1
WHERE Categoly='和菓子' OR Price >= 1000 ;
条件を2つ以上にする時もORでつないでいくだけです。
SELECT * FROM table_1
WHERE Categoly='和菓子' OR Price >= 1000 OR 条件式3;
NOTを用いたSQL(基本)
NOTを用いると抽出したくないデータを指定できます。
SELECT * FROM table_1
WHERE Categoly='和菓子' AND Price >= 1000 AND 条件式C AND NOT 条件式D ;
ANDとORを併用したSQLは()で囲む方法がおすすめ
ANDとORを併用する場合、SQLではANDの順番が優先されます。対策として下記2つがありますが、保守性の観点から下記2の()で囲む方法がおすすめです。
- AND,ORの順番を意識してコードを書く
- 有線順位が視覚的にわかるように()で囲む ※()内が先に計算されます
例えば「和菓子」と1,000円以上 or 条件式Cと考えると下記2つのコードが同じになります。
SELECT * FROM table_1
WHERE Categoly='和菓子' AND Price >= 1000 Or 条件式C ;
SELECT * FROM table_1
WHERE (Categoly='和菓子' AND Price >= 1000) Or 条件式C ;
もし、1,000円以上 or 条件式Cと「和菓子」をAND条件で示したいならば下記
SELECT * FROM table_1
WHERE Categoly='和菓子' (AND Price >= 1000 Or 条件式C) ;
IN句を利用して複数条件を指定する方法
IN句を利用した複数条件抽出
SQLのIN句は「カラムのリスト値に一致したものを抽出」するものです。(下記コード)
IN句は〇〇の中に含まれるものを全て抽出するのでOR条件で抽出されます。
SELECT カラム(項目名) FROM テーブル
WHERE カラム IN (値1,値2,値3) ;
例えば、カラム名:果物のリストに「りんご・いちご・ラフランス」が含まれるものを抽出したい時は下記のように書きます。
SELECT カラム(項目名) FROM テーブル
WHERE 果物 IN ("りんご","いちご","ラフランス") ;
NOT IN句を利用した複数条件抽出
含まれないものを抽出したい場合はNOT INを利用します。(下記コード)
SELECT カラム(項目名) FROM テーブル
WHERE 果物 NOT IN ("りんご","いちご","ラフランス") ;
NULLとNOTに注意!等号では抽出できないので対策が必要
NULLを抽出するにはIS NULLやIS NOT NULLを使う
複数条件の抽出で忘れがちな条件がNULLです。NULLはデータが存在せず、0や空文字とは異なります。条件式にカラム名 IS NULL カラム名 IS NOT NULLと入力する必要があります。
※「カラム名 != ‘検索値’」や「カラム名 = NULL」などの等号、等号否定、不等号はNULLには使えません。
複数条件を絞り込むさいは忘れがちなので、NULLの存在を把握することは非常に重要です。
NOTを利用するならNULLに気を付ける
和菓子以外のデータを抽出したい時に下記コードを書くと、NULLデータがでてきません。
SELECT カラム(項目名) FROM テーブル
WHERE Categoly <>'和菓子' ;
和菓子以外を出したいのであれば下記コードで抽出します。
SELECT カラム(項目名) FROM テーブル
WHERE Categoly <>'和菓子' OR Categoly IS NULL;
IN句で例を作成すると
SELECT カラム(項目名) FROM テーブル
WHERE 果物 NOT IN ("りんご","いちご","ラフランス") OR 果物 IS NULL ;
ご質問やご依頼について
記事やDX化のご質問や依頼はServiceをご覧くださいませ。