以前に以下の記事で、SQLでデータ(レコード)を取得する基本的な命令であるSELECT文についてご紹介しました。
上記の記事では、テーブルのすべての行(レコード)を取得しています。
しかし、テーブルに登録されているすべてのデータを取得するのではなく、特定の行のみ抜き出して取得したい場合もあります。
例えば、A、B、Cの3つのレコードがテーブルにある中で、Bのレコードのみに限定したい場合などです。
そこで今回は、テーブルに登録(格納)されているデータ(レコード)のうち、特定の行のみに絞り込んで抽出(フィルタリング)する方法について紹介します。
目次
データの取得に使用するサンプルテーブル
本記事では、データを取得するためのサンプルテーブルとして、以下のテーブルを使用します。
テーブル定義
テーブル名は「ユーザー」とします。ユーザー情報を管理する想定のテーブルになります。
テーブルの列には、主キー(プライマリーキー)となる「ID」、氏名を管理するための「氏名」、性別を「1: 男性」「2: 女性」「3: その他」で管理する性別、Eメールアドレスを管理するための「Eメール」の4つの列を作成します。
列名 | データ型 | 主キー |
---|---|---|
ID | int | ○ |
氏名 | varchar(50) | |
性別 | int | |
Eメール | varchar(100) |
テーブルを作成するCREATE文のSQL
サンプルとして使用するユーザーテーブルを作成するSQLは次のようになります。
1 2 3 4 5 6 7 |
CREATE TABLE ユーザー ( ID int PRIMARY KEY NOT NULL, 氏名 varchar(50) NOT NULL, 性別 int NOT NULL, Eメール varchar(100) NULL ); |
上記のSQLを実行するとテーブルが作成されます。
テーブルにレコードを挿入するINSERT文のSQL
1 2 3 4 5 6 7 8 9 |
INSERT INTO ユーザー (ID, 氏名, 性別, Eメール) VALUES (100, '山田 太郎', 1, 'yamada@excample.com'), (200, '田中 花子', 2, 'tanaka@excample.com'), (300, '鈴木 一郎', 1, 'suzuki@excample.com'), (400, '佐藤 さくら',2, 'sato@excample.com'), (500, '白鳥 未来',2, 'shiratori@excample.com'), (600, '二階堂 彦摩呂',1, 'nikaido@excample.com'); |
上記のSQLを実行するとテーブルにデータ(レコード)が挿入(登録)されます。
ユーザーテーブルへのデータのインサートは、複数のレコードを1回のSQLで一括挿入する形式で記述しています。
1回のINSERTで複数行のレコードをテーブルに一括で挿入する方法については、以下の記事を参照してください。
基準となるSELECT~FROM句のSQL
本記事では、データを取得する基本のSQLとして、以下のSELECT文を使用します。
1 2 3 4 5 6 7 |
SELECT ID, 名前, 性別, Eメール FROM ユーザー |
上記のSQLを実行した結果は以下のようになります。
No. | ID | 氏名 | 性別 | Eメール |
---|---|---|---|---|
1 | 100 | 山田 太郎 | 1 | yamada@excample.com |
2 | 200 | 田中 花子 | 2 | tanaka@excample.com |
3 | 300 | 鈴木 一郎 | 1 | suzuki@excample.com |
4 | 400 | 佐藤 さくら | 2 | sato@excample.com |
5 | 500 | 白鳥 未来 | 2 | shiratori@excample.com |
6 | 600 | 二階堂 彦摩呂 | 1 | nikaido@excample.com |
抽出条件を指定するWHERE
テーブルから特定のデータ(レコード)のみを抽出する場合は、WHEREキーワードを使用します。
WHERE句では、条件となる値を照合する列(参照先)に対して、照合する値(参照値)を指定します。
1 |
WHERE 列 = 値 |
例えば、ユーザーテーブルのIDが200のデータを抽出したい場合は、以下のように記述することができます。
1 |
WHERE ID = 200 |
WHERE句は改行することで見やすくなります。
1 2 |
WHERE ID = 200 |
照合したい列(条件を指定する列)が複数ある場合は、ANDキーワードを使うことで可能になります。
1 2 3 4 5 6 |
WHERE 列1 = 値1 AND 列2 = 値2 AND 列3 = 値3 |
SELECT~FROM句と連結する
WHERE句は、FROM句の後に記述するというルールがありますので、ユーザーテーブルに対してIDが200のデータを抽出する場合は、以下のようなSQLになります。
1 2 3 4 5 6 7 8 9 |
SELECT ID, 名前, 性別, Eメール FROM ユーザー WHERE ID = 200; |
上記のSQLを実行して得られる結果表は、以下のようになります。
No. | ID | 氏名 | 性別 | Eメール |
---|---|---|---|---|
1 | 200 | 田中 花子 | 2 | tanaka@excample.com |
WHERE句の条件指定
上記の例ではIDが200の列を対象としてデータを抽出しましたので、ID列に対して「=演算子」を使用して値を照合していますが、
=(イコール)以外の演算子を使うこともできます。
例えば、ユーザーのIDが300以下のデータのみ抽出するのであれば
1 2 3 4 5 6 7 8 9 |
SELECT ID, 名前, 性別, Eメール FROM ユーザー WHERE ID <= 300; |
のようになります。
No. | ID | 氏名 | 性別 | Eメール |
---|---|---|---|---|
1 | 100 | 山田 太郎 | 1 | yamada@excample.com |
2 | 200 | 田中 花子 | 2 | tanaka@excample.com |
3 | 300 | 鈴木 一郎 | 1 | suzuki@excample.com |
ユーザーIDが200から400の間であれば
1 2 3 4 5 6 7 8 9 10 11 |
SELECT ID, 名前, 性別, Eメール FROM ユーザー WHERE ID >= 200 AND ID <= 400; |
と記述できます。
No. | ID | 氏名 | 性別 | Eメール |
---|---|---|---|---|
1 | 200 | 田中 花子 | 2 | tanaka@excample.com |
2 | 300 | 鈴木 一郎 | 1 | suzuki@excample.com |
3 | 400 | 佐藤 さくら | 2 | sato@excample.com |
範囲での条件指定部分は以下のように記述した方が、可読性が高いという人もいます
1 2 3 4 5 6 7 8 9 |
SELECT ID, 名前, 性別, Eメール FROM ユーザー WHERE 200 <= ID AND ID <= 400; |
このあたりは、指定する抽出条件によって、適宜書き方を変えてください。
文字列に対する条件指定
上記の例ではユーザーIDが数値なので、数値を条件として照合を行いましたが、文字列値に対しても同様に条件を指定することができます。
例えば、ユーザーの氏名に対して条件を指定する場合は、以下のようになります。
1 2 |
WHERE 氏名 = '条件の値' |
氏名が「鈴木 一郎」のデータのみ抽出する例を以下に記載しておきます。
1 2 3 4 5 6 7 8 9 |
SELECT ID, 名前, 性別, Eメール FROM ユーザー WHERE 氏名 = '鈴木 一郎'; |
SQLの実行結果は以下のようになります。
No. | ID | 氏名 | 性別 | Eメール |
---|---|---|---|---|
1 | 300 | 鈴木 一郎 | 1 | suzuki@excample.com |