8. 種々の問い合わせ
IN、副問い合わせ、論理演算、ANDOR
1
URL: https://www.kkaneko.jp/de/ds/index.html
金子邦彦
謝辞:この資料では「いらすとや」のイラストを使用しています
技術的スキルの向上
分析能力と問題解決力の向上
自信の獲得。成長の自覚
2
アウトライン
1. イントロダクション
2. IN
3. 副問い合わせ
4. 論理演算、ANDOR
5. 演習
3
SQLFiddle のサイトにアクセス
Webブラザを使用
1. ェブブラザを開く
2. アドレスバーにSQLFiddleURLを入力
http://sqlfiddle.com/
URLが分からないときは、Googleなどの検索エンジンを利
用。「SQLFiddle」と検索し、表示された結果から
SQLFiddleェブサイトをクリック。
4
SQLFiddle の画面
5
右側のパネル: SQL問い合わせ
SELECT などを入力。
左側のパネル: テーブル定義、デー
タの追加など。SQLCREATE TABLE
INSERT INTO などを入力。
実行ボタン
結果ィンド
実行ボタン
SQLFiddle でのデータベース管理システムの選択
(高度な機能)
6
データベース管理システムの選択
(この授業では MySQL を使用)
8-1. イントロダクション
7
リレーショナルデータベースの仕組み
データをテーブルと呼ばれる表形式で保存
テーブル間関連で結ばれる。複雑な構造を持ったデータ
を効率的に管理することを可能に。
8
関連
リレーショナルデータベースの重要性
1. データの整合性: リレーショナルデータベースは、デー
タの整合性を保持するための機能を有する。これにより、
誤ったデータや矛盾したデータが保存されるのを防ぐこ
とができる。
2. 柔軟な問い合わせ(クエリ)能力: リレーショナルデー
タベースのSQLStructured Query Language)の使用に
より、複雑な検索やデータの抽出が可能になる。
3. トランザクションの機能: 一連の操作全体を一つの単位
として取り扱ことができる機能。これにより、データ
の一貫性と信頼性が向上する。
4. セキュリティ: アクセス権限の設定などにより、セキュ
リティを確保。
データの安全な保管、効率的なデータ検索・操作、ビジネス
や研究の意思決定をサポート。 9
SQL 理解のための前提知識
テーブル
データをテーブルと呼ばれる表形式で保存
問い合わせ(クエリ)
問い合わせ(クエリ)は、データベースから必要なデータ
を検索、加工するための指令
SELECT, FROM, WHERE など、多様なコマンドが存在。
結合、集約、ソート、副問い合わせなど、高度な操作も可
10
科目 受講者 得点
国語
A
85
国語
B
90
算数
A
90
算数
B
96
理科
A
95
11
SELECT
*FROM 記録;
テーブルのすべて
SELECT
居室 FROM 記録;
「居室」の列
をすべて
SELECT DISTINCT
居室 FROM 記録
;
重複行
(同じ値の行)を除去
SELECT
名前, 得点 FROM 記録
WHERE
得点 > 80;
「名前」と「得点」の列で、
得点
80より大きい」行を選択
SELECT
名前, 得点 FROM 記録
WHERE
得点 BETWEEN 80 AND
85;
「名前」と「得点」の列で、
得点
80以上かつ85以下」の範囲にある
行を選択
SELECT
AVG(得点)FROM 記録;
すべての
「得点」の値平均
SELECT
* FROM 記録
WHERE
居室 LIKE '%';
居室が''で終わる」行を選択
SELECT
* FROM 記録
WHERE
居室 IN ('1', '2')
居室が'1'または'2'」のいずれ
かに一致する行を選択
範囲指定 AND BETWEEN の利用
AND ・・・ 複数の条件をつなげる
BETWEEN
12
select ID, COST
from ORDERS
where COST >= 10 and COST <= 100;
where COST >= 10 and COST <= 100」の代わりに
where COST between 10 and 100」を使ことがで
きる(同じ結果が得られる)
select ID, COST
from ORDERS
where COST between 10 and 100;
10以上 100以下
10以上 100以下
SQL によるテーブル定義
テーブル名成績
属性名科目、受講者、得点
属性のデータ型テキスト、テキスト、数値
データの整合性を保つための制約なし
13
CREATE TABLE 成績 (
科目 TEXT,
受講者 TEXT,
得点 INTEGER);
データ追加のSQL
14
成績
INSERT INTO 成績 VALUES('国語', 'A', 85);
INSERT INTO 成績 VALUES('国語', 'B', 90);
INSERT INTO 成績 VALUES('算数', 'A', 90);
INSERT INTO 成績 VALUES('算数', 'B', 96);
INSERT INTO 成績 VALUES('理科', 'A', 95);
科目 受講者 得点
国語
A
国語
B
算数
A
算数
B
理科
A
演習1.テーブル定義と
データの追加
トピックス
1. SQL によるテーブル定義
2. SQL によるデータの追加
3. 問い合わせ(クエリ)による
確認
15
Webブラザを使用
アドレスバーにSQLFiddleURLを入力
http://sqlfiddle.com/
URLが分からないときは、Googleなどの検索エンジンを利
用。「SQLFiddle」と検索し、表示された結果から
SQLFiddleェブサイトをクリック。
16
左側のパネルに、テーブル定義データの追加を行
SQL を入れる。
17
CREATE TABLE 成績 (
科目 TEXT,
受講者 TEXT,
得点 INTEGER);
INSERT INTO 成績 VALUES('国語', 'A', 85);
INSERT INTO 成績 VALUES('国語', 'B', 90);
INSERT INTO 成績 VALUES('算数', 'A', 90);
INSERT INTO 成績 VALUES('算数', 'B', 96);
INSERT INTO 成績 VALUES('理科', 'A', 95);
Build Schema」をクリック
18
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
19
select * FROM 成績;
演習2.範囲指定
トピックス
1. 複数の条件を AND で連結す
ることによる範囲指定
2. BETWEEN AND による範
囲指定
20
Webブラザを使用
アドレスバーにSQLFiddleURLを入力
http://sqlfiddle.com/
URLが分からないときは、Googleなどの検索エンジンを利
用。「SQLFiddle」と検索し、表示された結果から
SQLFiddleェブサイトをクリック。
21
左側のパネルに、テーブル定義データの追加を行
SQL を入れる。(演習1のものをそのまま使
22
CREATE TABLE 成績 (
科目 TEXT,
受講者 TEXT,
得点 INTEGER);
INSERT INTO 成績 VALUES('国語', 'A', 85);
INSERT INTO 成績 VALUES('国語', 'B', 90);
INSERT INTO 成績 VALUES('算数', 'A', 90);
INSERT INTO 成績 VALUES('算数', 'B', 96);
INSERT INTO 成績 VALUES('理科', 'A', 95);
Build Schema」をクリック
23
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認。(同じ結果が2つ
24
SELECT * FROM 成績 WHERE 得点 >= 85 AND 得点 <= 90;
SELECT * FROM 成績 WHERE 得点 BETWEEN 85 AND 90;
自習1.特定の得点範囲の検索
目的: ANDを使用して、特定の得点範囲内の成績を検索する。
練習のため、BETWEENは使わない
指示: 得点が 90以上 100以下の成績を検索するSQL 文を書
いてください。BETWEENは使わないでください。
ヒント: WHERE ANDを使用して、得点の下限と上限を指
定する。
25
自習2.特定の得点範囲の検索
目的: ANDを使用して、特定の得点範囲内の成績を検索する。
今度はBETWEENを使
指示: 得点が 90以上 100以下の成績を検索するSQL 文を書
いてください。BETWEENAND使ってください
ヒント: WHERE BETWEEN ANDを使用して、得点の
下限と上限を指定する。
26
自習3.複数条件を用いた検索
目的: ANDBETWEENを組み合わせて、特定の条件を満た
す成績を検索する
指示: 国語の得点が 90以上 100以下の成績を検索するSQL
文を書いてください。BETWEENANDを使ってください。
ヒント: WHERE ANDを使用して、複数の条件を連結する
27
解答例
自習1:
SELECT * FROM 成績 WHERE 得点 >= 90 AND 得点 <= 100
自習2:
SELECT * FROM 成績 WHERE 得点 BETWEEN 90 AND 100;
自習3:
SELECT * FROM 成績 WHERE 科目 = '国語' AND 得点
BETWEEN 90 AND 100;
28
ここまでのまとめ
範囲指定(ANDBETWEEN
AND:複数の条件を連結
BETWEEN:特定の範囲内の値を指定
範囲指定のクエリ例
得点が85以上90以下のデータを選択
29
SELECT * FROM 成績 WHERE 得点 >= 85 AND 得点 <= 90;
SELECT * FROM 成績 WHERE 得点 BETWEEN 85 AND 90;
8-2. SQL IN
30
SQL IN
複数の値のいずれ一致するかかテスト
OR 複数の条件を並べるよりも簡潔
IN を使用
SELECT *
FROM 成績
WHERE 科目 IN ('国語', '算数’);
OR で複数の条件を並べる】
SELECT *
FROM 成績
WHERE 科目 = '国語' OR 科目 = '算数'; 31
SQL IN
複数の値のいずれ一致するかかテスト
SELECT *
FROM 成績
WHERE 科目 IN ('国語', '算数’);
32
半角丸かっこ
で囲む
半角丸かっこ
で囲む
半角の
カンマ
演習3.SQL IN
トピックス
1. 複数の値のいずれかに一致す
るかテスト
2. IN
33
Webブラザを使用
アドレスバーにSQLFiddleURLを入力
http://sqlfiddle.com/
URLが分からないときは、Googleなどの検索エンジンを利
用。「SQLFiddle」と検索し、表示された結果から
SQLFiddleェブサイトをクリック。
34
左側のパネルに、テーブル定義データの追加を行
SQL を入れる。(演習1のものをそのまま使
35
CREATE TABLE 成績 (
科目 TEXT,
受講者 TEXT,
得点 INTEGER);
INSERT INTO 成績 VALUES('国語', 'A', 85);
INSERT INTO 成績 VALUES('国語', 'B', 90);
INSERT INTO 成績 VALUES('算数', 'A', 90);
INSERT INTO 成績 VALUES('算数', 'B', 96);
INSERT INTO 成績 VALUES('理科', 'A', 95);
Build Schema」をクリック
36
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
37
SELECT * FROM 成績 WHERE 科目 IN ('国語', '算数');
自習4.複数の値のいずれかに一致するかを条件とする検索
目的: IN を用いて、特定の点数を得た学生のみを検索する
指示: 得点が 80 点であるか 90点である成績を検索するSQL
文を書いてください。IN を使ってください。
38
自習5.複数の値のいずれかに一致するかを条件とする検索
目的: IN を用いて、特定の点数を得た学生のみを検索する
指示: 得点が 80 点であるか、85点であるか、90点である成
績を検索するSQL 文を書いてください。IN を使ってくださ
い。
39
解答例
自習4:
SELECT * FROM 成績 WHERE 得点 IN (80, 90);
自習5:
SELECT * FROM 成績 WHERE 得点 IN (80, 85, 90);
40
8-3. 副問い合わせ
41
副問い合わせ
副問い合わせは、別のSQL問い合わせ(クエリ)
内に埋め込まれたSQL問い合わせ(クエリ)
42
SELECT 受講者 FROM 成績 WHERE 得点 =
(SELECT MAX(得点) FROM 成績);副問い合わせ
副問い合わせの重要性
副問い合わせは、複雑なデータ抽出を可能にする
一つの問い合わせの条件別の問い合わせから得ることが
できる
常に最新のデータベース内のデータに基づいて条件を設定
することが可能になる
データの集計や比較をより柔軟に行ことができる
43
SQL の例
最高得点は?
44
成績
科目 受講者 得点
国語
A
国語
B
算数
A
算数
B
理科
A
SELECT MAX(得点) FROM 成績;
SQL の例
96点の得点の受講者は?
45
成績
科目 受講者 得点
国語
A
国語
B
算数
A
算数
B
理科
A
SELECT 受講者 FROM 成績 WHERE 得点 =96;
複数の SQL の組み合わせ
46
成績
科目 受講者 得点
国語
A
国語
B
算数
A
算数
B
理科
A
SELECT 受講者 FROM 成績 WHERE 得点 = 96;
SELECT MAX(得点) FROM 成績 WHERE 科目;
組み合わせる。
かっこと = を使用
SELECT 受講者 FROM 成績 WHERE 得点 =
(SELECT MAX(得点) FROM 成績);
演習4.副問い合わせ
トピックス
1. 副問い合わせ
47
Webブラザを使用
アドレスバーにSQLFiddleURLを入力
http://sqlfiddle.com/
URLが分からないときは、Googleなどの検索エンジンを利
用。「SQLFiddle」と検索し、表示された結果から
SQLFiddleェブサイトをクリック。
48
左側のパネルに、テーブル定義データの追加を行
SQL を入れる。(演習1のものをそのまま使
49
CREATE TABLE 成績 (
科目 TEXT,
受講者 TEXT,
得点 INTEGER);
INSERT INTO 成績 VALUES('国語', 'A', 85);
INSERT INTO 成績 VALUES('国語', 'B', 90);
INSERT INTO 成績 VALUES('算数', 'A', 90);
INSERT INTO 成績 VALUES('算数', 'B', 96);
INSERT INTO 成績 VALUES('理科', 'A', 95);
Build Schema」をクリック
50
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
51
SELECT 受講者 FROM 成績 WHERE 得点 =
(SELECT MAX(得点) FROM 成績);
自習6.平均得点よりも高いことを条件とする検索
目的: 全科目の平均点よりも高い得点である行のみを選択
指示: 成績テーブルから、全科目の平均点よりも高い得点で
ある行を選択してください。
ヒント:全科目の平均得点は副問い合わせで計算。AVG
使用。「よりも高い」とい条件にも注意。
次のよな結果になる
52
自習6
53
SELECT * FROM 成績 WHERE 得点 >
(SELECT AVG(得点) FROM 成績);
単一行問い合わせと複数行問い合わせ
異なるタイプの副問い合わせ
単一行副問い合わせ
副問い合わせは、必ず、一つの行のみを返す。
比較演算子(=, <, > など)と共に使用。
例:SELECT * FROM 従業員 WHERE 給与 =(SELECT
MAX(給与) FROM 従業員);
複数行副問い合わせ
副問い合わせは、複数の行を返すことがありえる
IN などと共に使用。
SELECT * FROM 従業員 WHERE 部署ID IN (SELECT 部署
ID FROM 部署 WHERE 場所 = '東京');
54
ここまでのまとめ
副問合わせは、他のSQLクエリ内に埋め込まれたSQL問い合わせ
副問い合わせの重要性
複雑なデータ抽出を可能にする。
一つの問い合わせの条件を、別の問い合わせから得ことができる。
最新のデータベース内のデータに基づい条件を設定することが可能で
す。
副問い合わせの例
副問い合わせにより、最高得点を取った受講者を特定
SELECT 受講者 FROM 成績 WHERE 得点 = (SELECT MAX(得点) FROM
成績);
副問い合わせにより、全科目の平均点より高い得点を取った行を選択
SELECT * FROM 成績 WHERE 得点 > (SELECT AVG(得点) FROM 成績);
55
8-4. AND OR
56
リレーショナルデータベースシステムにおける
AND OR の使用
SQLでは、複数条件を組み合わる際 AND OR を使用
AND
条件AAND 条件B
条件Aと条件B両方が成立
OR
条件AOR 条件B
条件A、条件Bいずれか、または両方が成立
注意点: ORは「どちらか一方を選ぶ」とい意味ではありません
57
二進数は 0 または 1
58
右手が上がっていない 右手が上がっている
二通り
二進数は 0 または 1
59
FALSE TRUE
右手が上がっていない 右手が上がっている
変数が2つ
60
右手と左手の
両方を考えると
4通り
変数が2つ
61
FALSE FALSE TRUE FALSE
FALSE TRUE TRUE TRUE
AND
62
AND 両方とも1
FALSE FALSE TRUE FALSE
FALSE TRUE TRUE TRUE
OR
63
OR
少なくとも
片方には
1がある
FALSE FALSE TRUE FALSE
FALSE TRUE
TRUE TRUE
OR は「どちらかを選びなさい」とい意味ではない
64
とんこつラーメン
食べない:FALSE 食べる:TRUE
醤油ラーメン
食べない:FALSE
食べる:TRUE
どちらか食べても、両方食べても OK!
(これが OR の鉄則)
「どちらかを選べ」
という意味では
ない
とんこつラーメン
醤油ラーメン
8-5. 演習
65
演習の目的
SQL の理解、SQL のスキルについて能力を高める
テーブル定義、データの追加、問い合わせの実行を通じて、
リレーショナルデータベースの操作に慣れる
66
演習の概要
テーブルの作成とテータ追加
従業員テーブルの定義
24行のデータ追加
属性は、従業員ID、名前、部署ID、給与
SQLサンプルの実行
部署IDに基づくデータの選択
給与の平均以上を稼ぐ従業員の特定
特定の部署IDを持つ従業員の選
特定の条件を満たす従業員の選択
様々な問い合わせの例を提供。
自習問題
実践的な問題を解決するための自習問題
67
演習.SQL の演習
トピックス
1. テーブル定義
2. データの追加
3. 問い合わせ
4. 副問い合わせ
5. IN
6. AND
68
Webブラザを使用
アドレスバーにSQLFiddleURLを入力
http://sqlfiddle.com/
URLが分からないときは、Googleなどの検索エンジンを利
用。「SQLFiddle」と検索し、表示された結果から
SQLFiddleェブサイトをクリック。
69
左側のパネルに、テーブル定義データの追加を行
SQL を入れる。(前のものは不要なので消す
70
CREATE TABLE 従業員 (
従業員ID INTEGER,
名前 TEXT,
部署ID INTEGER,
給与 INTEGER
);
INSERT INTO 従業員 VALUES(5, '伊藤', 104, 280000);
INSERT INTO 従業員 VALUES(6, '渡辺', 101, 320000);
INSERT INTO 従業員 VALUES(7, '小林', 102, 270000);
INSERT INTO 従業員 VALUES(8, '加藤', 103, 290000);
INSERT INTO 従業員 VALUES(9, '吉田', 104, 310000);
INSERT INTO 従業員 VALUES(10, '中村', 101, 330000);
INSERT INTO 従業員 VALUES(11, '小川', 102, 260000);
INSERT INTO 従業員 VALUES(12, '高橋', 103, 340000);
INSERT INTO 従業員 VALUES(13, '山本', 104, 300000);
INSERT INTO 従業員 VALUES(14, '石川', 101, 350000);
INSERT INTO 従業員 VALUES(15, '中島', 102, 280000);
INSERT INTO 従業員 VALUES(16, '佐々木', 103, 360000);
INSERT INTO 従業員 VALUES(17, '山口', 104, 290000);
INSERT INTO 従業員 VALUES(18, '松本', 101, 370000);
INSERT INTO 従業員 VALUES(19, '井上', 102, 310000);
INSERT INTO 従業員 VALUES(20, '木村', 103, 280000);
INSERT INTO 従業員 VALUES(21, '', 104, 320000);
INSERT INTO 従業員 VALUES(22, '清水', 101, 330000);
INSERT INTO 従業員 VALUES(23, '山崎', 102, 340000);
INSERT INTO 従業員 VALUES(24, '中田', 103, 300000);
Build Schema」をクリック
71
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
72
SELECT 名前, 給与 FROM 従業員 WHERE 部署ID = 101;
部署ID 101 の従業員の名前と給与を選択:
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
73
SELECT * FROM 従業員 WHERE 給与 >= (SELECT AVG(給与) FROM 従業員);
給与が平均以上の従業員を選択
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
74
SELECT * FROM 従業員 WHERE 部署ID IN (101, 102);
部署ID 101 または 102 に所属する従業員を選択
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
75
SELECT * FROM 従業員 WHERE 給与 >= 300000 AND 部署ID = 102;
給与が300000以上かつ部署ID102の従業員を選択
自習7.最高給与を受け取る従業員の名前を特定
目的:最高給与を受け取る従業員の名前を副問い合わせを用
いて特定
従業員テーブルから最高給与を受け取る従業員の名前を選択
するSQL文を書いてください。
ヒント: 最高給与はMAXを使って副問い合わせで求める
76
自習8.特定の部署に所属し、特定の給与範囲にある従業員
を特定
目的:部署ID 102 あるいは 103 に所属し、給与が300000
上の従業員を特定
従業員テーブルから、「目的」で指定された条件を満たす従
業員を選択するSQL文を書いてください
ヒント: ANDを用いて、部署IDと給与の条件を組み合わせる。
77
自習7
SELECT 名前 FROM 従業員 WHERE 給与 = (SELECT
MAX(給与) FROM 従業員);
自習8
SELECT 名前, 給与 FROM 従業員 WHERE 部署ID IN (102,
103) AND 給与 >= 300000;
78
全体まとめ
SQLIN
複数の値のいずれかに一致するかどかをテスト
: SELECT * FROM 成績 WHERE 科目 IN ('国語', '算数');
副問い合わせ
別の SQL 文内に埋め込まれた SQL
問い合わせの条件を、別の問い合わせから得ることができ
る。
最新のデータベース内のデータに基づいて条件を設定でき
るよになる
: SELECT 受講者 FROM 成績 WHERE 得点 = (SELECT
MAX(得点) FROM 成績);
79
全体まとめ
副問い合わせのタイプ
単一行副問い合わせ: 副問い合わせは、必ず、一つの行を
を返す。比較演算子と共に使用。
複数行副問い合わせ: 副問い合わせは、複数の行を返す可
能性がある。INなどと共に使用。
ANDORの使用
AND: 二つの条件が両方成立する場合に使用。
OR: 二つの条件のいずれか、または両方が成立する場合
使用。
注意: ORは「どちらか一方を選ぶ」とい意味ではない。
80
技術的スキルの向上
論理演算子(ANDOR)とSQLINを使った効率的な SQL
問い合わせの実行。副問い合わせを用いた複雑なデータ抽出
と条件設定。
分析能力と問題解決力の向上
データ分析能力の向上。複数の条件を組み合わせて的確な
データを得る問題解決能力。
自信の獲得。成長の自覚。
データベース操作における自信の向上。実践的なSQLの知
識とスキルの獲得。データベース利用のより高度なスキル獲
得。
81