SELECT文を使ってデータを取得する際に、条件を指定したい時があると思います。
例えば、大量のユーザーデータの中から年齢が30歳以上の人だけを抽出したい、大量の商品ラインナップから商品Bの情報だけを抽出したい、といった具合です。
条件指定を実現するのがSQLのWHERE句です。
WHERE句を習得すれば、様々な条件を指定して情報を取得できるようになるため、データ分析の幅が大きく広がります。
本記事では、そんなWHERE句の使い方を分かりやすく解説していきます。
目次
WHERE句とは?
SELECT文を使って検索条件を指定する場合は「WHERE句」を使います。WHEREの後に条件を指定することで、その条件に合ったデータを取得することができます。
基本形は下記です。
SELECT カラム名
FROM テーブル名
WHERE 条件式;
今回も下記のようなusersテーブルを例にして考えていきます。
id | name | age | address | created_at |
---|---|---|---|---|
1 | 山田 | 25 | 東京都 | 2021-06-10 |
2 | 鈴木 | 34 | 神奈川県 | 2021-12-18 |
3 | 佐藤 | 28 | 北海道 | 2021-06-16 |
4 | 大野 | 45 | 大阪府 | 2020-05-20 |
5 | 小池 | 56 | 京都府 | 2021-04-02 |
6 | 近藤 | 23 | 東京都 | 2021-03-23 |
7 | 佐々木 | 37 | 千葉県 | 2021-01-06 |
8 | 宮田 | 31 | 福岡県 | 2020-08-12 |
例えば、この中から住所が東京都の人だけを取得したい場合、下記のようなクエリを書きます。
SELECT *
FROM users
WHERE address = '東京都';
実行結果
id | name | age | address | created_at |
---|---|---|---|---|
1 | 山田 | 25 | 東京都 | 2021-06-10 |
6 | 近藤 | 23 | 東京都 | 2021-03-23 |
WHERE句の後に指定しているaddress = '東京都'
が「住所が東京都の人」を抽出する条件になっています。東京都の文字の前後にクォーテーションを付けていることに気づいた人も多いでしょう。
これはデータ型と呼ばれるデータのルールに沿ったもので、文字データはクォーテーションで囲むというルールがあります。
データ型については次で詳しく解説します。
データ型を理解する
データベースに保存されているデータにはデータ型と呼ばれるルールが指定されています。データ型とは文字・数値・日付のようなデータの種類を示したものです。
下記3種類を覚えておけば大丈夫です。
データ型の種類
データ型 | データ例 | 特徴 |
---|---|---|
文字データ | ‘東京都’ | ‘ ‘で囲む |
数値データ | 25 | そのまま記載 |
日付データ | ‘2021-01-01’ | ‘ ‘で囲む |
usersテーブルの場合は下記のようなデータ型になっています。
カラム | データ型 | データ例 |
---|---|---|
id | 数値データ | 1 |
name | 文字データ | ‘山田’ |
age | 数値データ | 25 |
address | 文字データ | ‘東京都’ |
created_at | 日付データ | ‘2021-06-10’ |
このように、条件指定で文字データ・日付データを指定する場合はクォーテーションで囲む、数値データはそのまま記載するということを覚えておきましょう。
では次に、先ほどから出てきている=
のように条件指定で使う比較演算子について詳しくみていきましょう!
比較演算子を使って条件を指定しよう
比較演算子は、右側の値と左側の値を比較するときに使います。
比較演算子には下記の6種類があります。
比較演算子 | 意味 |
---|---|
= | 等しい |
< | より小さい |
> | より大きい |
<= | 以下 |
>= | 以上 |
<>、!= | 等しくない |
それぞれの使い方を詳しくみていきましょう。
=(等しい)
右の値と左の値がイコールになるものを取得します。
SELECT *
FROM users
WHERE address = '東京都';
addressは文字データなので前後にクォーテーションをつける必要があります。
実行結果
id | name | age | address | created_at |
---|---|---|---|---|
1 | 山田 | 25 | 東京都 | 2021-06-10 |
6 | 近藤 | 23 | 東京都 | 2021-03-23 |
<(より小さい)
左の値が右の値より小さいものを取得します。
SELECT *
FROM users
WHERE age < 30;
実行結果
id | name | age | address | created_at |
---|---|---|---|---|
1 | 山田 | 25 | 東京都 | 2021-06-10 |
3 | 佐藤 | 28 | 北海道 | 2021-06-16 |
6 | 近藤 | 23 | 東京都 | 2021-03-23 |
WHERE句の後に指定しているage < 30
が「年齢が30歳未満」を抽出する条件になっています。
>(より大きい)
左の値が右の値よりも大きいものを取得します。
SELECT *
FROM users
WHERE created_at > '2020-12-31';
created_atは日付データなのでクォーテーションが必要です。
実行結果
id | name | age | address | created_at |
---|---|---|---|---|
1 | 山田 | 25 | 東京都 | 2021-06-10 |
2 | 鈴木 | 34 | 神奈川県 | 2021-12-18 |
3 | 佐藤 | 28 | 北海道 | 2021-06-16 |
5 | 小池 | 56 | 京都府 | 2021-04-02 |
6 | 近藤 | 23 | 東京都 | 2021-03-23 |
7 | 佐々木 | 37 | 千葉県 | 2021-01-06 |
WHERE句の後に指定しているcreated_at > '2020-12-31'
が「2021年以降に作成されたデータ」を抽出する条件になっています。
<=(以下)
左の値が右の値以下のものを取得します。
SELECT *
FROM users
WHERE id <= 3;
実行結果
id | name | age | address | created_at |
---|---|---|---|---|
1 | 山田 | 25 | 東京都 | 2021-06-10 |
2 | 鈴木 | 34 | 神奈川県 | 2021-12-18 |
3 | 佐藤 | 28 | 北海道 | 2021-06-16 |
WHERE句の後に指定しているid <= 3
が「idが3以下」を抽出する条件になっています。
>=(以上)
左の値が右の値以上のものを取得します。
SELECT *
FROM users
WHERE age >= 34;
実行結果
id | name | age | address | created_at |
---|---|---|---|---|
2 | 鈴木 | 34 | 神奈川県 | 2021-12-18 |
4 | 大野 | 45 | 大阪府 | 2020-05-20 |
5 | 小池 | 56 | 京都府 | 2021-04-02 |
7 | 佐々木 | 37 | 千葉県 | 2021-01-06 |
WHERE句の後に指定しているage >= 34
が「年齢が34歳以上」を抽出する条件になっています。
<>, !=(等しくない)
右の値と左の値が等しくないものを取得します。
SELECT *
FROM users
WHERE address <> '東京都';
もしくは
SELECT *
FROM users
WHERE address != '東京都';
文字データなのでクォーテーションが必要です。
実行結果
id | name | age | address | created_at |
---|---|---|---|---|
2 | 鈴木 | 34 | 神奈川県 | 2021-12-18 |
3 | 佐藤 | 28 | 北海道 | 2021-01-16 |
4 | 大野 | 45 | 大阪府 | 2020-05-20 |
5 | 小池 | 56 | 京都府 | 2021-04-02 |
7 | 佐々木 | 37 | 千葉県 | 2021-01-06 |
8 | 宮田 | 31 | 福岡県 | 2020-08-12 |
WHERE句の後に指定しているaddress <> '東京都'
が「住所が東京都ではない人」を抽出する条件になっています。
また、<>
と!=
の2つの書き方がありますが、実行結果は同じになるのでどちらを使ってもOKです。
論理演算子を使って複数の条件を組み合わせよう
ここまで比較演算子を使ってきましたが、次に論理演算子を使った条件指定を見ていきましょう。論理演算子も比較演算子と同様、よく使う文法であるため押さえておきましょう。
論理演算子は複数の条件式を組み合わたい場合に使用します。
WHERE句で使用できる論理演算子の種類は下記の3つです。
論理演算子 | 意味 |
---|---|
AND | ~~ かつ ~~ |
OR | ~~ または ~~ |
NOT | ~~ ではない |
それぞれの使い方を詳しく見ていきましょう。
AND(~~ かつ ~~)
左の条件式と右の条件式がイコールとなるものを取得します。
基本構文
SELECT カラム名
FROM テーブル名
WHERE 条件式1 AND 条件式2;
SELECT *
FROM users
WHERE (age <= 30) AND (address = '東京都');
実行結果
id | name | age | address | created_at |
---|---|---|---|---|
1 | 山田 | 25 | 東京都 | 2021-06-10 |
6 | 近藤 | 23 | 東京都 | 2021-03-23 |
WHERE句の後に指定している(age <= 30) AND (address = '東京都')
が「年齢が30歳以下で住所が東京都の人」を抽出する条件になっています。
分かりやすくするためにそれぞれの条件式を()で囲っていますが、()がなくても同じ結果を得られます。本記事では基本、()を付けていきたいと思います。
OR(~~ または ~~)
左の条件式と右の条件式のいずれか一方でも満たしているものを取得します。
基本構文
SELECT カラム名
FROM テーブル名
WHERE 条件式1 OR 条件式2;
SELECT *
FROM users
WHERE (id >= 7) OR (created_at < '2021-01-01');
実行結果
id | name | age | address | created_at |
---|---|---|---|---|
8 | 宮田 | 31 | 福岡県 | 2020-08-12 |
WHERE句の後に指定している(id >= 7) OR (created_at < 2021-01-01)
が「IDが7以上もしくはデータの作成日が2021年以前」を抽出する条件になっています。
NOT(~~ ではない)
NOTの後に続く条件式に当てはまらないものを取得します。
基本構文
SELECT カラム名
FROM テーブル名
WHERE NOT 条件式;
SELECT *
FROM users
WHERE NOT age <= 40;
実行結果
id | name | age | address | created_at |
---|---|---|---|---|
4 | 大野 | 45 | 大阪府 | 2020-05-20 |
5 | 小池 | 56 | 京都府 | 2021-04-02 |
WHERE句の後に指定しているNOT age <= 40
が「40歳以下ではない」を抽出する条件になっています。お気づきの方もいると思いますが、今回の条件であれば、NOTを使わずにage > 40
という条件式を書いても実現できます。
内容のまとめ
- 等しい条件を指定するなら
=
- より小さい条件を指定するなら
<
- より大きい条件を指定するなら
>
- 以下条件を指定するなら
<=
- 以上条件を指定するなら
>=
- 等しくない条件を指定するなら
<>
もしくは!=
- ~~ かつ ~~ を指定するなら
AND
- ~~ または ~~ を指定するなら
OR
- ~~ ではない を指定するなら
NOT