複雑な検索①

条件付き検索

それでは、SELECT文を使ってデータを取得してみましょう。最初に、データベースschoolに、以下の構造を持ったresource(教材)テーブルを作成し、追加しましょう。(表4-1.~4-2.)

表4-1.テーブルresource
項目列名データ型属性
商品コードcodechar(6)primary key(主キー)
商品名namevarchar(40)NOT NULL(空白を許さない)
分類classchar(4)NOT NULL(空白を許さない)
定価priceintNOT NULL(空白を許さない)

このテーブルには次のようなデータが格納されているとします。

表4-2.テーブルresourceのデータ
codenameclassprice
100001英語テキストtext2500
100002数学テキストtext2700
100003国語テキストtext3000
100101英語DVDmdvd3000
100102数学学習ソフトsftw4900
100103英語学習ソフトsftw5400
100201国語副読本sbtx1200
100202英語問題集pbbk2500
100203数学問題集pbbk2800
100C01英語辞書dict8200

以上のテーブルの生成、およびデータの挿入をSQL文で表すと、以下のようになります。検索をする前にまずは準備しておきましょう。

Sample401.sql
# テーブルresourceの生成
CREATE TABLE resource(
    code        char(6) primary key,
    name        varchar(40) NOT NULL,
    class       char(4) NOT NULL,
    price       int NOT NULL
);
 
# データの挿入
INSERT INTO resource VALUES('100001','英語テキスト','text',2500);
INSERT INTO resource VALUES('100002','数学テキスト','text',2700);
INSERT INTO resource VALUES('100003','国語テキスト','text',3000);
INSERT INTO resource VALUES('100101','英語DVD','mdvd',3000);
INSERT INTO resource VALUES('100102','数学学習ソフト','sftw',4900);
INSERT INTO resource VALUES('100103','英語学習ソフト','sftw',5400);
INSERT INTO resource VALUES('100201','国語副読本','sbtx',1200);
INSERT INTO resource VALUES('100202','英語問題集','pbbk',2500);
INSERT INTO resource VALUES('100203','数学問題集','pbbk',2800);
INSERT INTO resource VALUES('100C01','英語辞書','dict',8200);

確認のために、以下のようにSELECT文でデータの内容を表示してみましょう。

全データの検索
SELECT * FROM resource;

とすると、以下のようにすべてのデータが表示されます。(図4-1.)

図4-1.resourceテーブルの内容
resourceテーブルの内容

WHEREによる検索

WHERE句による選択

ここでは、更に検索に条件をつけてみましょう。これを「選択」と呼びます。選択においては、SELECT文を発行した後に、WHERE句をつけて、条件を記述します。書式は以下の通りです。

WHEREによる検索
SELECT … FROM テーブル名 WHERE 条件式

では、いくつか例を見てみましょう。

Sample402.sql
SELECT name,price FROM resource WHERE class='text';

を実行すると、class(分類)がtextのレコードを選択して、nameとpriceの内容を表示します。実行結果は、以下の通りになります。(図4-2.)

図4-2.Sample402.sqlの実行結果
Sample402.sqlの実行結果

このように、WHERE句を用いれば、ある条件が成り立つ場合の結果を検索して出力することができます。このとき、検索条件の比較に使える演算子は以下の通りです。(表4-2.)

表4-2.WHERE句の比較に使える演算子
演算子意味
=等しい
<より小さい
>より大きい
<=以下
>=以上
<>等しくない

複数条件のWHERE句

さらに、条件式に「AND」や「OR」演算子を使うと複数の条件を記述できます。「AND」は、「かつ」という意味で、複数の条件が同時に成り立つ場合、「OR」は「か」という意味で、複数の条件のうち、どれかが成り立つ場合を指します。

Sample403.sql(ANDを用いた例)
SELECT name,price FROM resource WHERE price >= 3000 AND price < 5000;

これを実行すると、以下のような結果が得られます。(図4-3.)

図4-3.Sample403.sqlの実行結果
Sample403.sqlの実行結果

結果を見ると、値段(price)が、3000円以上、5000円未満の商品名(name)と値段(price)が表示されます。

Sample404.sql(ORを用いた例)
SELECT name,price FROM resource WHERE class='text' OR class='pbbk';

これを実行すると、以下のような結果が得られます。(図4-4.)

図4-4.Sample404.sqlの実行結果
Sample404.sqlの実行結果

