【本サイトではGoogleアドセンス、または、アフィリエイト広告を利用しています。】
WHERE句とは?
WHERE句とは、データを取得する際に条件を指定するための構文です。
前回お話したSELECT文を使うことでデータが取得できますが、
データベースからデータを取ってくるということを考えた時、
テーブルにあるデータをすべて取得するというよりも、
条件を指定して必要な情報だけ見たいというケースの方が多いはずです。
そんな時、SELECTと合わせて使うのがこのWHERE句です。
WHERE句の書き方
WHERE句は以下のように書きます。
SELECT
[カラム名]
, ・・・
FROM
[テーブル名]
WHERE
[条件式];
「SELECT~FROM~」に続けてWHERE句を付加します。
また、WHERE句の中にはデータを特定するための条件を式で指定します。
ちなみに、WHERE句を省略した場合は、条件なしという扱いになり、テーブルにあるすべてのデータが取得されます。
WHERE句に指定できる条件
ということで、今から代表的な条件式の指定方法を以下で紹介していきます!
例として、表1のテーブルに、表2のデータが入っているとします。
論理名 | 物理名 | データ型 | 主キー |
---|---|---|---|
クラス | CLASS_NO | CHAR(1) | 1 |
出席番号 | STUDENT_NO | NUMBER(3) | 2 |
名前 | NAME | VARCHAR2(30) | |
身長(cm) | HEIGHT | NUMBER(4,1) |
クラス | 出席番号 | 名前 | 身長(cm) |
---|---|---|---|
1 | 1 | ジョニー | 170.0 |
1 | 2 | ボビー | 198.0 |
1 | 3 | カレン | 157.0 |
2 | 1 | デキスギ | 150.0 |
2 | 2 | ノビタ | 145.0 |
2 | 3 | ホネカワ | 148.0 |
テーブルの作成方法はこちらで説明しています!
データの登録方法はこちらです!
比較演算子の種類
まずは、条件式に使う比較演算子についてです。
比較演算子とは、2つの値を比較する際に使う記号のことです。
値の大きさを比べたり、指定する内容に等しいか調べたりする時に使います。
Oracleで使う比較演算子には、以下のような種類があります。
比較演算子 | 説明 |
---|---|
= | 等しい |
<> | 等しくない |
!= | 等しくない |
< | より小さい |
<= | 以下 |
> | より大きい |
>= | 以上 |
IS NULL | NULLである |
IS NOT NULL | NULLではない |
LIKE | 指定したパターンに一致する |
BETWEEN | 指定した範囲内にある |
IN | 指定した値の中に含まれる |
数学で使う記号と似ているものは直感的で使いやすいのではないでしょうか。
例えば、「2組の生徒」を取得するSQLは以下です。
カラム名、比較する値、比較演算子を使って条件式を作ります。
SELECT
*
FROM
STUDENT
WHERE
CLASS_NO = '2';
実行結果は以下です。
期待通りの結果が出ました!
記号以外の演算子については、後ほど1つ1つ例を使って説明します!
「!=」と「<>」について
「!=」と「<>」は同じ「等しくない」という意味を持ちますが、
「!=」Oracle固有の演算子、「<>」は標準SQLの演算子となります。
標準SQLとは、Oracleだけでなく、
異なる種類のデータベース間での互換性や移植性を考慮した、共通のSQL仕様のことです。
では、どちらを使うべきでしょうか?
例えば、Oracleでしか認識できない「!=」を使ったSQLをシステムに組み込んでいたとして、
何かの都合で他のデータベースに移行するとなった場合、
他のデータベース上で同じSQLを実行してもエラーとなるので、そのままでは使うことができません。
このような事態を避けるために、SQLの汎用性も考えて、標準SQLの演算子である「<>」を使うようにしましょう。
複数条件すべてに一致する(AND)
WHERE句に指定できる条件は1つだけではありません。
複数の条件を同時に指定することもできます。
ANDは、複数の条件すべてに一致するデータを取得する時に使います。
WHERE
[条件式1]
AND [条件式2]
AND ・・・
例えば、「身長が150cmより小さい2組の生徒」を取得する場合、以下のようなSQLになります。
SELECT
*
FROM
STUDENT
WHERE
HEIGHT < 150
AND CLASS_NO = '2';
実行結果は以下です。
条件はいくつでもANDで追加できるので、データを絞り込む際に使いましょう。
複数条件のいずれかに一致する(OR)
ORは、複数条件のいずれか1つに一致するデータを取得する時に使います。
WHERE
[条件式1]
OR [条件式2]
OR ・・・
例えば、「1組、または、出席番号が2番の生徒」を取得する場合、以下のようなSQLになります。
SELECT
*
FROM
STUDENT
WHERE
CLASS_NO = '1'
OR STUDENT_NO = 2;
実行結果は以下です。
OR条件はいくつでも追加できるので、異なる条件を一気に指定してデータを取得したい時に使いましょう。
NULLである(IS NULL)
NULLとは、カラムに値が入っていない、つまり、データが空である状態です。
IS NULLは、カラムに入っている値がNULL(空)であるデータを取得する時に使います。
WHERE
[カラム名] IS NULL
例えば、「名前がNULL(空)になっているデータ」を取得する場合、以下のようなSQLになります。
SELECT
*
FROM
STUDENT
WHERE
NAME IS NULL;
実行結果は以下です。
例のデータに名前がNULLのものはないので、結果は0件になります。
NULLではない(IS NOT NULL)
IS NOT NULLは、カラムがNULLでない、
つまり、何かの値が入っているデータを取得する時に使います。
WHERE
[カラム名] IS NOT NULL
例えば、「名前に値が入っているデータ」を取得する場合、以下のようなSQLになります。
SELECT
*
FROM
STUDENT
WHERE
NAME IS NOT NULL;
実行結果は以下です。
例ではすべてのデータに名前が入っているので、全件取得されます。
指定したパターンに一致する(LIKE)
LIKEは、指定した文字のパターンに一致するデータを取得する時に使います。
WHERE
[カラム名] LIKE '[文字パターン]'
「=」を使った完全一致ではなく、「~という文字を含む」といった感じであいまい検索をするイメージです。
LIKEの文字パターンは、ワイルドカードと呼ばれる以下のような記号を使って表現します。
ワイルドカード | 説明 |
---|---|
% | 任意の0文字以上の文字列。 |
_ | 任意の1文字。 |
例えば、「『カ』という文字を含む生徒」を取得する場合、以下のようなSQLになります。
SELECT
*
FROM
STUDENT
WHERE
NAME LIKE '%カ%';
実行結果は以下です。
名前に『カ』の文字を持つ生徒データが取得できました。
上記の例は、文字のどこか一部が一致するものを探すので、部分一致と呼ばれます。
同様の検索方法として、「『カ』で始まるデータ」は「カ%」、「『カ』で終わるデータ」は「%カ」となり、
前者の例を前方一致、後者の例を後方一致と呼びます。
指定した範囲内にある(BETWEEN)
BETWEENは、指定した範囲内にあるデータを取得する時に使います。
WHERE
[カラム名] BETWEEN [下限値] AND [上限値]
日本語で表現すると「~以上~以下のデータ」というイメージです。
例えば、「身長150cm以上~180cm以下の生徒」を取得する場合、以下のようなSQLになります。
SELECT
*
FROM
STUDENT
WHERE
HEIGHT BETWEEN 150 AND 180;
実行結果は以下です。
以上、以下という判定になるので、上限、下限に指定した値は含まれるという点に注意しましょう。
指定した値に含まれる(IN)
INは、指定した集合値のいずれかに一致するデータを取得する時に使います。
WHERE
[カラム名] IN ([値1], [値2], ・・・)
例えば、「名前が『ジョニー』『ノビタ』のいずれかの値に一致する生徒」を取得する場合、
以下のようなSQLになります。
SELECT
*
FROM
STUDENT
WHERE
NAME IN ('ジョニー', 'ノビタ');
実行結果は以下です。
また、このSQLは、ORを使うことで以下のように書き換えることができます。
SELECT
*
FROM
STUDENT
WHERE
NAME = 'ジョニー'
OR NAME = 'ノビタ';
実行結果はINを使った時と同じになるので、実際に実行して試してみましょう!
WHEREの使い方 まとめ
OracleのWHEREの使い方について以下説明しました。
WHERE句に指定する条件式の組合せパターンは無数にあって、SQLを組む人の考え方やクセによって変わってきます。
同じデータを取得するSQLでも、
条件式の書き方によっては、効率が大きく変わってくる(SQLの実行時間が変わってくる)ので、
瞬時に目的のデータを取得できる条件をうまく探し出せるように、
それぞれの条件の特徴をしっかり押さえておきましょう!