条件に合った行を取得する(WHERE句)
WHERE句に条件を指定することで、その条件とマッチした行のみの取得することができます。
ここでは、WHERE句の使い方について見ていきましょう。
目次
1. はじめに
ここでは、商品テーブル(Shouhin)を使って各種条件を指定してみましょう。
まずは、Shouhinの内容を確認してください。
SELECT * FROM Shouhin;
shouhin_id | name | name_kana | category_id | price |
---|---|---|---|---|
1 | アスパラガス | あすぱらがす | 1 | 256 |
2 | かぼちゃ | かぼちゃ | 1 | 300 |
3 | キャベツ | きゃべつ | 1 | 128 |
・ ・ ・ |
Shouhinの全データ(全行)が取得されました。
このデータに対して、条件を指定して行を絞り込んでいきます。
2. WHERE句
WHERE句を使うことで条件にマッチした行のみを取得することができます。
構文
商品ID(shouhin_id)が「13」の商品を取得してみます。
SELECT
*
FROM
Shouhin
WHERE
shouhin_id=13
shouhin_id | name | name_kana | category_id | price |
---|---|---|---|---|
13 | キウイ | きうい | 2 | 128 |
商品IDが「13」の行が取得できました。
WHERE句の条件、「shouhin_id=13」は、「商品IDが13と等しい」ということを意味しています。
結果的にこのSQLは、「商品IDが13と等しい行を取得しなさい」という意味になります。
次に同じ要領で、カテゴリID(category_id)が「2」の商品を取得してみます。
(カテゴリIDが2は、果物を意味しています。)
SELECT
*
FROM
Shouhin
WHERE
category_id=2
shouhin_id | name | name_kana | category_id | price |
---|---|---|---|---|
11 | いちご | いちご | 2 | 380 |
12 | オレンジ | おれんじ | 2 | 350 |
13 | キウイ | きうい | 2 | 128 |
・ ・ ・ |
カテゴリIDが「2」(果物)のみの行に絞られました。
こちらも、先のSQLと同様に「カテゴリIDが2と等しい行を取得しなさい」という意味になります。
上の条件で使われる「=(イコール)」は「比較演算子」といわれるものです。
比較演算子には、「イコール」のほかにも「以上」や「以下」などさまざまなものがあります。
3. 比較演算子
代表的な比較演算子をまとめておきます。
演算子 | 意味 | 使用例 | 使用例の結果 |
---|---|---|---|
= | 等しい | SELECT * FROM Shouhin WHERE shouhin_id = 1 | shouhin_idが1のデータが取得される |
<> または、 != |
以外 (等しくない) |
SELECT * FROM Shouhin WHERE shouhin_id <> 1 または、 SELECT * FROM Shouhin WHERE shouhin_id != 1 |
shouhin_idが1以外のデータが取得される |
< | 小さい | SELECT * FROM Shouhin WHERE shouhin_id < 1 | shouhin_idが1より小さいデータが取得される |
<= | 以下 | SELECT * FROM Shouhin WHERE shouhin_id <= 1 | shouhin_idが1以下のデータが取得される |
> | 大きい | SELECT * FROM Shouhin WHERE shouhin_id > 1 | shouhin_idが1より大きいデータが取得される |
>= | 以上 | SELECT * FROM Shouhin WHERE shouhin_id >= 1 | shouhin_idが1以上のデータが取得される |
4. 論理演算子
条件が複数ある場合は、各条件を論理演算子(「AND」や「OR」)で繋いで記述します。
演算子 | 意味 | 使用例 | 使用例の結果 |
---|---|---|---|
AND | かつ | SELECT * FROM Shouhin WHERE category_id = 1 AND price >= 200 |
category_idが1かつ、値段が200以上のデータが取得される |
OR | または | SELECT * FROM Shouhin WHERE category_id = 1 OR price >= 200 |
shouhin_idが1または、値段が200以上のデータが取得される |
NOT | 否定 | SELECT * FROM Shouhin WHERE NOT category_id = 1 |
shouhin_idが1ではないデータが取得される |
4-1. AND
「AND」には、「かつ」という意味があります。
Shouhinテーブルから、「200円以上の野菜」を取得する場合を考えてみましょう。
野菜は、category_idが1の商品です。
SELECT * FROM Shouhin WHERE category_id=1
shouhin_id | name | name_kana | category_id | price |
---|---|---|---|---|
1 | アスパラガス | あすぱらがす | 1 | 256 |
2 | かぼちゃ | かぼちゃ | 1 | 300 |
3 | キャベツ | きゃべつ | 1 | 128 |
・ ・ ・ |
上のSQLでは、「野菜」だけが取得できます。
条件は、「200円以上の野菜」ですから、「200円以上」という条件を付け足す必要があります。
この場合、「200円以上」という条件を付け足すには「AND」を使用します。
SELECT
*
FROM
Shouhin
WHERE
category_id=1 AND price >= 200
shouhin_id | name | name_kana | category_id | price |
---|---|---|---|---|
1 | アスパラガス | あすぱらがす | 1 | 256 |
2 | かぼちゃ | かぼちゃ | 1 | 300 |
5 | トマト | とまと | 1 | 328 |
7 | にんじん | にんじん | 1 | 200 |
これで、「野菜かつ200円以上」すなわち「200円以上の野菜」のデータが取得できます。
4-2. OR
「OR」には、「または」という意味があります。
Shouhinテーブルから、「野菜または、2000円の商品」を取得する場合を考えてみましょう。
野菜は、category_idが1の商品です。
SELECT * FROM Shouhin WHERE category_id=1
shouhin_id | name | name_kana | category_id | price |
---|---|---|---|---|
1 | アスパラガス | あすぱらがす | 1 | 256 |
2 | かぼちゃ | かぼちゃ | 1 | 300 |
3 | キャベツ | きゃべつ | 1 | 128 |
・ ・ ・ |
上のSQLでは、「野菜」だけが取得できます。
条件は、「野菜または、2000円の商品」ですから、「値段が2000円」という条件を付け足す必要があります。
この場合、「値段が2000円」という条件を付け足すには「OR」を使用します。
SELECT
*
FROM
Shouhin
WHERE
category_id=1 OR price = 2000
shouhin_id | name | name_kana | category_id | price |
---|---|---|---|---|
1 | アスパラガス | あすぱらがす | 1 | 256 |
2 | かぼちゃ | かぼちゃ | 1 | 300 |
3 | キャベツ | きゃべつ | 1 | 128 |
・ ・ ・ |
||||
18 | ドリアン | どりあん | 2 | 2000 |
これで、「野菜または、2000円の商品」のデータが取得できます。
4-3. NOT
「NOT」には、「否定」という意味があります。
野菜を取得するSQLで「NOT(否定)」の働きを見てみましょう。
野菜は、category_idが1の商品です。
SELECT * FROM Shouhin WHERE category_id=1
shouhin_id | name | name_kana | category_id | price |
---|---|---|---|---|
1 | アスパラガス | あすぱらがす | 1 | 256 |
2 | かぼちゃ | かぼちゃ | 1 | 300 |
3 | キャベツ | きゃべつ | 1 | 128 |
・ ・ ・ |
上のSQLでは、「野菜」だけが取得できます。
この条件(category_id=1)に「NOT(否定)」を付けてみます。
SELECT * FROM Shouhin WHERE NOT category_id=1
shouhin_id | name | name_kana | category_id | price |
---|---|---|---|---|
11 | いちご | いちご | 2 | 380 |
12 | オレンジ | おれんじ | 2 | 350 |
13 | キウイ | きうい | 2 | 128 |
・ ・ ・ |
野菜ではない商品が取得されています。
これは、「NOT(否定)」によって、「野菜の商品」という条件が否定されて、「野菜ではない商品」になっているからです。
結果的に「野菜ではない商品」が取得されるというわけです。
このケースでは、比較演算子の「<>」や「!=」でも代用できます。
下のSQLはいずれも同じ「野菜ではない商品」を取得するSQLです。
「野菜の商品」を「否定」して「野菜ではない商品」を取得
SELECT * FROM Shouhin WHERE NOT category_id=1
「野菜以外の商品」を取得
SELECT * FROM Shouhin WHERE category_id <> 1
SELECT * FROM Shouhin WHERE category_id != 1
一見使い道がなさそうな「NOT(否定)」ですが、のちに登場する「IN」や「EXISTS」などの機能を組み合わせることで、そのありがたさが理解できると思います。
今の段階では、「NOT」は、「その条件の否定する」ということだけ理解しておいてください。
4-4. 論理演算の優先順位
「AND」と「OR」が混在する条件の場合は、「AND」が優先されます。
「128円または200円の野菜」を取得する場合を考えてみましょう。
野菜は、category_idが1の商品です。
単純に条件を組み合わせてSQLを書くと次のとおりになります。
SELECT
*
FROM
Shouhin
WHERE
category_id=1 AND price=128 OR price=200
shouhin_id | name | name_kana | category_id | price |
---|---|---|---|---|
1 | キャベツ | きゃべつ | 1 | 128 |
7 | にんじん | にんじん | 1 | 200 |
9 | レタス | れたす | 1 | 128 |
19 | リンゴ | りんご | 2 | 200 |
「128円または200円の野菜」を取得したはずが、果物の「リンゴ」まで混ざってしまっています。
これは、「AND」(下赤字の部分)が先に評価されるため「128円の野菜または、200円の商品」という意味になってしまっているからです。
「AND」と「OR」の順番を変えたとしても目的のデータを取得することはできません。
やはり「AND」(下赤字の部分)が先に評価されるので、「128円の商品または、200円の野菜」という意味になってしまいます。
この問題を解決するには、「OR」の部分にカッコを付けます。
SELECT
*
FROM
Shouhin
WHERE
category_id=1 AND ( price=128 OR price=200 )
shouhin_id | name | name_kana | category_id | price |
---|---|---|---|---|
1 | キャベツ | きゃべつ | 1 | 128 |
7 | にんじん | にんじん | 1 | 200 |
9 | レタス | れたす | 1 | 128 |
目的の「128円または200円の野菜」が取得できました。
カッコで囲んだ部分は、評価の優先順位が上がります。
これでようやく「128円または200円の野菜」という意味になります。
「AND」と「OR」が混在する条件を作るときは、その優先順位に注意してください。
5. まとめ
WHERE句で条件を指定してデータを取得しました。
条件指定には、比較演算子を使いました。
条件が複数ある場合は、論理演算子「AND」「OR」を使います。
論理演算子「NOT」は、その条件を「否定」する際に使います。
「AND」と「OR」では「AND」が先に評価されます。
条件をカッコで囲むことで、その条件の優先順位を上げることができます。
次は、「厄介なNULL」についてです。