SQLiteでデータベース(SQL)の基本を学ぶ(3)

データベース

こんにちは、ECF Techブログ
担当のMichiharu.Tです。

本記事はSQL文について、実際に動作させながら学習する入門記事の第3回となります。本記事の題材となっているデータベース内の各表、および学習の始め方については、下記の第1回の記事からご覧ください。

データベース
データベースのカテゴリです。トレーニングとして使えるSQLの入門記事などを連載しています。

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句の部分の様々な使い方をご紹介します。引き続きよろしくお願いいたします。


合同会社イー・シー・エフでは、子ども向けプログラミングなどの教育講座を実施しています。プログラミング教室の案内や教育教材の情報、また関連するご相談・問い合わせにつきましては下記よりご確認ください。

ECFエデュケーション
タイトルとURLをコピーしました