12. 中間まとめ
1
URL: https://www.kkaneko.jp/de/ds/index.html
金子邦彦
謝辞:この資料では「いらすとや」のイラストを使用しています
反復練習による上達、データベースの機能
の理解の向上
個々の機能の関連の理解
理解度の確認、難易度の高い演習に挑戦す
ることによる成長
2
アウトライン
1. イントロダクション
2. NULL
3. テーブル定義、問い合わせ
4. データ操作
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 を使用)
12-1. イントロダクション
7
リレーショナルデータベースの仕組み
データをテーブルと呼ばれる表形式で保存
テーブル間関連で結ばれる。複雑な構造を持ったデータ
を効率的に管理することを可能に。
8
関連
商品
ID
商品名
単価
1
みかん
50
2
りんご
100
3
メロン
500
購入者
商品番号
X
1
X
3
Y
2
購入
商品テーブルと購入テーブ
9
関連
商品
ID
商品名
単価
1
みかん
50
2
りんご
100
3
メロン
500
購入者
商品番号
X
1
X
3
Y
2
購入
Xさんは、1みかんと,
3 メロンを買った
Yさんは、 2 りんごを買った
商品テーブルの情報
購入テーブルの情報
SQL 理解のための前提知識
テーブル
データをテーブルと呼ばれる表形式で保存
問い合わせ(クエリ)
問い合わせ(クエリ)は、データベースから必要なデータ
を検索、加工するための指令
SELECT, FROM, WHERE など、多様なコマンドが存在。
結合、集約、ソート、副問い合わせなど、高度な操作も可
10
科目 受講者 得点
A
85
B
90
A
90
B
96
A
95
11
テーブル「商品」からデータを取得すSQLの例
SELECT *FROM 商品;
SELECT 商品名 FROM 商品;
SELECT DISTINCT 商品名 FROM 商品;
SELECT 商品名, 単価 FROM 商品 WHERE 単価 > 80;
SELECT 商品名, 単価 FROM 商品 WHERE 単価 BETWEEN 80 AND 85;
SELECT AVG(単価)FROM 商品;
AVG, MAX, MIN, SUM: 平均、最大、最小、合計
COUNT: 行数
SELECT * FROM 商品 WHERE 商品名 LIKE '%';
*ん」、「ん*」「**」のよに書くことができる
Access では % でなく *
SELECT *FROM 商品 WHERE 商品名 IN ('みかん', 'りんご');
12
リレーショナルデータベースシステムの機能
機能
SQL
のキーワード
テーブル定義
テーブル定義
CREATE
TABLE
データ型
CHAR, TEXT, INTEGER, REAL,
DATETIME, BIT, NULL
オートナンバー
MySQL
では AUTO_INCREMENT
Access
では AUTOINCREMENT
主キー
PRIMARY
KEY
参照整合性制約
FOREIGN
KEY, REFERENCES
問い合わせ(クエ
リ)
射影、選択、結合
SELECT FROM WHERE
重複行除去
DISTINCT
比較,範囲指定,パター
ンマッチ,
AND/OR
=, <, >, <>, !=, <=, >=, BETWEEN,
LIKE, AND, OR,
IS NULL, IS NOT
NULL
集計・集約
GROUP BY, MAX, MIN, COUNT, AVG,
SUM
並べ替え(ソート)
ORDER BY
副問い合わせ
IN
データ操作
挿入
削除更新
INSERT INTO, DELETE FROM WHERE,
UPDATE SET WHERE
トランザクション
開始
コミット
ロール
バック
BEGIN TRANSACTION
MySQL
START TRANSACTION,
COMMIT, ROLLBACK
グループ化と集約
グループ化は、同じ属性値を共有するデータ集める
ロセス。
例:「科目」や「受講者」ごとにデータを分類できる
して形成されたグループを集約(行数平均値
計値)し、元のデータの概要を把握することが可能にな
る。
13
科目 受講者 得点
国語
A
85
国語
B
90
算数
A
90
算数
B
96
理科
A
95
科目
受講者
得点
国語
A
85
国語
B
90
科目
受講者
得点
理科
A
95
科目
受講者
得点
算数
A
90
算数
B
96
概要
得点の平均
国語
87.5
算数
93
理科
95
グループ化 集約
グループ化と集約
グループ化
GROUP BY は、特定の属性(「科目」、「受講者」)を
基準として、グループ化を行
集約
大量のデータから意味のあるデータを抽出
集約の種類:平均 AVG、最大 MAX、最小 MIN、合計
SUM、行数 COUNT
集約GROUP BY組み合わせることで、グループごとの
集約結果を得ることができる
14
テーブルと属性
15
テーブル
IDと「商品」と
単価」の属性
テーブル名:商品
ID
商品名
単価
1
みかん
50
2
りんご
100
3
メロン
500
属性のデータ型
16
テーブル
の本体
属性名
整数主キ テキスト 整数
INTEGER
PRIMARY KEY TEXT INTEGER
ID 商品名 単価
1
みかん
50
2
りんご
100
3
メロン
500
属性のデータ型
17
データ型
SQL
のキーワードのうち
主なもの
未定・未知・非存在
NULL
短いテキスト
char
長いテキスト
text
数値
integer, real
日付,時刻,日時
datetime
ブール値
bit, bool
整数integer, 浮動小数点数(小数付きの数)
real
短いテキスト半角 255文字分までが目安
それ以上になる可能性があるときは長いテキスト
SQL によるテーブル定義
テーブル名商品
属性名ID、商品名、単価
属性のデータ型数値、テキスト、数値
データの整合性を保つための制約主キー制約
18
CREATE TABLE 商品 (
ID INTEGER PRIMARY KEY,
商品名 TEXT,
単価 INTEGER);
主キー
主キは、テーブルの各行を識別するためのキー
19
主キー
ID 商品名 単価
1
みかん
50
2
りんご
100
3
メロン
500
PRIMARY KEY
PRIMARY KEY テーブル定義時に使用し、「
キー制約」を示す
20
ID 商品名 単価
1
みかん
50
2
りんご
100
3
メロン
500
CREATE TABLE テーブル名 (
列名1 データ型 PRIMARY KEY,
列名2 データ型,
...
);
CREATE TABLE 商品 (
ID INTEGER PRIMAY KEY,
商品名 TEXT,
単価 INTEGER);
SQL の書き方
主キー
外部キー
外部キーは、他のテーブルの主キーを参照するキー
21
ID
商品名
単価
1
みかん
50
2
りんご
100
3
メロン
500
ID
購入者
商品ID
数量
1
X
1
10
2
Y
2
5
購入テーブルの外部キー「商品
ID」は、購入テーブルの主キー
ID」を参照
主キー
外部キー
購入テーブル
商品テーブル
SQL によるテーブル定義
テーブル名購入
属性名ID、購入者、商品ID、数量
属性のデータ型数値、テキスト、数値、数値
データの整合性を保つための制約主キー制約、参照整合
性制約
22
CREATE TABLE 購入 (
ID INTEGER PRIMARY KEY,
購入者 TEXT,
商品ID INTEGER,
数量 INTEGER,
FOREIGN KEY (商品ID) REFERENCES 商品(ID));
FOREIGN KEY … REFERENCES
PRIMARY KEY … REFERENCES はテーブル定義時に使用
し、あるテーブルの外部キーが別のテーブルの主キー参照
する「参照整合性制約」を示す
23
SQL の書き方
ID
商品名
単価
1
みかん
50
2
りんご
100
3
メロン
500
ID
購入者
商品ID
数量
1
X
1
10
2
Y
2
5
主キー
外部キー
CREATE TABLE 購入 (
ID INTEGER PRIMARY KEY,
購入者 TEXT,
商品ID INTEGER,
数量 INTEGER,
FOREIGN KEY (商品ID) REFERENCES 商品(ID));
主キー
データベース操作
INSERT(追加)
テーブルに新しい行を追加
形式: INSERT INTO テーブル名 VALUES (1, 2, ...);
SELECT(問合わせ
必要なデータを検索、加工
形式:SELECTFROM … WHERE …
DELETE(削除)
テーブルから一つまたは複数の行を削除
形式: DELETE FROM テーブル名 WHERE 条件;
UPDATE更新
既存の値を変更
形式: UPDATE テーブル名 SET 1 = 1, 2 = 2, ... WHERE 条件;
24
データ追加のSQL
25
メニュー
INSERT INTO メニュー VALUES(1, 'かき氷', 400);
INSERT INTO メニュー VALUES(2, 'カレーライス', 400);
INSERT INTO メニュー VALUES(3, 'サイダー', 200);
ID 商品名 単価
1
かき氷
400
2
カレーライス
400
3
サイダー
200
演習1.テーブル定義と
データの追加、主キー制約
トピックス
1. SQL によるテーブル定義
2. 主キー制約 PRIMARY KEY
3. SQL によるデータの追加
4. 問い合わせ(クエリ)による
確認
26
Webブラザを使用
アドレスバーにSQLFiddleURLを入力
http://sqlfiddle.com/
URLが分からないときは、Googleなどの検索エンジンを利
用。「SQLFiddle」と検索し、表示された結果から
SQLFiddleェブサイトをクリック。
27
左側のパネルに、テーブル定義データの追加を行
SQL を入れる。
28
CREATE TABLE メニュー (
ID INTEGER PRIMARY KEY,
商品名 TEXT,
単価 INTEGER);
INSERT INTO メニュー VALUES(1, 'かき氷', 400);
INSERT INTO メニュー VALUES(2, 'カレーライス', 400);
INSERT INTO メニュー VALUES(3, 'サイダー', 200);
Build Schema」をクリック
29
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
30
SELECT * FROM メニュー;
12-2. NULL
31
32
データベースの NULL
データ化できないものは、NULL
未定 (将来決まるかも)
未知 (将来分かるかも)
存在しない (そもそも存在しない)
自由席の切符に座席番号は存在しない
試合をしていないとき勝率は存在しない
NULL は「ヌル」あるいは「ナル」と読む
NULL を使例(1)
カレーライスの値段が,まだ決まっていない(未
定)
33
商品 価格
かき氷
400
カレーライス
NULL
サイダー
200
値段は,必ず決まるはずだが,
まだ決まっていない
NULL を使例(2)
試合をしていないので,勝率は存在しない
34
チーム名
試合数
勝ち数
勝率
A
10
6
0.6
B
4
3
0.75
C
0
0
NULL
試合をしていないので,
勝率は存在しない
NULLIS NULLIS NOT NULL
IS NULL
NULL であることを条件
select *from T where 価格 IS NULL;
IS NOT NULL
NULL ないとを条件
select *from T where 価格 IS NOT NULL;
35
NULLと「0」は違
36
商品 価格
かき氷
400
カレーライス
NULL
サイダー
200
値段は,まだ決まっていない
あるいは,知らない
商品 価格
かき氷
400
カレーライス
0
サイダー
200
カレーライスは無料
NULL を使い,未定,未知,非存在であること
正しく記録
演習2
37
商品 価格
かき氷
400
カレーライス
NULL
サイダー
200
SELECT * FROM メニュー
WHERE 単価 IS NULL;
商品 価格
カレーライス
NULL
SELECT * FROM メニュー
WHERE 単価 >= 0;
商品 価格
かき氷
400
サイダー
200
演習2.NULL
トピックス
1. NULL
2. IS NULL
38
Webブラザを使用
アドレスバーにSQLFiddleURLを入力
http://sqlfiddle.com/
URLが分からないときは、Googleなどの検索エンジンを利
用。「SQLFiddle」と検索し、表示された結果から
SQLFiddleェブサイトをクリック。
39
左側のパネルに、テーブル定義データの追加を行
SQL を入れる。(前のものが残っていたら消す)
40
CREATE TABLE メニュー (
ID INTEGER PRIMARY KEY,
商品名 TEXT,
単価 INTEGER);
INSERT INTO メニュー VALUES(1, 'かき氷', 400);
INSERT INTO メニュー VALUES(2, 'カレーライス', NULL);
INSERT INTO メニュー VALUES(3, 'サイダー', 200);
Build Schema」をクリック
41
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
42
SELECT * FROM メニュー;
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
43
SELECT * FROM メニュー WHERE 単価 IS NULL;
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
44
SELECT * FROM メニュー WHERE 単価 >= 0;
12-3. テーブル定義、問い合
わせ
45
MySQL AUTO_INCREMENT
MySQL AUTO_INCREMENT : 自動の通し番号
(MySQL の固有機能)
データ追加のたびに 1, 2, 3, ・・・の通し番号が自動で設
定される
この機能を有効にするために、INSERT でのデータ追加
NULL を使用
46
INSERT INTO Products VALUES (NULL, '商品A', 100);
INSERT INTO Products VALUES (NULL, '商品B', 200);
INSERT INTO Products VALUES (NULL, '商品C', 150);
1
商品
A
100
2
商品
B
200
3
商品
C
150
自動の通し番号
演習3.テーブル定義、
データの追加、問い合わせ
トピックス
1. SQL るテーブル定義
2. 主キ制約 PRIMARY KEY
3. SQL るデータの追加
4. 問い合わせ(クエリ)による確認
5. MySQL AUTO_INCREMENT
NULL
47
Webブラザを使用
アドレスバーにSQLFiddleURLを入力
http://sqlfiddle.com/
URLが分からないときは、Googleなどの検索エンジンを利
用。「SQLFiddle」と検索し、表示された結果から
SQLFiddleェブサイトをクリック。
48
左側のパネルに、テーブル定データの追加を行SQL を入れる。
(前のものが残っていたら消す)
CREATE TABLE 商品 (
id INTEGER AUTO_INCREMENT PRIMARY KEY,
商品名 TEXT,
単価 INTEGER
);
CREATE TABLE 申し込み (
id INTEGER AUTO_INCREMENT PRIMARY KEY,
日時 DATETIME,
氏名 TEXT,
商品番号 INTEGER,
個数 INTEGER,
FOREIGN KEY (商品番号) REFERENCES 商品(id)
);
INSERT INTO 商品 VALUES (NULL, '商品A', 100);
INSERT INTO 商品 VALUES (NULL, '商品B', 200);
INSERT INTO 商品 VALUES (NULL, '商品C', 150);
INSERT INTO 申し込み VALUES (NULL, NOW(), 'X', 1, 1);
INSERT INTO 申し込み VALUES (NULL, NOW(), 'X', 2, 10);
INSERT INTO 申し込み VALUES (NULL, NOW(), 'Y', 2, 5);
INSERT INTO 申し込み VALUES (NULL, NOW(), 'X', 1, 1);
Build Schema」をクリック
50
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
51
SELECT * FROM 商品;
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
52
SELECT * FROM 申し込み;
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
53
SELECT * FROM 申し込み
JOIN 商品 ON 申し込み.商品番号 = 商品.id;
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
54
SELECT 申し込み.日時,申し込み.氏名,申し込み.個数 * 商品.単価
FROM 申し込み
JOIN 商品 ON 申し込み.商品番号 = 商品.id;
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
55
SELECT 氏名, SUM(個数 *商品.単価)
FROM 申し込み
JOIN 商品 ON 申し込み.商品番号 = 商品.id
GROUP BY 氏名;
2つのテーブルを使い、
氏名ごとに申し込みの
合計金額を求める
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
56
SELECT *
FROM 商品
WHERE 単価 >(SELECT AVG(単価) FROM 商品);
単価の平均を求める。
そして、単価の平均よ
りも高い単価を持つ
商品の情報を得る
自習1.商品の単価の最大値を得るSQL
商品テーブルを使用して、商品の単価の最大値を得るSQL
得る SQL を作成しなさい
ヒント:MAX を使用
57
自習2.Xによる申し込み
氏名が ‘X’ のすべての申し込み情報を得るSQLを作成しなさ
(注意)日時の値は、データを追加した日時に
なるので、人によって結果が異なる
ヒント:SELECT を使用
58
自習3.商品Aを申し込んだ人の取得
商品名が 商品A である商品を申し込んだすべての人の氏名
を得るSQLを作成しなさい。 DISTINCT による重複行の除去
も行こと。
ヒント:SELECTDISTINCTJOINWHERE を使用
59
自習4.氏名別の申し込み数の計算
目的:氏名ごとに、申し込みの回数を得る
申し込みテーブルを使用して、氏名ごとに、申し込みの回数
を得る SQL を作成しなさい。
ヒント:COUNT GROUP BY を使用
60
自習5.商品Bに対する申し込み総数の計算
JOINを使用して商品テーブルと申し込みテーブルを結合し、
商品B」に対する申し込みの総数を数を得る SQL を作成
しなさい
ヒント:WHEREで「商品B」を選択。SUM で合計を求める。
61
解答例
自習1.
SELECT MAX(単価)
FROM 商品;
自習2.
SELECT *
FROM 申し込み
WHERE 氏名 = 'X’;
自習3.
SELECT DISTINCT(申し込み.氏名
)FROM 申し込み
JOIN 商品 ON 申し込み.商品番号 = 商品.id
WHERE 商品.商品名 = '商品A';
62
解答例
自習4.
SELECT 氏名, COUNT(*) AS し込み数
FROM 申し込み
GROUP BY 氏名;
自習5.
SELECT SUM(申し込み.個数)
FROM 申し込み
JOIN 商品 ON 申し込み.商品番号 = 商品.id
WHERE 商品.商品名 = '商品B';
63
12-4. データベース操作
64
演習4.データベース操作
トピックス
1. UPDATE … SET
2. DELETE FROM
65
Webブラザを使用
アドレスバーにSQLFiddleURLを入力
http://sqlfiddle.com/
URLが分からないときは、Googleなどの検索エンジンを利
用。「SQLFiddle」と検索し、表示された結果から
SQLFiddleェブサイトをクリック。
66
左側パネルに、テーブル定義データの追加とデータの更新を行
SQL を入れる。
CREATE TABLE 商品 (
id INTEGER AUTO_INCREMENT PRIMARY KEY,
商品名 TEXT,
単価 INTEGER
);
INSERT INTO 商品 VALUES (NULL, '商品A', 100);
INSERT INTO 商品 VALUES (NULL, '商品B', 200);
INSERT INTO 商品 VALUES (NULL, '商品C', 150);
UPDATE 商品
SET 単価 = 120
WHERE 商品名 = '商品A';
Build Schema」をクリック
68
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
69
SELECT * FROM 商品;
左側パネルに、テーブル定義データの追加とデータの更新を行
SQL を入れる。
CREATE TABLE 商品 (
id INTEGER AUTO_INCREMENT PRIMARY KEY,
商品名 TEXT,
単価 INTEGER
);
INSERT INTO 商品 VALUES (NULL, '商品A', 100);
INSERT INTO 商品 VALUES (NULL, '商品B', 200);
INSERT INTO 商品 VALUES (NULL, '商品C', 150);
DELETE FROM 商品
WHERE 商品名 = '商品C';
Build Schema」をクリック
71
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
72
SELECT * FROM 商品;
自習6.商品価格の更新
目的:特定の商品の単価を更新する
商品テーブルで、商品名が商品Bの単価を 1000 に更新して
ください。
ヒント:UPDATESETWEHRE を使用
73
解答例
自習6.
UPDATE 商品
SET 単価 = 1000
WHERE 商品名 = '商品B’;
74