複雑な検索①
条件付き検索
それでは、SELECT文を使ってデータを取得してみましょう。最初に、データベースschoolに、以下の構造を持ったresource(教材)テーブルを作成し、追加しましょう。(表4-1.~4-2.)
表4-1.テーブルresource項目 | 列名 | データ型 | 属性 |
---|---|---|---|
商品コード | code | char(6) | primary key(主キー) |
商品名 | name | varchar(40) | NOT NULL(空白を許さない) |
分類 | class | char(4) | NOT NULL(空白を許さない) |
定価 | price | int | NOT NULL(空白を許さない) |
このテーブルには次のようなデータが格納されているとします。
表4-2.テーブルresourceのデータcode | name | class | price |
---|---|---|---|
100001 | 英語テキスト | text | 2500 |
100002 | 数学テキスト | text | 2700 |
100003 | 国語テキスト | text | 3000 |
100101 | 英語DVD | mdvd | 3000 |
100102 | 数学学習ソフト | sftw | 4900 |
100103 | 英語学習ソフト | sftw | 5400 |
100201 | 国語副読本 | sbtx | 1200 |
100202 | 英語問題集 | pbbk | 2500 |
100203 | 数学問題集 | pbbk | 2800 |
100C01 | 英語辞書 | dict | 8200 |
以上のテーブルの生成、およびデータの挿入を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文でデータの内容を表示してみましょう。
全データの検索とすると、以下のようにすべてのデータが表示されます。(図4-1.)
図4-1.resourceテーブルの内容 |
---|
WHEREによる検索
WHERE句による選択
ここでは、更に検索に条件をつけてみましょう。これを「選択」と呼びます。選択においては、SELECT文を発行した後に、WHERE句をつけて、条件を記述します。書式は以下の通りです。
WHEREによる検索では、いくつか例を見てみましょう。
Sample402.sqlSELECT name,price FROM resource WHERE class='text';
を実行すると、class(分類)がtextのレコードを選択して、nameとpriceの内容を表示します。実行結果は、以下の通りになります。(図4-2.)
図4-2.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の実行結果 |
---|
結果を見ると、値段(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の実行結果 |
---|
この結果は、分類が「text」か、「pbbk」のもの、いずれかを選んで表示するようにしています。このように、「OR」条件をつければ、複数の検索条件のうち、どれかが成り立っていれば、それが表示されます。
ここでのサンプルは、ANDおよぼORの条件を2つしか設定していませんが、それ以上の数を設定することも可能です。
WHERE句のオプション
BETWEEN
条件検索に用いることができるのは、WHERE句には、さまざまなオプションを追加することができます。ここでは、それ以外の検索条件をいくつか紹介したいと思います。まず手始めに、BETWEEN句について紹介します。
BETWEENは、数値がある値の範囲にあることを示す句です。「BETWEEN 値1 AND 値2」という書き方をします。
BETWEENによる検索まずは、以下のサンプルを実行してみてください。
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の実行結果 |
---|
IN
続いて、IN条件について説明します。IN条件は値が指定した値のリストの中にあるかを比較します。書式は以下の通りです。
INによる検索これは、列が、値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の実行結果 |
---|
LIKE
LIKEは、文字の検索条件を指定します。ここで、%と_(アンダースコア)は特殊な意味が割り当てられており、%は「任意の文字数の任意の文字」、_は「1文字の任意の文字」を表します。これらは、メタ文字と呼ばれるものです。書式は以下のようになります。
LIKEによる検索では、実際の検索の例を見てみましょう。
Sample407.sql(LIKEを用いた例)SELECT name,price FROM resource WHERE code LIKE '1001%';
実行すると、次の結果と同様の結果が得られます。(図4-7.)これは、codeが「1001」から始まる行のname,およびpriceを取得したものです。
図4-7.Sample407.sqlの実行結果 |
---|
サブクエリ
サブクエリとは
サブクエリとはSELECT文で取得した結果を、更に他のSELECT文で利用する使い方です。またの呼び方を、副問い合わせとも言います。記述方法は、以下の通りになります。WHERE句の中でカラムの値などと比較する値としてサブクエリを使う方法について試してみます。例えば次のように使います。
サブクエリの記述方法例サブクエリのSELECT文は全体を括弧で囲んで記述します。
WHERE句の条件としてサブクエリが記述されており、サブクエリのSELECT文で取得した値とカラムの値を比較しています。比較演算子を使った比較を行う場合はサブクエリは1つのカラムの値だけを取得し、そして取得するデータは1つだけでなければなりません。
このようにサブクエリを使うことで、他のテーブルから取得した何らかの値を使って別のSELECT文を実行することができます。なお上記では「=」演算子を用いていますが「<」や「>=」など他の比較演算子でも同じように使うことができます。
サブクエリのサンプル
では、実際のサンプルを見てみましょう。いま、以下のSQL文を実行してみてください。
Sample408.sqlSELECT * 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の実行結果 |
---|
このように、SELECT文の結果をもとに、さらにSELECTなどの処理を行うのが、サブクエリです。