データ検索の発展

本章ではデータ検索の発展的な使い方について解説します。
本章の目標
  • NOT LIKE演算子をおぼえる
  • BETWEEN、NOT BETWEEN演算子をおぼえる
  • IN、NOT IN演算子をおぼえる
  • IS NULL、IS NOT NULLをおぼえる
  • 算術演算子を理解する
  • 算術演算子の使い方をおぼえる
ページの先頭へ
ページの先頭へ

1.さまざまな演算子

SQL入門講座では基本的なデータ検索と、比較演算子、「LIKE」演算子、論理演算子の「AND」「OR」演算子を学習しました。
今回はさらに発展的なデータ検索を学習します。

1. NOT LIKE演算子

「LIKE」の発展形です。まずは「LIKE」演算子の使用方法についておさらいしてみましょう。
「bookinfo」テーブルで書籍名が「SQL」で始まるデータを検索する場合は、

SELECT * FROM bookinfo WHERE title LIKE 'SQL%';

でしたね?




ではこれを「NOT LIKE」にするとどうなるでしょう?

SELECT * FROM bookinfo WHERE title NOT LIKE 'SQL%';





書籍名が「SQL」で始まらないもの、すなわち「SQL」で始まるデータ以外のデータが抽出されます。





2. BETWEENとNOT BETWEEN演算子

ある値の範囲でデータを抽出する場合を考えてみましょう。例えば「bookinfo」テーブルで価格が1500円~2000円のデータを検索する場合、今まで学習してきたことを使うと、

SELECT * FROM bookinfo WHERE price >= 1500 AND price <= 2000;

となりますね。これを「BETWEEN」演算子を使って検索することができます。
「BETWEEN」演算子の構文は次のとおりです。

SELECT 列名 FROM テーブル名 WHERE 検索対象列名 BETWEEN 値1 AND 値2;

先程の「bookinfo」テーブルの例だと、

SELECT * FROM bookinfo WHERE price BETWEEN 1500 AND 2000;

となります。こちらの方が、比較演算子と論理演算子を組み合わせた場合より見た目にもすっきり書けます。






「BETWEEN」演算子にも「NOT LIKE」演算子のように、「NOT BETWEEN」演算子があります。

SELECT 列名 FROM テーブル名 WHERE 検索対象列名 NOT BETWEEN 値1 AND 値2;

先程の「bookinfo」の例に当てはめて見ると

SELECT * FROM bookinfo WHERE price NOT BETWEEN 1500 AND 2000;

となりますが、意味は、

SELECT * FROM bookinfo WHERE price < 1500 OR price > 2000;

と同じになります。







3. INとNOT IN演算子

ある列の値をいくつか指定して検索する場合、比較演算子と論理演算子を組み合わせて使うと、

SELECT 列名 FROM テーブル名 WHERE 検索対象列=値1 OR 検索対象列=値2 OR・・・;

となりますね。
これを「IN」演算子で記述するともう少しすっきりします。

SELECT 列名 FROM テーブル名 WHERE 検索対象列 IN (値1,値2,・・・);

例えば「bookinfo」テーブルからISBN番号が「00001」「00003」「00005」のデータを検索する場合は、

SELECT * FROM bookinfo WHERE isbn='00001' OR isbn='00003' OR isbn='00005';

と書くところを、

SELECT * FROM bookinfo WHERE isbn IN ('00001','00003','00005');

と書くことができます。






「IN」演算子にも、対になる「NOT IN」演算子があります。

SELECT 列名 FROM テーブル名 WHERE 検索対象列 NOT IN (値1,値2,・・・);

これは、指定した値以外のデータが抽出されます。
「bookinfo」テーブルを例にとった場合、ISBN番号が「00001」「00003」「00005」以外のデータを検索する場合は、

SELECT * FROM bookinfo WHERE isbn NOT IN ('00001','00003','00005');