この結果は、分類が「text」か、「pbbk」のもの、いずれかを選んで表示するようにしています。このように、「OR」条件をつければ、複数の検索条件のうち、どれかが成り立っていれば、それが表示されます。

ここでのサンプルは、ANDおよぼORの条件を2つしか設定していませんが、それ以上の数を設定することも可能です。

WHERE句のオプション

BETWEEN

条件検索に用いることができるのは、WHERE句には、さまざまなオプションを追加することができます。ここでは、それ以外の検索条件をいくつか紹介したいと思います。まず手始めに、BETWEEN句について紹介します。

BETWEENは、数値がある値の範囲にあることを示す句です。「BETWEEN 値1 AND 値2」という書き方をします。

BETWEENによる検索
SELECT … FROM テーブル名 WHERE 列名 BETWEEN 値1 AND 値2

まずは、以下のサンプルを実行してみてください。

Sample405.sql(BETWEENを用いた例)
SELECT name,price FROM resource WHERE price BETWEEN 2000 AND 5000;

実行すると、次の結果と同様の結果が得られます。(図4-5.)これは、priceが2000から5000の間の行を検索し、そのnameとpriceを表示しています。

図4-5.Sample405.sqlの実行結果
BETWEEN句によるの実行結果

IN

続いて、IN条件について説明します。IN条件は値が指定した値のリストの中にあるかを比較します。書式は以下の通りです。

INによる検索
SELECT … FROM テーブル名 WHERE 列名 IN(値1,値2)

これは、列が、値1か値2のどちらかであった場合、その値を取得するというものです。では、実際に例を見てみましょう。

Sample406.sql(INを用いた例)
SELECT name,price FROM resource WHERE class IN ('sftw','pbbk');

実行すると、次の結果と同様の結果が得られます。(図4-6.)これは、INが「sftw」か「pbbk」の行のname,およびpriceを取得したものです。

図4-6.Sample406.sqlの実行結果
BETWEEN句によるの実行結果

LIKE

LIKEは、文字の検索条件を指定します。ここで、%と_(アンダースコア)は特殊な意味が割り当てられており、%は「任意の文字数の任意の文字」、_は「1文字の任意の文字」を表します。これらは、メタ文字と呼ばれるものです。書式は以下のようになります。

LIKEによる検索
SELECT … FROM テーブル名 WHERE 列名 LIKE 検索条件

では、実際の検索の例を見てみましょう。

Sample407.sql(LIKEを用いた例)
SELECT name,price FROM resource WHERE code LIKE '1001%';

実行すると、次の結果と同様の結果が得られます。(図4-7.)これは、codeが「1001」から始まる行のname,およびpriceを取得したものです。

図4-7.Sample407.sqlの実行結果
LIKEによるの実行結果

サブクエリ

サブクエリとは

サブクエリとはSELECT文で取得した結果を、更に他のSELECT文で利用する使い方です。またの呼び方を、副問い合わせとも言います。記述方法は、以下の通りになります。WHERE句の中でカラムの値などと比較する値としてサブクエリを使う方法について試してみます。例えば次のように使います。

サブクエリの記述方法例
SELECT 列名1 FROM テーブル名1 WHERE 列名1 = (SELECT 列名2 FROM テーブル名);

サブクエリのSELECT文は全体を括弧で囲んで記述します。

WHERE句の条件としてサブクエリが記述されており、サブクエリのSELECT文で取得した値とカラムの値を比較しています。比較演算子を使った比較を行う場合はサブクエリは1つのカラムの値だけを取得し、そして取得するデータは1つだけでなければなりません。

このようにサブクエリを使うことで、他のテーブルから取得した何らかの値を使って別のSELECT文を実行することができます。なお上記では「=」演算子を用いていますが「<」や「>=」など他の比較演算子でも同じように使うことができます。

サブクエリのサンプル

では、実際のサンプルを見てみましょう。いま、以下のSQL文を実行してみてください。

Sample408.sql
SELECT * FROM resource WHERE class=(SELECT class FROM resource WHERE price = 2700);

順序としては、まず()内のSQL文が実行されます。まず、()内で、resourceテーブルからpriceが2700となる行の、カラムclassの値を取得します。その結果は、「text」なので、外側のSELECT文で、classが「text」となる行をすべて検索し、表示しています。(図4-8.参照)

図4-8.Sample408.sqlの実行結果
Sample408.sqlの実行結果

このように、SELECT文の結果をもとに、さらにSELECTなどの処理を行うのが、サブクエリです。