条件に合った行を取得する(WHERE句)| プログラミングの砂場

プログラミング学習やタイピング練習に役立つツールを公開しているサイトです。

条件に合った行を取得する(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句を使うことで条件にマッチした行のみを取得することができます。

構文

SELECT 列名 FROM テーブル名 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と等しい行を取得しなさい」という意味になります。

上の条件で使われる「=(イコール)」は「比較演算子」といわれるものです。

category_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円の商品」という意味になってしまっているからです。

category_id=1 AND price=128 OR price=200

「AND」と「OR」の順番を変えたとしても目的のデータを取得することはできません。

やはり「AND」(下赤字の部分)が先に評価されるので、「128円の商品または、200円の野菜」という意味になってしまいます。

price=128 OR price=200 AND category_id=1

この問題を解決するには、「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円の野菜」が取得できました。

カッコで囲んだ部分は、評価の優先順位が上がります。

category_id=1 AND ( price=128 OR price=200 )

これでようやく「128円または200円の野菜」という意味になります。

「AND」と「OR」が混在する条件を作るときは、その優先順位に注意してください。

5. まとめ

WHERE句で条件を指定してデータを取得しました。

条件指定には、比較演算子を使いました。

条件が複数ある場合は、論理演算子「AND」「OR」を使います。

論理演算子「NOT」は、その条件を「否定」する際に使います。

「AND」と「OR」では「AND」が先に評価されます。

条件をカッコで囲むことで、その条件の優先順位を上げることができます。


次は、「厄介なNULL」についてです。
TOP