となります。
もうお分かりかと思いますが、これは

SELECT * FROM bookinfo WHERE isbn<>'00001' AND isbn<>'00003' AND isbn<>'00005';

と同じです。







4. IS NULLとIS NOT NULL演算子

値がNULLかどうかを判定する演算子です。
現在「bookinfo」テーブルにはNULLを含むデータがありませんので、まずはNULLを含むデータを作成しましょう。

「bookinfo」テーブルに下記のデータを登録してください。
isbn title price
00007 NULL 2800


INSERT INTO bookinfo(isbn,price) VALUES('00007',2800);






ではまず「IS NULL」演算子の構文です。

SELECT 列名 FROM テーブル名 WHERE 検索対象列 IS NULL;

検索対象列がNULLのデータを検索します。
「bookinfo」テーブルだと、先程追加したデータが検索されます。

SELECT * FROM bookinfo WHERE title IS NULL;







言うまでもありませんが、「IS NOT NULL」演算子はこの逆になります。

SELECT 列名 FROM テーブル名 WHERE 検索対象列 IS NOT NULL;


SELECT * FROM bookinfo WHERE title IS NOT NULL;









NULL(ヌルまたはナルと読みます)とは何でしょうか?
NULLとは、テーブルの列に値が何も設定されていない状態を指します。
これは、0でも空文字(長さが0の文字)でもスペースでもありません。
MySQLクライアントでは、表示上「NULL」となります。
試しに「bookinfo」に、書籍タイトルが0、空文字、スペースのデータを登録して、違いを見てみましょう。
※操作はしないでください。





データを見てみます。

SELECT * FROM bookinfo WHERE ISBN BETWEEN '00007' AND '00010';





0も空文字もスペースも、(表示上見えなくても)値は設定されている状態なのですが、NULLは実際には値が何もない状態ですので、注意が必要です。

ページの先頭へ

2.算術演算子

SQLでは、検索した結果に計算を加えたり、また計算結果を元に検索することができます。
ここでは計算に用いる基本的な算術演算子の使用方法について学習します。

1. 検索結果を計算する

まずは検索結果に計算を加える方法です。
基本構文は下記の通りです。

SELECT 列名または数値 算術演算子 列名または数値 FROM テーブル名 (必要によりWHERE句)

算術演算子には下記のものがあります。

演算子 使用例 意味
+ a+b aとbを足す
- a-b aからbを引く
* a*b aとbをかける
/ a/b aをbで割る
% a%b aをbで割った余り

「bookinfo」テーブルの価格を税込みで表示してみましょう。

SELECT isbn,title,price*1.05 FROM bookinfo;

となります。

isbn title price
00001 SQL入門テキスト 1050 * 1.05 = 1102.50
00002 SQL基礎テキスト 2300 * 1.05 = 2415.00
00003 Java基礎テキスト 1050 * 1.05 = 1102.50
00004 PHP基礎テキスト 2100 * 1.05 = 2205.00
00005 Java Struts基礎テキスト 3800 * 1.05 = 3990.00
00006 Android基礎テキスト 2000 * 1.05 = 2100.00
00007 NULL 2800 * 1.05 = 2940.00






2. 計算結果を元に検索する

SQLでは、WHERE句の中に算術演算子を記述することができます。
先程は計算結果に消費税計算を加えていましたが、今度は税込みの価格が2200円以上のデータを検索してみましょう。

SELECT * FROM bookinfo WHERE price*1.05 >= 2200;








「WHERE」句で計算した結果は、「SELECT」句の検索結果とは無関係なので注意しましょう。
計算結果表示させたい場合は、「SELECT」句でも計算する必要があります。

ページの先頭へ

3.本章のまとめ

本章では抽出条件の使用する演算子に加え、算術演算子の使用方法について学習しました。
どれも使用頻度の高いものばかりですので、この章でしっかりとマスターしておいてください

ページの先頭へ