こんにちは、ECF Techブログ
担当のMichiharu.Tです。
本記事はSQL文について、実際に動作させながら学習する入門記事の第3回となります。本記事の題材となっているデータベース内の各表、および学習の始め方については、下記の第1回の記事からご覧ください。
SELECT文の基本
前回に引き続きSELECT文の基本を学習します。今回は主にWHERE句における様々な条件式の記述について学んでいきたいと思います。下に条件式に使える演算子を一覧表示します。
演算子 | 概要 | 今回の学習対象 |
---|---|---|
比較演算子 | 列と値を比較する | |
LIKE演算子 | 列と文字列パターンを比較する | |
IN演算子 | 列が値の集合のどれかに該当するかを判定する | 〇 |
NOT IN演算子 | 列が値の集合のどれにも該当しないことを判定する | 〇 |
BETWEEN演算子 | 列が特定の範囲にあるかを判定する | 〇 |
論理演算子 | 複数の条件式を組み合わせる | 〇 |
IS NULL演算子 | 列の値が空かどうかを判定する | 〇 |
IS NOT NULL演算子 | 列の値が空でないかどうかを判定する | 〇 |
IN演算子
まずは IN演算子 です。まずはWHERE句に書く場合の凡例をご覧ください。
列名 IN(値1,値2,値3....)
IN演算子は、指定した列が()内のいずれかの値と一致しているものを該当行と判定する演算子です。実行例を見てみましょう。
実行例1
商品表(items)から、商品ID(iid)が「1,3,5」のいずれかと一致するものを取得し、全列を表示する。
SELECT * FROM items WHERE iid IN(1,3,5);
実行結果
iid name price cid --- ---------- ------ --- 1 Desktop PC 100000 1 3 Tablet PC 50000 1 5 Keyboard 1200 2
実行例2
ユーザー表(users)から、氏名(name)が「Yoko.M」か「Naoto.H」のいずれかの行を取得し、全列を表示する。
SELECT * FROM users WHERE name IN('Yoko.M','Naoto.H');
実行結果
uid name age --- ------- --- 2 Yoko.M 28 3 Naoto.H 26
NOT IN演算子
次に NOT IN演算子 です。まずは条件式に書く場合の凡例をご覧ください。
列名 NOT IN(値1,値2,値3....)
NOT IN演算子は、指定した列が()内の値に含まれないものを該当行と判定する演算子です。実行例を見てみましょう。
実行例1
商品表(items)から、商品ID(iid)が「1,3,5」のいずれとも一致しないものを取得し、全列を表示する。
SELECT * FROM items WHERE iid NOT IN(1,3,5);
実行結果
iid name price cid --- -------------- ----- --- 2 Note PC 85000 1 4 Mouse 1000 2 6 USB Memory 800 2 7 LAN Cable 500 2 8 USB Cable 300 2 9 Mother Board 25000 3 10 LAN Card 3000 3 11 Inkjet Printer 9000
BETWEEN演算子
まずは BETWEEN演算子 です。こちらもまずはWHERE句に書く場合の凡例をご覧ください。
列名 BETWEEN 値1 AND 値2
BETWEEN演算子は、指定した列が値1以上、値2以下であるものを該当行として取得する演算子です。実行例を見てみましょう。
実行例1
商品表(items)から、価格(pricde)が50000以上、100000以下のものを取得し、全列を表示する。
SELECT * FROM items WHERE price BETWEEN 50000 AND 100000;
実行結果
iid name price cid --- ---------- ------ --- 1 Desktop PC 100000 1 2 Note PC 85000 1 3 Tablet PC 50000 1
論理演算子
論理演算子を学習するにあたり、条件式の動作について確認しておきましょう。DBMSではWHERE句にある条件式を判定するにあたり、該当表の各行について1つ1つ 真偽判定 を行ないます。条件式に合致するものは「真」、条件式に合致しないものは「偽」となります。この真偽判定を行ない、「真」になった行のみを取得対象の行としているのです。
下はIN演算子の実行例1を元に、条件式の判定がどのように行われているかを示した図です。
それでは、本題の 論理演算子 についてです。論理演算子は 複数の条件式を取り扱う演算子 です。次の2つがあります。
演算子 | 凡例 | 意味 |
---|---|---|
OR | 条件式1 OR 条件式2 | 条件式1または条件式2が真であれば、式全体を真とする |
AND | 条件式1 AND 条件式2 | 条件式1と条件式2がいずれも真の場合のみ、式全体を真とする |
実行例を見ていきましょう。
実行例1
商品表(items)から、分類ID(cid)が「2」で、なおかつ価格(price)が1000以上のものを取得し、全列を表示する。
SELECT * FROM items WHERE cid = 2 AND price >= 1000;
実行結果
iid name price cid --- -------- ----- --- 4 Mouse 1000 2 5 Keyboard 1200 2
実行例2
商品表(items)から、商品名(name)の最後に「PC」または「Cable」という文字列を含むものを取得し、全列を表示する。
SELECT * FROM items WHERE name LIKE '%Cable' OR name LIKE '%PC';
実行結果
iid name price cid --- ---------- ------ --- 1 Desktop PC 100000 1 2 Note PC 85000 1 3 Tablet PC 50000 1 7 LAN Cable 500 2 8 USB Cable 300 2
IS NULL演算子・IS NOT NULL演算子
データベースやプログラミング言語で扱う値の中には、「 空であること 」を表す値があります。それが NULL です。「ヌル」や「ナル」と呼ばれます。サンプルデータの商品表を一覧表示してみると、商品ID(iid)が「11」の行の分類ID(cid)には値が入っていません。これがNULLの状態です。
iid name price cid --- -------------- ------ --- 1 Desktop PC 100000 1 2 Note PC 85000 1 3 Tablet PC 50000 1 4 Mouse 1000 2 5 Keyboard 1200 2 6 USB Memory 800 2 7 LAN Cable 500 2 8 USB Cable 300 2 9 Mother Board 25000 3 10 LAN Card 3000 3 11 Inkjet Printer 9000
SQLでは列の値がNULLかそうでないかを判定する演算子があります。それが「 IS NULL演算子 」と「 IS NOT NULL演算子 」です。条件式部分で利用する際の凡例は次のようになります。
列名 IS NULL
意味:指定した列がNULLなら
列名 IS NOT NULL
意味:指定した列がNULLでないなら
実行例を見ていきましょう。
実行例1
商品表(items)から、cidが「NULL」である行の全列を表示する。
SELECT * FROM items WHERE cid IS NULL;
実行結果
iid name price cid --- -------------- ----- --- 11 Inkjet Printer 9000
実行例2
商品表(items)から、cidが「NULL」でない行の全列を表示する。
SELECT * FROM items WHERE cid IS NOT NULL;
実行結果
iid name price cid --- ------------ ------ --- 1 Desktop PC 100000 1 2 Note PC 85000 1 3 Tablet PC 50000 1 4 Mouse 1000 2 5 Keyboard 1200 2 6 USB Memory 800 2 7 LAN Cable 500 2 8 USB Cable 300 2 9 Mother Board 25000 3 10 LAN Card 3000 3
練習問題
それではここから練習問題です。
問1
注文表(orders)から、ユーザーID(uid)が「2」で、なおかつ注文日(odate)が「2021-05-15」の行を取得し、すべての列を表示してください。
実行結果
oid uid odate --- --- ---------- 5 2 2021-05-15
問2
分類表(categories)から、cidが1または3であるものについて全行を表示してください。次の2パターンを考えてください。
- 論理演算子(OR)を使用した方法
- IN演算子を使用した方法
実行結果
cid name --- -------- 1 PC 3 PC Parts
問3
ユーザー表(users)から、年齢(age)が20~29の行を取得し、全列を表示してください。次の2パターンを考えてください。
- 論理演算子(AND)を使用した方法
- BETWEEN演算子を使用した方法
実行結果
uid name age --- ------- --- 2 Yoko.M 28 3 Naoto.H 26 6 Akira.O 25
練習問題(解答例)
それでは、練習問題の解答例です。
問1
SELECT * FROM orders WHERE uid = 2 AND odate = '2021-05-15';
問2
論理演算子(OR)を利用した例
SELECT * FROM categories WHERE cid = 1 OR cid = 3;
IN演算子を利用した例
SELECT * FROM categories WHERE cid IN(1,3);
問3
論理演算子(AND)を利用した例
SELECT * FROM users WHERE age >= 20 AND age <= 29;
BETWEEN演算子を利用した例
SELECT * FROM users WHERE age BETWEEN 20 AND 29;
おわりに
本日は以上とさせていただきます。最後までご覧くださりありがとうございます。前回に引き続き、where句で使える様々な演算子をご紹介しました。次回はSELECT句の部分の様々な使い方をご紹介します。引き続きよろしくお願いいたします。
合同会社イー・シー・エフでは、子ども向けプログラミングなどの教育講座を実施しています。プログラミング教室の案内や教育教材の情報、また関連するご相談・問い合わせにつきましては下記よりご確認ください。