WHERE句を使って検索条件を指定する:SELECT文の基本

SELECT文を使ってデータを取得する際に、条件を指定したい時があると思います。

例えば、大量のユーザーデータの中から年齢が30歳以上の人だけを抽出したい、大量の商品ラインナップから商品Bの情報だけを抽出したい、といった具合です。

条件指定を実現するのがSQLのWHERE句です。

WHERE句を習得すれば、様々な条件を指定して情報を取得できるようになるため、データ分析の幅が大きく広がります。

本記事では、そんなWHERE句の使い方を分かりやすく解説していきます。

WHERE句とは?

SELECT文を使って検索条件を指定する場合は「WHERE句」を使います。WHEREの後に条件を指定することで、その条件に合ったデータを取得することができます。

基本形は下記です。

SQL
SELECT カラム名
FROM テーブル名
WHERE 条件式;

今回も下記のようなusersテーブルを例にして考えていきます。

idnameageaddresscreated_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

例えば、この中から住所が東京都の人だけを取得したい場合、下記のようなクエリを書きます。

SQL
SELECT *
FROM users
WHERE address = '東京都';

実行結果

idnameageaddresscreated_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種類があります。

比較演算子意味
=等しい
<より小さい
>より大きい
<=以下
>=以上
<>、!=等しくない

それぞれの使い方を詳しくみていきましょう。

=(等しい)

右の値と左の値がイコールになるものを取得します。

住所が東京都と一致するレコードを取得する場合

SQL
SELECT *
FROM users
WHERE address = '東京都';

addressは文字データなので前後にクォーテーションをつける必要があります。

実行結果

idnameageaddresscreated_at
1山田25東京都2021-06-10
6近藤23東京都2021-03-23

<(より小さい)

左の値が右の値より小さいものを取得します。

年齢が30歳未満のレコードを取得する場合

SQL
SELECT *
FROM users
WHERE age < 30;

実行結果

idnameageaddresscreated_at
1山田25東京都2021-06-10
3佐藤28北海道2021-06-16
6近藤23東京都2021-03-23

WHERE句の後に指定しているage < 30が「年齢が30歳未満」を抽出する条件になっています。

>(より大きい)

左の値が右の値よりも大きいものを取得します。

2021年以降に作成されたレコードを取得する場合

SQL
SELECT *
FROM users
WHERE created_at > '2020-12-31';

created_atは日付データなのでクォーテーションが必要です。

実行結果

idnameageaddresscreated_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年以降に作成されたデータ」を抽出する条件になっています。

<=(以下)

左の値が右の値以下のものを取得します。

idが3以下のレコードを取得する場合

SQL
SELECT *
FROM users
WHERE id <= 3;

実行結果

idnameageaddresscreated_at
1山田25東京都2021-06-10
2鈴木34神奈川県2021-12-18
3佐藤28北海道2021-06-16

WHERE句の後に指定しているid <= 3が「idが3以下」を抽出する条件になっています。

>=(以上)

左の値が右の値以上のものを取得します。

年齢が34歳以上のレコードを取得する場合

SQL
SELECT *
FROM users
WHERE age >= 34;

実行結果

idnameageaddresscreated_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歳以上」を抽出する条件になっています。

<>, !=(等しくない)

右の値と左の値が等しくないものを取得します。

住所が東京都ではないレコードを取得する場合

SQL
SELECT *
FROM users
WHERE address <> '東京都';

もしくは

SQL
SELECT *
FROM users
WHERE address != '東京都';

文字データなのでクォーテーションが必要です。

実行結果

idname age addresscreated_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(~~ かつ ~~)

左の条件式と右の条件式がイコールとなるものを取得します。

基本構文

SQL
SELECT カラム名
FROM テーブル名
WHERE 条件式1 AND 条件式2;

年齢が34歳以下かつ住所が東京都のレコードを取得する場合

SQL
SELECT *
FROM users
WHERE (age <= 30) AND (address = '東京都');

実行結果

idnameageaddresscreated_at
1山田25東京都2021-06-10
6近藤23東京都2021-03-23

WHERE句の後に指定している(age <= 30) AND (address = '東京都')が「年齢が30歳以下で住所が東京都の人」を抽出する条件になっています。

分かりやすくするためにそれぞれの条件式を()で囲っていますが、()がなくても同じ結果を得られます。本記事では基本、()を付けていきたいと思います。

OR(~~ または ~~)

左の条件式と右の条件式のいずれか一方でも満たしているものを取得します。

基本構文

SQL
SELECT カラム名
FROM テーブル名
WHERE 条件式1 OR 条件式2;

IDが7以上またはデータ作成日が2021年より前のレコードを取得する場合

SQL
SELECT *
FROM users
WHERE (id >= 7) OR (created_at < '2021-01-01');

実行結果

idnameageaddresscreated_at
8宮田31福岡県2020-08-12

WHERE句の後に指定している(id >= 7) OR (created_at < 2021-01-01)が「IDが7以上もしくはデータの作成日が2021年以前」を抽出する条件になっています。

NOT(~~ ではない)

NOTの後に続く条件式に当てはまらないものを取得します。

基本構文

SQL
SELECT カラム名
FROM テーブル名
WHERE NOT 条件式;

年齢が40歳以下ではないレコードを取得する場合

SQL
SELECT *
FROM users
WHERE NOT age <= 40;

実行結果

idnameageaddresscreated_at
4大野45大阪府2020-05-20
5小池56京都府2021-04-02

WHERE句の後に指定しているNOT age <= 40が「40歳以下ではない」を抽出する条件になっています。お気づきの方もいると思いますが、今回の条件であれば、NOTを使わずにage > 40という条件式を書いても実現できます。

内容のまとめ

  • 等しい条件を指定するなら=
  • より小さい条件を指定するなら<
  • より大きい条件を指定するなら>
  • 以下条件を指定するなら<=
  • 以上条件を指定するなら>=
  • 等しくない条件を指定するなら<>もしくは!=
  • ~~ かつ ~~ を指定するならAND
  • ~~ または ~~ を指定するならOR
  • ~~ ではない を指定するならNOT