SQLでデータベースのテーブルやビューからデータを取得する際は、SELECTステートメントを使用します。
取得するデータを条件を指定して絞り込みたい場合はWHERE句を使用します。
WHERE句では、比較演算子や論理演算子を使用して条件式を記述することができます。
今回は、WHERE句で使用できる様々な演算子について紹介します。
記事内で使用するテーブル
本記事では、SQLの記述例に以下のテーブルを使用します。
使用するテーブルは「顧客」「注文」「優待顧客」の3つになります。
テーブル定義
列名 | データ型 | NULLを許容 | 主キー |
---|---|---|---|
顧客ID | int | no | ○ |
顧客名 | nvarchar(50) | no | |
契約日 | date | no | |
電話番号 | varchar(20) | no |
列名 | データ型 | NULLを許容 | 主キー |
---|---|---|---|
注文ID | int | no | ○ |
注文日 | date | no | |
顧客ID | int | no | |
商品 | nvarchar(50) | no | |
金額 | decimal(18, 0) | no |
列名 | データ型 | NULLを許容 | 主キー |
---|---|---|---|
顧客ID | int | no | ○ |
テーブルのCREATE文(SQL)
1 2 3 4 5 6 7 8 |
CREATE TABLE 顧客 ( 顧客ID int NOT NULL PRIMARY KEY, 氏名 nvarchar(50) NOT NULL, 性別 nvarchar(10) NOT NULL, 契約日 date NOT NULL, 電話番号 varchar(20) NOT NULL, ); |
1 2 3 4 5 6 7 8 |
CREATE TABLE 注文 ( 注文ID int NOT NULL PRIMARY KEY, 注文日 date NOT NULL, 顧客ID int NOT NULL, 商品 nvarchar(50) NOT NULL, 金額 decimal(18, 0) NOT NULL, ); |
1 2 3 4 |
CREATE TABLE 優待顧客 ( 顧客ID int NOT NULL PRIMARY KEY, ); |
テーブルのINSERT文(SQL)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
INSERT INTO 顧客 ( 顧客ID, 氏名, 性別, 契約日, 電話番号 ) VALUES (1, '山田 花子', '女性', '2008-12-25', '000-000-0000'), (2, '中村 一郎', '男性', '2009-05-19', '000-000-0001'), (3, '佐藤 太郎', '男性', '2009-11-04', '000-000-0002'), (4, '上野 京子', '女性', '2010-03-20', '000-000-0003'), (5, '西田 次郎', '男性', '2010-07-11', '000-000-0004'), (6, '今井 真美', '女性', '2011-02-17', '000-000-0005'), (7, 'ピエール 梅原', '男性', '2012-10-29', '000-000-0006'); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
INSERT INTO 注文 ( 注文ID, 注文日, 顧客ID, 商品, 金額 ) VALUES (1, '2018-12-25', 2, 'Tシャツ', 1000), (2, '2019-05-19', 5, 'カッターシャツ', 2000), (3, '2019-11-04', 6, 'ブラウス', 3000), (4, '2020-03-20', 1, 'トレーナー', 4000), (5, '2020-07-11', 3, 'セーター', 5000), (6, '2021-02-17', 4, 'スーツ', 6000); |
1 2 3 4 5 6 7 8 |
INSERT INTO 優待顧客 ( 顧客ID ) VALUES (2), (5), (6); |
WHERE句で使用できる演算子
SELECTステートメントのWHERE句では、等号や不等号などの比較演算子や、ANDやORなどの論理演算子を使用することで、複雑な条件式を記述することができます。
WHERE句では、演算子を使用した条件式を評価した結果がTrue(真)になる場合に結果(行)を取得することができます。
WHERE句で使用する比較演算子
WHERE句で使用できる比較演算子には、以下のものがあります。
- A = B(左辺Aと右辺Bが等しい)
- A <> B(左辺Aと右辺Bが等しくない)
- A != B(<>と同じく左辺Aと右辺Bが等しくない)
- A < B(左辺Aが右辺Bより小さい)
- A > B(左辺Aが右辺Bより大きい)
- A <= B(左辺Aが右辺B以下)
- A >= B(左辺Aが右辺B以上)
以下に「顧客」テーブルと「注文」テーブルのデータを取得するSQLの例をいくつか示します。
1 2 3 4 5 6 |
SELECT * FROM 顧客 WHERE 性別 = '男性' |
【実行結果】
顧客ID | 氏名 | 性別 | 契約日 | 電話番号 |
---|---|---|---|---|
2 | 中村 一郎 | 男性 | 2009-05-19 | 000-000-0001 |
3 | 佐藤 太郎 | 男性 | 2009-11-04 | 000-000-0002 |
5 | 西田 次郎 | 男性 | 2010-07-11 | 000-000-0004 |
7 | ピエール 梅原 | 男性 | 2012-10-29 | 000-000-0006 |
1 2 3 4 5 6 |
SELECT * FROM 顧客 WHERE YEAR(契約日) = 2010 |
【実行結果】
顧客ID | 氏名 | 性別 | 契約日 | 電話番号 |
---|---|---|---|---|
4 | 上野 京子 | 女性 | 2010-03-20 | 000-000-0003 |
5 | 西田 次郎 | 男性 | 2010-07-11 | 000-000-0004 |
1 2 3 4 5 6 |
SELECT * FROM 注文 WHERE 金額 < 5000 |
【実行結果】
注文ID | 注文日 | 顧客ID | 商品 | 金額 |
---|---|---|---|---|
1 | 2015-12-25 | 2 | Tシャツ | 1000 |
2 | 2016-05-19 | 5 | カッターシャツ | 2000 |
3 | 2017-11-04 | 6 | ブラウス | 3000 |
4 | 2018-03-20 | 1 | トレーナー | 4000 |
1 2 3 4 5 6 |
SELECT * FROM 注文 WHERE 注文日 >= '2019-03-15' |
【実行結果】
注文ID | 注文日 | 顧客ID | 商品 | 金額 |
---|---|---|---|---|
5 | 2019-07-11 | 3 | セーター | 5000 |
6 | 2020-02-17 | 4 | スーツ | 6000 |
WHERE句で使用する論理演算子
WHERE句で使用できる論理演算子には、以下のものがあります。
- AND(論理積)
- OR(論理和)
- BETWEEN(範囲内に収まっているかどうか)
- LIKE(パターンマッチング)
- IN(入っているかどうか)
- EXISTS(存在するかどうか)
- NOT(否定)
- ANY(いずれかを表す比較演算子の修飾子)
- SOME(ANYと同じくいずれかを表す比較演算子の修飾子)
- ALL(すべてを表す比較演算子の修飾子)
AND(論理積)
論理積を表す「AND」演算子は、左辺と右辺がともにTrue(真)の場合にTrue(真)になり、対象となる行を返します。
1 2 3 4 5 6 7 8 |
SELECT * FROM 注文 WHERE 注文日 >= '2020-01-01' AND 注文日 <= '2020-12-31' |
【実行結果】
注文ID | 注文日 | 顧客ID | 商品 | 金額 |
---|---|---|---|---|
6 | 2020-02-17 | 4 | スーツ | 6000 |
OR(論理和)
論理和を表す「OR」演算子は、左辺と右辺のいずれかがTrue(真)の場合にTrue(真)になり、対象となる行を返します。
1 2 3 4 5 6 7 8 |
SELECT * FROM 注文 WHERE 注文日 >= '2019-03-05' OR 注文日 <= '2016-07-21' |
【実行結果】
注文ID | 注文日 | 顧客ID | 商品 | 金額 |
---|---|---|---|---|
1 | 2015-12-25 | 2 | Tシャツ | 1000 |
2 | 2016-05-19 | 5 | カッターシャツ | 2000 |
5 | 2019-07-11 | 3 | セーター | 5000 |
6 | 2020-02-17 | 4 | スーツ | 6000 |
BETWEEN(範囲内に収まっているかどうか)
「BETWEEN」演算子は、指定した範囲内にある行を返します。
「BETWEEN」演算子は「AND」演算子と共に使用します。
1 2 3 4 5 6 |
SELECT * FROM 注文 WHERE 注文日 BETWEEN '2017-01-01' AND '2018-12-31' |
【実行結果】
注文ID | 注文日 | 顧客ID | 商品 | 金額 |
---|---|---|---|---|
3 | 2017-11-04 | 6 | ブラウス | 3000 |
4 | 2018-03-20 | 1 | トレーナー | 4000 |
BETWEEN ~ ANDで指定する条件は、AND演算子を使って以下のように書き換えることが可能です。
1 |
A BETWEEN 1 AND 10 |
↓
1 |
A >= 1 AND A <= 10 |
LIKE(パターンマッチング)
「LIKE」演算子は、ワイルドカード文字を使用したパターンによるマッチング検索を行います。
パターンは、通常の文字とワイルドカード文字を含むことができます。
ワイルドカード文字には、以下のものがあります。
ワイルドカード文字 | 説明 |
---|---|
% | 任意の文字列です。 |
_ (アンダースコア) | 任意の 1 文字です。 |
[] | 指定した範囲 ([a-c]) またはセット ([abc]) 内にある任意の1文字です。 |
[^] | 指定した範囲 ([^a-c]) またはセット ([^abc]) 内にない任意の1文字です。 |
式 LIKE 文字列式 ESCAPE エスケープ文字
1 2 3 4 5 6 |
SELECT * FROM 注文 WHERE 商品 LIKE '%シャツ' |
【実行結果】
注文ID | 注文日 | 顧客ID | 商品 | 金額 |
---|---|---|---|---|
1 | 2015-12-25 | 2 | Tシャツ | 1000 |
2 | 2016-05-19 | 5 | カッターシャツ | 2000 |
1 2 3 4 5 6 |
SELECT * FROM 顧客 WHERE 氏名 LIKE '_田%' |
【実行結果】
顧客ID | 氏名 | 性別 | 契約日 | 電話番号 |
---|---|---|---|---|
1 | 山田 花子 | 女性 | 2008-12-25 | 000-000-0000 |
5 | 西田 次郎 | 男性 | 2010-07-11 | 000-000-0004 |
LIKE演算子を使用したパターンマッチング検索で、ワイルドカードに使用する文字を通常の文字(リテラル)として指定する場合は、ワイルドカード文字を括弧([])で囲みます。
ワイルドカード文字 | リテラル |
---|---|
% | [%] |
_ (アンダースコア) | [_] |
[ | [[] |
[%]と記述することで値に「%」を含むデータ(「100%」や「降水確率30%」など)にマッチングすることができるようになります。
IN(入っているかどうか)
「IN」演算子は、後に続く括弧内のいずれかの値と、INの前に指定した値が一致する場合にTrue(真)になり、対象となる行を返します。
式 IN (サブクエリー)
1 2 3 4 5 6 |
SELECT * FROM 顧客 WHERE YEAR(契約日) IN (2009, 2010, 2011) |
【実行結果】
顧客ID | 氏名 | 性別 | 契約日 | 電話番号 |
---|---|---|---|---|
2 | 中村 一郎 | 男性 | 2009-05-19 | 000-000-0001 |
3 | 佐藤 太郎 | 男性 | 2009-11-04 | 000-000-0002 |
4 | 上野 京子 | 女性 | 2010-03-20 | 000-000-0003 |
5 | 西田 次郎 | 男性 | 2010-07-11 | 000-000-0004 |
6 | 今井 真美 | 女性 | 2011-02-17 | 000-000-0005 |
EXISTS(存在するかどうか)
「EXISTS」演算子は、後に続くサブクエリーの中で1つ以上の行がある場合にTrue(真)になり、対象となる行を返します。
1 2 3 4 5 6 7 |
SELECT * FROM 注文 WHERE EXISTS (SELECT * FROM 顧客 WHERE 顧客.顧客ID = 注文.顧客ID) |
【実行結果】
注文ID | 注文日 | 顧客ID | 商品 | 金額 |
---|---|---|---|---|
1 | 2015-12-25 | 2 | Tシャツ | 1000 |
2 | 2016-05-19 | 5 | カッターシャツ | 2000 |
3 | 2017-11-04 | 6 | ブラウス | 3000 |
4 | 2018-03-20 | 1 | トレーナー | 4000 |
5 | 2019-07-11 | 3 | セーター | 5000 |
6 | 2020-02-17 | 4 | スーツ | 6000 |
NOT(否定)
「NOT」演算子は、右辺がTrue(真)の場合にFalse(偽)を返します。逆に右辺がFalse(偽)であった場合にはTrue(真)を返します。
「NOT」演算子では、WHERE句で指定した条件を満たさない行が対象になります。
1 2 3 4 5 6 |
SELECT * FROM 顧客 WHERE NOT 氏名 = '佐藤 太郎' |
【実行結果】
顧客ID | 氏名 | 性別 | 契約日 | 電話番号 |
---|---|---|---|---|
1 | 山田 花子 | 女性 | 2008-12-25 | 000-000-0000 |
2 | 中村 一郎 | 男性 | 2009-05-19 | 000-000-0001 |
4 | 上野 京子 | 女性 | 2010-03-20 | 000-000-0003 |
5 | 西田 次郎 | 男性 | 2010-07-11 | 000-000-0004 |
6 | 今井 真美 | 女性 | 2011-02-17 | 000-000-0005 |
7 | ピエール 梅原 | 男性 | 2012-10-29 | 000-000-0006 |
ANY(いずれかを表す比較演算子の修飾子)
「ANY」演算子は比較演算子とサブクエリーで構成されます。
サブクエリーで取得される結果のいずれかの値と比較する場合に使用します。
ANY演算子は指定する比較演算子によって動作が異なります。
比較演算子に「<」を指定した場合は、サブクエリーが返す結果のいずれかの値よりも小さいものが対象となります。
1 |
列 < ANY (SELECT 値 FROM テーブル) |
例えば、サブクエリー(SELECT 値 FROM テーブル)から得られる結果が「2, 4, 7」であれば、2、4、7のいずれかの値より小さいもの(行)がTrue(真)となります。(結果として7よりも小さいものが対象になります。)
比較演算子に「>」を指定した場合は、「<」とは逆に、サブクエリーが返す結果のいずれかの値よりも大きいものが対象となります。
1 |
列 > ANY (SELECT 値 FROM テーブル) |
サブクエリー(SELECT 値 FROM テーブル)から得られる結果が「2, 4, 7」であれば、2、4、7のいずれかの値より大きいもの(行)がTrue(真)となります。(結果として2よりも大きいものが対象になります。)
1 2 3 4 5 6 |
SELECT * FROM 顧客 WHERE 顧客ID = ANY (SELECT 顧客ID FROM 優待顧客) |
【実行結果】
顧客ID | 氏名 | 性別 | 契約日 | 電話番号 |
---|---|---|---|---|
2 | 中村 一郎 | 男性 | 2009-05-19 | 000-000-0001 |
5 | 西田 次郎 | 男性 | 2010-07-11 | 000-000-0004 |
6 | 今井 真美 | 女性 | 2011-02-17 | 000-000-0005 |
SOME(ANYと同じくいずれかを表す比較演算子の修飾子)
「SOME」は「ANY」と同様です。
ALL(すべてを表す比較演算子の修飾子)
「ALL」演算子は比較演算子とサブクエリーで構成されます。
サブクエリーで取得される結果のすべての値と比較する場合に使用します。
ALL演算子は指定する比較演算子によって動作が異なります。
比較演算子に「<」を指定した場合は、サブクエリーが返す結果のすべての値よりも小さいものが対象となります。
1 |
列 < ALL (SELECT 値 FROM テーブル) |
例えば、サブクエリー(SELECT 値 FROM テーブル)から得られる結果が「3, 5, 8」であれば、3よりも小さいもの(行)がTrue(真)となります。
比較演算子に「>」を指定した場合は、「<」とは逆に、サブクエリーが返す結果のすべての値よりも大きいものが対象となります。
1 |
列 > ALL (SELECT 値 FROM テーブル) |
サブクエリー(SELECT 値 FROM テーブル)から得られる結果が「3, 5, 8」であれば、8よりも大きいもの(行)がTrue(真)となります。
ちなみに、以下のような構文はエラーになりませんが、サブクエリが返す値が複数ある場合は、対象の行(レコード)を取得することができません。
1 |
列 = ALL (SELECT 値 FROM テーブル) |
サブクエリー(SELECT 値 FROM テーブル)から得られる結果が「3, 5, 8」の場合、3と5と8のすべてに一致するケースが存在しないためです。
1 2 3 4 5 6 |
SELECT * FROM 顧客 WHERE 顧客ID <> ALL (SELECT 顧客ID FROM 優待顧客) |
【実行結果】
1 | 山田 花子 | 女性 | 2008-12-25 | 000-000-0000 |
---|---|---|---|---|
3 | 佐藤 太郎 | 男性 | 2009-11-04 | 000-000-0002 |
4 | 上野 京子 | 女性 | 2010-03-20 | 000-000-0003 |
7 | ピエール 梅原 | 男性 | 2012-10-29 | 000-000-0006 |