SlideShare uma empresa Scribd logo
1 de 37
Baixar para ler offline
データベースシステム論
2015年度 後期 火曜 3・4時限 情14教室
担当:横山昌平
データベースシステム論 第 回2015 [ 8 ] 1p.
講義計画
• 関係データベースの歴史と基本概念
• SQLの基礎と応用(演習を含めつつ)
• データベースの設計と構成
• SQL問い合わせ処理とそれを支える技術
• 関係データモデル以外のデータベース
データベースシステム論 第 回2015 [ 8 ] 2p.
※現時点での予定です。進捗に応じて変更します。
27Oct.
20Oct.
13Oct.
24Nov.
17Nov.
10Nov.
1Dec.
8Dec.
5Jan.
15Dec.
26Jan.
19Jan.
12Jan.
2Feb.
データベースシステム論
演習2 WHERE句とHAVING句 の答え合わせ
データベースシステム論 第 回2015 [ 7 ] 3p.
集約&整列&リネーム演算 - 例
• 安価なワインの産地別平均価格(降順)
• 安価=ワインの価格が4000円未満=安価なワイン
• 安価=産地平均価格が4000円未満=安価な産地
データベースシステム論 第 回2015 [ 7 ] 4p.
SELECT did, round(avg(price)) FROM wine
WHERE price < 4000 GROUP BY did
ORDER BY round DESC;
SELECT did, round(avg(price)) FROM wine
GROUP BY did HAVING avg(price) < 4000
ORDER BY round DESC;
did | round
-----+-------
C | 2800
A | 2700
B | 2200
did | round
-----+-------
C | 2800
A | 2700
考え方の一例
• 4000円”以下”で考えてみよう
• 安価=ワインの価格が4000円以下=安価なワイン
• 安価=産地平均価格が4000円以下=安価な産地
データベースシステム論 第 回2015 [ 7 ] 5p.
SELECT did, round(avg(price)) FROM wine
WHERE price <= 4000 GROUP BY did
ORDER BY round DESC;
SELECT did, round(avg(price)) FROM wine
GROUP BY did HAVING avg(price) <= 4000
ORDER BY round DESC;
did | round
-----+-------
D | 4000
C | 2800
A | 2700
B | 2200
did | round
-----+-------
B | 4000
D | 4000
C | 2800
A | 2700
wID name dID price
3 サンテミリオン B 5800
4 オーメドック B 2200
データベースシステム論
第8回 SQL応用演習 結合演算とその他
データベースシステム論 第 回2015 [ 8 ] 6p.
結合演算
• 基本的な書き方
• テーブルt1とテーブルt2の結合
• 結合条件:カラムc1とカラムc2が等しい
データベースシステム論 第 回2015 [ 8 ] 7p.
SELECT *
FROM t1 JOIN t2
ON t1.c1 = t2.c2;
SELECT *
FROM テーブル名 [結合方法] テーブル名
ON [結合条件];
結合演算 - 例
• ワインの産地を表示したい
データベースシステム論 第 回2015 [ 8 ] 8p.
SELECT *
FROM wine JOIN vineyard
ON wine.did = vineyard.did;
dbsys=# select * from wine join vineyard on wine.did = vineyard.did;
wid | name | did | price | did | district
-----+------------------------+-----+-------+-----+----------------
1 | シャブリ | A | 2400 | A | ブルゴーニュ
2 | ジュヴレシャンベルタン | A | 3000 | A | ブルゴーニュ
3 | サンテミリオン | B | 5800 | B | ボルドー
4 | オーメドック | B | 2200 | B | ボルドー
5 | サンセール | C | 2800 | C | ロワール
6 | シャンパン | D | 4000 | D | シャンパーニュ
(6 行)
wineテーブル vineyardテーブル
結合演算 - 例
• ワインの産地を表示したい
データベースシステム論 第 回2015 [ 8 ] 9p.
SELECT *
FROM wine JOIN vineyard
ON wine.did = vineyard.did;
dbsys=# select * from wine join vineyard on wine.did = vineyard.did;
wid | name | did | price | did | district
-----+------------------------+-----+-------+-----+----------------
1 | シャブリ | A | 2400 | A | ブルゴーニュ
2 | ジュヴレシャンベルタン | A | 3000 | A | ブルゴーニュ
3 | サンテミリオン | B | 5800 | B | ボルドー
4 | オーメドック | B | 2200 | B | ボルドー
5 | サンセール | C | 2800 | C | ロワール
6 | シャンパン | D | 4000 | D | シャンパーニュ
(6 行)
wineテーブル vineyardテーブル
何結合?
内部結合
INNER JOIN
結合演算 - 例続き
• 射影演算にてカラムを整理する
データベースシステム論 第 回2015 [ 8 ] 10p.
SELECT wid, name, district, price
FROM wine JOIN vineyard
ON wine.did = vineyard.did;
dbsys=# SELECT wid, name, district, price
dbsys-# FROM wine JOIN vineyard
dbsys-# ON wine.did = vineyard.did;
wid | name | district | price
-----+------------------------+----------------+-------
1 | シャブリ | ブルゴーニュ | 2400
2 | ジュヴレシャンベルタン | ブルゴーニュ | 3000
3 | サンテミリオン | ボルドー | 5800
4 | オーメドック | ボルドー | 2200
5 | サンセール | ロワール | 2800
6 | シャンパン | シャンパーニュ | 4000
(6 行)
結合演算 - 例続き2
• didも出してみよう!
データベースシステム論 第 回2015 [ 8 ] 11p.
SELECT wid, name, did, district, price
FROM wine JOIN vineyard
ON wine.did = vineyard.did;
dbsys=# SELECT wid, name, did, district, price
dbsys-# FROM wine JOIN vineyard
dbsys-# ON wine.did = vineyard.did;
ERROR: 列参照"did"は曖昧です
行 1: SELECT wid, name, did, district, price
結合するテーブル双方に存在するカラ
ムを含める場合、どちらのテーブルの
カラムの事かを明示的に示さなければ
ならない。※今回の場合はどちらのテーブルでも同じ事ですが…
FAIL!!
SELECT wid, name, wine.did, district, price …
自然結合 - 例
• 外部キー同士のカラム名が同じなら自然結合を
使えば楽に(結合条件無しに)SQLを書けます
データベースシステム論 第 回2015 [ 8 ] 12p.
SELECT * FROM wine NATURAL JOIN vineyard;
did | wid | name | price | district
-----+-----+------------------------+-------+----------------
A | 1 | シャブリ | 2400 | ブルゴーニュ
A | 2 | ジュヴレシャンベルタン | 3000 | ブルゴーニュ
B | 3 | サンテミリオン | 5800 | ボルドー
B | 4 | オーメドック | 2200 | ボルドー
C | 5 | サンセール | 2800 | ロワール
D | 6 | シャンパン | 4000 | シャンパーニュ
(6 行)
外部結合 - 試行課題2(提出無)
• 結果が違うのはどれ?そしてなぜ?
データベースシステム論 第 回2015 [ 8 ] 13p.
SELECT wid, name, district, price
FROM wine [LEFT|FULL|RIGHT] JOIN vineyard
ON wine.did = vineyard.did;
wID name dID price
1 シャブリ A 2400
2 ジュヴレシャンベルタン A 3000
3 サンテミリオン B 5800
4 オーメドック B 2200
5 サンセール C 2800
6 シャンパン D 4000
dID district
A ブルゴーニュ
B ボルドー
C ロワール
D シャンパーニュ
E チリ
wine vineyard
外部結合 - 試行課題2
• wine LEFT JOIN vineyard
• ●にある行を全て得る
• wine FULL JOIN vineyard
• ●と●にある行を全て得る
• wine RIGHT JOIN vineyard
• ●にある行を全て得る
データベースシステム論 第 回2015 [ 8 ] 14p.
wID name dID price
1 シャブリ A 2400
2 ジュヴレシャンベルタン A 3000
3 サンテミリオン B 5800
4 オーメドック B 2200
5 サンセール C 2800
6 シャンパン D 4000
dID district
A ブルゴーニュ
B ボルドー
C ロワール
D シャンパーニュ
E チリ
wine vineyard
A
B
C
D
E
右左
• 対応する行がwineに無い
• NULLで埋まる
外部結合 - 試行課題2
• wine LEFT JOIN vineyard
• ●にある行を全て得る
• wine FULL JOIN vineyard
• ●と●にある行を全て得る
• wine RIGHT JOIN vineyard
• ●にある行を全て得る
データベースシステム論 第 回2015 [ 8 ] 15p.
wID name dID price
1 シャブリ A 2400
2 ジュヴレシャンベルタン A 3000
3 サンテミリオン B 5800
4 オーメドック B 2200
5 サンセール C 2800
6 シャンパン D 4000
dID district
A ブルゴーニュ
B ボルドー
C ロワール
D シャンパーニュ
E チリ
wine vineyard
A
B
C
D
E
右左
• 対応する行がwineに無い
• NULLで埋まる
wid | name | district | price
-----+------------------------+----------------+-------
1 | シャブリ | ブルゴーニュ | 2400
2 | ジュヴレシャンベルタン | ブルゴーニュ | 3000
3 | サンテミリオン | ボルドー | 5800
4 | オーメドック | ボルドー | 2200
5 | サンセール | ロワール | 2800
6 | シャンパン | シャンパーニュ | 4000
| | チリ |
(7 行)
外部結合の意味を考えよう
データベースシステム論 第 回2015 [ 8 ] 16p.
wid | name | district | price
-----+------------------------+----------------+-------
1 | シャブリ | ブルゴーニュ | 2400
2 | ジュヴレシャンベルタン | ブルゴーニュ | 3000
3 | サンテミリオン | ボルドー | 5800
4 | オーメドック | ボルドー | 2200
5 | サンセール | ロワール | 2800
6 | シャンパン | シャンパーニュ | 4000
| | チリ |
(7 行)
内部結合の場合、「何を持っているか」
は分かるが、「何を持っていないか」が
分からない。外部結合の場合は持ってい
ないモノも結果に表れる。
SELECT wid, name, district, price
FROM wine RIGHT JOIN vineyard
ON wine.did = vineyard.did
WHERE wid = NULL; 上手くいった?
外部結合 - 例2
• 持っていないもののみを出そう!
データベースシステム論 第 回2015 [ 8 ] 17p.
wid | name | district | price
-----+------------------------+----------------+-------
<<<<<省略>>>>>
6 | シャンパン | シャンパーニュ | 4000
| | チリ |
(7 行)
SELECT wid, name, district, price
FROM wine RIGHT JOIN vineyard
ON wine.did = vineyard.did
WHERE wid IS NULL;
wid | name | district | price
-----+------+----------+-------
| | チリ |
NULL NULL NULL
NULLの検証にはIS NULL、IS NOT NULLを使います。
外部結合 - 例2
• 持っていないもののみを出そう!
データベースシステム論 第 回2015 [ 8 ] 18p.
wid | name | district | price
-----+------------------------+----------------+-------
<<<<<省略>>>>>
6 | シャンパン | シャンパーニュ | 4000
| | チリ |
(7 行)
SELECT wid, name, district, price
FROM wine RIGHT JOIN vineyard
ON wine.did = vineyard.did
WHERE wid IS NULL;
wid | name | district | price
-----+------+----------+-------
| | チリ |
NULL NULL NULL
NULLの検証にはIS NULL、IS NOT NULLを使います。
•余談
• 何故 wid = NULL がダメ?
• NULLは不明値
「不明値=不明値」が成り
立つかどうか自体が不明
不謹慎な例ですが、AさんとBさんが行方不明だとして、Aさんと
Bさんが同じ所にいる可能性は「不明」ですよね??
アンチ結合 - 例
• 「何をもっていないか」を出すもう1つの方法
としてアンチ結合があります。ただし、SQLの
JOIN句としてサポートされていないので少々
複雑な書き方となります。
データベースシステム論 第 回2015 [ 8 ] 19p.
SELECT *
FROM vineyard
WHERE NOT EXISTS (
SELECT NULL
FROM wine
WHERE vineyard.did = wine.did);
did | district
-----+----------
E | チリ
(1 行)
アンチ結合 - 例
• 「何をもっていないか」を出すもう1つの方法
としてアンチ結合があります。ただし、SQLの
JOIN句としてサポートされていないので少々
複雑な書き方となります。
データベースシステム論 第 回2015 [ 8 ] 20p.
SELECT *
FROM vineyard
WHERE NOT EXISTS (
SELECT NULL
FROM wine
WHERE vineyard.did = wine.did);
did | district
-----+----------
E | チリ
(1 行)
?
?
?
副問い合わせ (Sub query)
• ある問い合わせの中で定義される問い合わせ。
• ネストされた問い合わせにおける主・副関係
• 副問い合わせが定義できる箇所
• 単一の値を与える所 (スカラー副問い合わせ)
• 単一の表を与える所←さっきの例
• 副問い合わせの種類
• 主問い合わせを参照しない副問い合わせ
• 主問い合わせを参照する副問い合わせ
(相関副問い合わせ)
データベースシステム論 第 回2015 [ 8 ] 21p.
スカラー副問い合わせ - 例
• 価格の一番安いワイン
データベースシステム論 第 回2015 [ 8 ] 22p.
SELECT * FROM wine
WHERE price= (
SELECT min(price) FROM wine);
dbsys=# SELECT * FROM wine
dbsys-# WHERE wid = (
dbsys(# SELECT min(wid) FROM wine);
wid | name | did | price
-----+--------------+-----+-------
4 | オーメドック | B | 2200(1 行)
試行課題3 考えてみよう!
• 一番安いワインは次の問い合わせでもOKでは?
データベースシステム論 第 回2015 [ 8 ] 23p.
SELECT * FROM wine ORDER BY price LIMIT 1;
最初のn件を出す
SELECT * FROM wine
WHERE price= (
SELECT min(price) FROM wine);
例のテーブルでは同じ結果を得ますが。これはたまたまです。
さて、この二つの問い合わせは何が異なっているでしょうか。
考えてみましょう。
試行課題3 考えてみよう!
• 一番安いワインは次の問い合わせでもOKでは?
データベースシステム論 第 回2015 [ 8 ] 24p.
SELECT * FROM wine ORDER BY price LIMIT 1;
最初のn件を出す
SELECT * FROM wine
WHERE price= (
SELECT min(price) FROM wine);
答えのヒント!
もし最安値で二種類以上のワインがあったら?
相関副問い合わせ - 例
• 産地毎の一番安いワイン
データベースシステム論 第 回2015 [ 8 ] 25p.
SELECT * FROM wine AS x
WHERE price = (
SELECT min(price)
FROM wine AS y
GROUP BY did
HAVING x.did = y.did);
主問い合わせを参照する副問い合わせ
min
------
4000
2200
2800
2400
D
B
C
A
did
オーメドック
シャンパン
サンセール
シャブリ
wid | name | did | price
-----+--------------+-----+-------
1 | シャブリ | A | 2400
4 | オーメドック | B | 2200
5 | サンセール | C | 2800
6 | シャンパン | D | 4000
IN句、NOT IN句
• 右辺は括弧で括られた副問い合わせ
• 一列のみを返す式でないとならない
• 左辺が右辺副問い合わせの結果行のどれかと等
しい場合「真」となる。(NOT INはその逆)
データベースシステム論 第 回2015 [ 8 ] 26p.
mainquery
WHERE 左辺 [NOT] IN subquery
SELECT * FROM vineyard
WHERE did NOT IN
(SELECT DISTINCT did FROM wine);
IN句と似たような使い方の句とし
てSOME(ANY)句、ALL句があります。
これらは教科書を見てください。
EXISTS句、NOT EXISTS句
• 引数は副問い合わせ文
• IN句と似ているが、実行順が異なる
• IN句:副問い合わせが先に実行される
• 副問い合わせの結果行毎ループで主問い合わせが評価
• EXISTS句:主問い合わせが先に実行される
• 主問い合わせのループ毎にサブクエリが評価
※ただし”実際の”実行順はDBMSが決定するため最適化機構が働い
て、効率の良い実行プランが選択される。
データベースシステム論 第 回2015 [ 8 ] 27p.
mainquery
WHERE [NOT] EXISTS (subquery)
アンチ結合の例に戻りましょう
• EXISTS句:主問い合わせが先に実行される
データベースシステム論 第 回2015 [ 8 ] 28p.
SELECT *
FROM vineyard
WHERE NOT EXISTS (
SELECT NULL
FROM wine
WHERE vineyard.did = wine.did);
• vineyardを副問い合わせで参照している
• →相関副問い合わせ
dID district
A ブルゴーニュ
B ボルドー
C ロワール
D シャンパーニュ
E チリ
vineyard
「wineテーブルにありますか?」「EXISTS!」
「wineテーブルにありますか?」「EXISTS!」
「wineテーブルにありますか?」「EXISTS!」
「wineテーブルにありますか?」「EXISTS!」
「wineテーブルにありますか?」「NOT EXISTS!」
did | district
-----+----------
E | チリ
(1 行)
アンチ結合をNOT IN句で書く
• IN句:副問い合わせが先に実行される
データベースシステム論 第 回2015 [ 8 ] 29p.
SELECT *
FROM vineyard
WHERE did NOT IN(
SELECT DISTINCT did
FROM wine);
did | district
-----+----------
E | チリ
(1 行)
wID name dID price
1 シャブリ A 2400
2 ジュヴレシャンベルタン A 3000
3 サンテミリオン B 5800
4 オーメドック B 2200
5 サンセール C 2800
6 シャンパン D 4000
wine
dID
A
B
C
D
subquery
dID district
A ブルゴーニュ
B ボルドー
C ロワール
D シャンパーニュ
E チリ
vineyard
無いっ!
和演算
• UNION句、UNION ALL句
• スキーマが同一のテーブルを縦方向につなげる
• やってみよう!違いは何?
データベースシステム論 第 回2015 [ 8 ] 30p.
SELECT * FROMテーブル名1
UNION [ALL] SELECT * FROMテーブル名2
SELECT * FROM wine
UNION SELECT * FROM wine;
SELECT * FROM wine
UNION ALL SELECT * FROM wine;
結果の一部表示
• LIMIT句、OFFSET句
• 結果中m番目からn行表示する
• ORDER BY句と一緒に使用する
データベースシステム論 第 回2015 [ 8 ] 31p.
SELECT * FROMテーブル名
ORDER BYソートの基準列 [並び方],…
LIMIT n OFFSET m;
SELECT * FROM wine
ORDER BY price desc
LIMIT 2 OFFSET 3;
小休止・・・
• SQLの役割
• データ定義言語
• テーブルの作成 (CREATE TABLE)前々回
• ビューの作成 (CREATE VIEW)
• データ操作言語
• タプルの挿入・削除・変更 (INSERT, DELETE, UPDATE)前々回
• 問い合わせ (SELECT)前回・今回
• データ制御言語
• トランザクション管理 (BEGIN, ROLLBACK)あとで
• ユーザ管理とセキュリティ (GRANT, REVOKE)
データベースシステム論 第 回2015 [ 8 ] 32p.
データベースシステム論
演習3 課題+コメントペーパー
データベースシステム論 第 回2015 [ 8 ] 33p.
提出課題3 IN句・EXISTS句
• 以下の問い合わせのSQL文を作成せよ。
• ただし以下の3通りのクエリを作れ
• IN句を使って表す
• EXISTS句を使って表す
• スカラー副問い合わせを使って表す
• 提出物
• 各SQLとその出力結果
• 出力結果は当然全て同じものでなければならない
データベースシステム論 第 回2015 [ 8 ] 34p.
(全ワインの)平均価格未満のワインを1つで
も持つ産地のdidと産地名(distinct)を表示せよ
コメントペーパー
• この講義に関する感想や要望を自由に書いて提
出してください。
• 書かれた内容は成績には一切影響させませんの
で、率直に書いてください。
• もらった意見のうち、以降の講義に活かせるも
のに関しては極力対応していきますし、また来
年度以降の講義内容のブラッシュアップに活用
します。
• 提出方法
• 学務情報システムを通して回答
データベースシステム論 第 回2015 [ 8 ] 35p.
次回予告
第9回 SQL応用演習2 ビューとトリガ、アクセス権
データベースシステム論 第 回2015 [ 8 ] 36p.
第9回 SQL応用演習2
• SQL演習の最後にビュー作成し、それを更新可
能にしましょう。またGRANT文とビューを使い、
データへのアクセス権の概念を学びます。
• 来週学ぶこと
• ビューの作成
• 更新可能ビュー
• アクセス権
• 予習
• 対応箇所:SQL関連の章
• 関連個所:SQL全般
データベースシステム論 第 回2015 [ 8 ] 37p.

Mais conteúdo relacionado

Mais de Shohei Yokoyama

データベースシステム論15 - 関係データモデル以外のデータベース
データベースシステム論15 - 関係データモデル以外のデータベースデータベースシステム論15 - 関係データモデル以外のデータベース
データベースシステム論15 - 関係データモデル以外のデータベースShohei Yokoyama
 
データベースシステム論14 - 総復習!
データベースシステム論14 - 総復習!データベースシステム論14 - 総復習!
データベースシステム論14 - 総復習!Shohei Yokoyama
 
データベースシステム論10 - データベースの設計
データベースシステム論10 - データベースの設計データベースシステム論10 - データベースの設計
データベースシステム論10 - データベースの設計Shohei Yokoyama
 
データベースシステム論05 - PostgreSQLのインストール
データベースシステム論05 - PostgreSQLのインストールデータベースシステム論05 - PostgreSQLのインストール
データベースシステム論05 - PostgreSQLのインストールShohei Yokoyama
 
データベースシステム論03 - 関係データモデルと関係代数(前半)
データベースシステム論03 - 関係データモデルと関係代数(前半)データベースシステム論03 - 関係データモデルと関係代数(前半)
データベースシステム論03 - 関係データモデルと関係代数(前半)Shohei Yokoyama
 
データベースシステム論01 - ガイダンス
データベースシステム論01 - ガイダンスデータベースシステム論01 - ガイダンス
データベースシステム論01 - ガイダンスShohei Yokoyama
 
静大情報学部オープンキャンパス ミニ講義CS系
静大情報学部オープンキャンパス ミニ講義CS系静大情報学部オープンキャンパス ミニ講義CS系
静大情報学部オープンキャンパス ミニ講義CS系Shohei Yokoyama
 

Mais de Shohei Yokoyama (7)

データベースシステム論15 - 関係データモデル以外のデータベース
データベースシステム論15 - 関係データモデル以外のデータベースデータベースシステム論15 - 関係データモデル以外のデータベース
データベースシステム論15 - 関係データモデル以外のデータベース
 
データベースシステム論14 - 総復習!
データベースシステム論14 - 総復習!データベースシステム論14 - 総復習!
データベースシステム論14 - 総復習!
 
データベースシステム論10 - データベースの設計
データベースシステム論10 - データベースの設計データベースシステム論10 - データベースの設計
データベースシステム論10 - データベースの設計
 
データベースシステム論05 - PostgreSQLのインストール
データベースシステム論05 - PostgreSQLのインストールデータベースシステム論05 - PostgreSQLのインストール
データベースシステム論05 - PostgreSQLのインストール
 
データベースシステム論03 - 関係データモデルと関係代数(前半)
データベースシステム論03 - 関係データモデルと関係代数(前半)データベースシステム論03 - 関係データモデルと関係代数(前半)
データベースシステム論03 - 関係データモデルと関係代数(前半)
 
データベースシステム論01 - ガイダンス
データベースシステム論01 - ガイダンスデータベースシステム論01 - ガイダンス
データベースシステム論01 - ガイダンス
 
静大情報学部オープンキャンパス ミニ講義CS系
静大情報学部オープンキャンパス ミニ講義CS系静大情報学部オープンキャンパス ミニ講義CS系
静大情報学部オープンキャンパス ミニ講義CS系
 

Último

The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024koheioishi1
 
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料Takayuki Itoh
 
TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationYukiTerazawa
 
UniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScriptUniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScriptyuitoakatsukijp
 
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2Tokyo Institute of Technology
 
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ssusere0a682
 
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学ssusere0a682
 

Último (7)

The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024
 
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
 
TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentation
 
UniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScriptUniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScript
 
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
 
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
 
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
 

データベースシステム論08 - SQL応用演習 結合演算とその他

  • 1. データベースシステム論 2015年度 後期 火曜 3・4時限 情14教室 担当:横山昌平 データベースシステム論 第 回2015 [ 8 ] 1p.
  • 2. 講義計画 • 関係データベースの歴史と基本概念 • SQLの基礎と応用(演習を含めつつ) • データベースの設計と構成 • SQL問い合わせ処理とそれを支える技術 • 関係データモデル以外のデータベース データベースシステム論 第 回2015 [ 8 ] 2p. ※現時点での予定です。進捗に応じて変更します。 27Oct. 20Oct. 13Oct. 24Nov. 17Nov. 10Nov. 1Dec. 8Dec. 5Jan. 15Dec. 26Jan. 19Jan. 12Jan. 2Feb.
  • 4. 集約&整列&リネーム演算 - 例 • 安価なワインの産地別平均価格(降順) • 安価=ワインの価格が4000円未満=安価なワイン • 安価=産地平均価格が4000円未満=安価な産地 データベースシステム論 第 回2015 [ 7 ] 4p. SELECT did, round(avg(price)) FROM wine WHERE price < 4000 GROUP BY did ORDER BY round DESC; SELECT did, round(avg(price)) FROM wine GROUP BY did HAVING avg(price) < 4000 ORDER BY round DESC; did | round -----+------- C | 2800 A | 2700 B | 2200 did | round -----+------- C | 2800 A | 2700
  • 5. 考え方の一例 • 4000円”以下”で考えてみよう • 安価=ワインの価格が4000円以下=安価なワイン • 安価=産地平均価格が4000円以下=安価な産地 データベースシステム論 第 回2015 [ 7 ] 5p. SELECT did, round(avg(price)) FROM wine WHERE price <= 4000 GROUP BY did ORDER BY round DESC; SELECT did, round(avg(price)) FROM wine GROUP BY did HAVING avg(price) <= 4000 ORDER BY round DESC; did | round -----+------- D | 4000 C | 2800 A | 2700 B | 2200 did | round -----+------- B | 4000 D | 4000 C | 2800 A | 2700 wID name dID price 3 サンテミリオン B 5800 4 オーメドック B 2200
  • 7. 結合演算 • 基本的な書き方 • テーブルt1とテーブルt2の結合 • 結合条件:カラムc1とカラムc2が等しい データベースシステム論 第 回2015 [ 8 ] 7p. SELECT * FROM t1 JOIN t2 ON t1.c1 = t2.c2; SELECT * FROM テーブル名 [結合方法] テーブル名 ON [結合条件];
  • 8. 結合演算 - 例 • ワインの産地を表示したい データベースシステム論 第 回2015 [ 8 ] 8p. SELECT * FROM wine JOIN vineyard ON wine.did = vineyard.did; dbsys=# select * from wine join vineyard on wine.did = vineyard.did; wid | name | did | price | did | district -----+------------------------+-----+-------+-----+---------------- 1 | シャブリ | A | 2400 | A | ブルゴーニュ 2 | ジュヴレシャンベルタン | A | 3000 | A | ブルゴーニュ 3 | サンテミリオン | B | 5800 | B | ボルドー 4 | オーメドック | B | 2200 | B | ボルドー 5 | サンセール | C | 2800 | C | ロワール 6 | シャンパン | D | 4000 | D | シャンパーニュ (6 行) wineテーブル vineyardテーブル
  • 9. 結合演算 - 例 • ワインの産地を表示したい データベースシステム論 第 回2015 [ 8 ] 9p. SELECT * FROM wine JOIN vineyard ON wine.did = vineyard.did; dbsys=# select * from wine join vineyard on wine.did = vineyard.did; wid | name | did | price | did | district -----+------------------------+-----+-------+-----+---------------- 1 | シャブリ | A | 2400 | A | ブルゴーニュ 2 | ジュヴレシャンベルタン | A | 3000 | A | ブルゴーニュ 3 | サンテミリオン | B | 5800 | B | ボルドー 4 | オーメドック | B | 2200 | B | ボルドー 5 | サンセール | C | 2800 | C | ロワール 6 | シャンパン | D | 4000 | D | シャンパーニュ (6 行) wineテーブル vineyardテーブル 何結合? 内部結合 INNER JOIN
  • 10. 結合演算 - 例続き • 射影演算にてカラムを整理する データベースシステム論 第 回2015 [ 8 ] 10p. SELECT wid, name, district, price FROM wine JOIN vineyard ON wine.did = vineyard.did; dbsys=# SELECT wid, name, district, price dbsys-# FROM wine JOIN vineyard dbsys-# ON wine.did = vineyard.did; wid | name | district | price -----+------------------------+----------------+------- 1 | シャブリ | ブルゴーニュ | 2400 2 | ジュヴレシャンベルタン | ブルゴーニュ | 3000 3 | サンテミリオン | ボルドー | 5800 4 | オーメドック | ボルドー | 2200 5 | サンセール | ロワール | 2800 6 | シャンパン | シャンパーニュ | 4000 (6 行)
  • 11. 結合演算 - 例続き2 • didも出してみよう! データベースシステム論 第 回2015 [ 8 ] 11p. SELECT wid, name, did, district, price FROM wine JOIN vineyard ON wine.did = vineyard.did; dbsys=# SELECT wid, name, did, district, price dbsys-# FROM wine JOIN vineyard dbsys-# ON wine.did = vineyard.did; ERROR: 列参照"did"は曖昧です 行 1: SELECT wid, name, did, district, price 結合するテーブル双方に存在するカラ ムを含める場合、どちらのテーブルの カラムの事かを明示的に示さなければ ならない。※今回の場合はどちらのテーブルでも同じ事ですが… FAIL!! SELECT wid, name, wine.did, district, price …
  • 12. 自然結合 - 例 • 外部キー同士のカラム名が同じなら自然結合を 使えば楽に(結合条件無しに)SQLを書けます データベースシステム論 第 回2015 [ 8 ] 12p. SELECT * FROM wine NATURAL JOIN vineyard; did | wid | name | price | district -----+-----+------------------------+-------+---------------- A | 1 | シャブリ | 2400 | ブルゴーニュ A | 2 | ジュヴレシャンベルタン | 3000 | ブルゴーニュ B | 3 | サンテミリオン | 5800 | ボルドー B | 4 | オーメドック | 2200 | ボルドー C | 5 | サンセール | 2800 | ロワール D | 6 | シャンパン | 4000 | シャンパーニュ (6 行)
  • 13. 外部結合 - 試行課題2(提出無) • 結果が違うのはどれ?そしてなぜ? データベースシステム論 第 回2015 [ 8 ] 13p. SELECT wid, name, district, price FROM wine [LEFT|FULL|RIGHT] JOIN vineyard ON wine.did = vineyard.did; wID name dID price 1 シャブリ A 2400 2 ジュヴレシャンベルタン A 3000 3 サンテミリオン B 5800 4 オーメドック B 2200 5 サンセール C 2800 6 シャンパン D 4000 dID district A ブルゴーニュ B ボルドー C ロワール D シャンパーニュ E チリ wine vineyard
  • 14. 外部結合 - 試行課題2 • wine LEFT JOIN vineyard • ●にある行を全て得る • wine FULL JOIN vineyard • ●と●にある行を全て得る • wine RIGHT JOIN vineyard • ●にある行を全て得る データベースシステム論 第 回2015 [ 8 ] 14p. wID name dID price 1 シャブリ A 2400 2 ジュヴレシャンベルタン A 3000 3 サンテミリオン B 5800 4 オーメドック B 2200 5 サンセール C 2800 6 シャンパン D 4000 dID district A ブルゴーニュ B ボルドー C ロワール D シャンパーニュ E チリ wine vineyard A B C D E 右左 • 対応する行がwineに無い • NULLで埋まる
  • 15. 外部結合 - 試行課題2 • wine LEFT JOIN vineyard • ●にある行を全て得る • wine FULL JOIN vineyard • ●と●にある行を全て得る • wine RIGHT JOIN vineyard • ●にある行を全て得る データベースシステム論 第 回2015 [ 8 ] 15p. wID name dID price 1 シャブリ A 2400 2 ジュヴレシャンベルタン A 3000 3 サンテミリオン B 5800 4 オーメドック B 2200 5 サンセール C 2800 6 シャンパン D 4000 dID district A ブルゴーニュ B ボルドー C ロワール D シャンパーニュ E チリ wine vineyard A B C D E 右左 • 対応する行がwineに無い • NULLで埋まる wid | name | district | price -----+------------------------+----------------+------- 1 | シャブリ | ブルゴーニュ | 2400 2 | ジュヴレシャンベルタン | ブルゴーニュ | 3000 3 | サンテミリオン | ボルドー | 5800 4 | オーメドック | ボルドー | 2200 5 | サンセール | ロワール | 2800 6 | シャンパン | シャンパーニュ | 4000 | | チリ | (7 行)
  • 16. 外部結合の意味を考えよう データベースシステム論 第 回2015 [ 8 ] 16p. wid | name | district | price -----+------------------------+----------------+------- 1 | シャブリ | ブルゴーニュ | 2400 2 | ジュヴレシャンベルタン | ブルゴーニュ | 3000 3 | サンテミリオン | ボルドー | 5800 4 | オーメドック | ボルドー | 2200 5 | サンセール | ロワール | 2800 6 | シャンパン | シャンパーニュ | 4000 | | チリ | (7 行) 内部結合の場合、「何を持っているか」 は分かるが、「何を持っていないか」が 分からない。外部結合の場合は持ってい ないモノも結果に表れる。
  • 17. SELECT wid, name, district, price FROM wine RIGHT JOIN vineyard ON wine.did = vineyard.did WHERE wid = NULL; 上手くいった? 外部結合 - 例2 • 持っていないもののみを出そう! データベースシステム論 第 回2015 [ 8 ] 17p. wid | name | district | price -----+------------------------+----------------+------- <<<<<省略>>>>> 6 | シャンパン | シャンパーニュ | 4000 | | チリ | (7 行) SELECT wid, name, district, price FROM wine RIGHT JOIN vineyard ON wine.did = vineyard.did WHERE wid IS NULL; wid | name | district | price -----+------+----------+------- | | チリ | NULL NULL NULL NULLの検証にはIS NULL、IS NOT NULLを使います。
  • 18. 外部結合 - 例2 • 持っていないもののみを出そう! データベースシステム論 第 回2015 [ 8 ] 18p. wid | name | district | price -----+------------------------+----------------+------- <<<<<省略>>>>> 6 | シャンパン | シャンパーニュ | 4000 | | チリ | (7 行) SELECT wid, name, district, price FROM wine RIGHT JOIN vineyard ON wine.did = vineyard.did WHERE wid IS NULL; wid | name | district | price -----+------+----------+------- | | チリ | NULL NULL NULL NULLの検証にはIS NULL、IS NOT NULLを使います。 •余談 • 何故 wid = NULL がダメ? • NULLは不明値 「不明値=不明値」が成り 立つかどうか自体が不明 不謹慎な例ですが、AさんとBさんが行方不明だとして、Aさんと Bさんが同じ所にいる可能性は「不明」ですよね??
  • 19. アンチ結合 - 例 • 「何をもっていないか」を出すもう1つの方法 としてアンチ結合があります。ただし、SQLの JOIN句としてサポートされていないので少々 複雑な書き方となります。 データベースシステム論 第 回2015 [ 8 ] 19p. SELECT * FROM vineyard WHERE NOT EXISTS ( SELECT NULL FROM wine WHERE vineyard.did = wine.did); did | district -----+---------- E | チリ (1 行)
  • 20. アンチ結合 - 例 • 「何をもっていないか」を出すもう1つの方法 としてアンチ結合があります。ただし、SQLの JOIN句としてサポートされていないので少々 複雑な書き方となります。 データベースシステム論 第 回2015 [ 8 ] 20p. SELECT * FROM vineyard WHERE NOT EXISTS ( SELECT NULL FROM wine WHERE vineyard.did = wine.did); did | district -----+---------- E | チリ (1 行) ? ? ?
  • 21. 副問い合わせ (Sub query) • ある問い合わせの中で定義される問い合わせ。 • ネストされた問い合わせにおける主・副関係 • 副問い合わせが定義できる箇所 • 単一の値を与える所 (スカラー副問い合わせ) • 単一の表を与える所←さっきの例 • 副問い合わせの種類 • 主問い合わせを参照しない副問い合わせ • 主問い合わせを参照する副問い合わせ (相関副問い合わせ) データベースシステム論 第 回2015 [ 8 ] 21p.
  • 22. スカラー副問い合わせ - 例 • 価格の一番安いワイン データベースシステム論 第 回2015 [ 8 ] 22p. SELECT * FROM wine WHERE price= ( SELECT min(price) FROM wine); dbsys=# SELECT * FROM wine dbsys-# WHERE wid = ( dbsys(# SELECT min(wid) FROM wine); wid | name | did | price -----+--------------+-----+------- 4 | オーメドック | B | 2200(1 行)
  • 23. 試行課題3 考えてみよう! • 一番安いワインは次の問い合わせでもOKでは? データベースシステム論 第 回2015 [ 8 ] 23p. SELECT * FROM wine ORDER BY price LIMIT 1; 最初のn件を出す SELECT * FROM wine WHERE price= ( SELECT min(price) FROM wine); 例のテーブルでは同じ結果を得ますが。これはたまたまです。 さて、この二つの問い合わせは何が異なっているでしょうか。 考えてみましょう。
  • 24. 試行課題3 考えてみよう! • 一番安いワインは次の問い合わせでもOKでは? データベースシステム論 第 回2015 [ 8 ] 24p. SELECT * FROM wine ORDER BY price LIMIT 1; 最初のn件を出す SELECT * FROM wine WHERE price= ( SELECT min(price) FROM wine); 答えのヒント! もし最安値で二種類以上のワインがあったら?
  • 25. 相関副問い合わせ - 例 • 産地毎の一番安いワイン データベースシステム論 第 回2015 [ 8 ] 25p. SELECT * FROM wine AS x WHERE price = ( SELECT min(price) FROM wine AS y GROUP BY did HAVING x.did = y.did); 主問い合わせを参照する副問い合わせ min ------ 4000 2200 2800 2400 D B C A did オーメドック シャンパン サンセール シャブリ wid | name | did | price -----+--------------+-----+------- 1 | シャブリ | A | 2400 4 | オーメドック | B | 2200 5 | サンセール | C | 2800 6 | シャンパン | D | 4000
  • 26. IN句、NOT IN句 • 右辺は括弧で括られた副問い合わせ • 一列のみを返す式でないとならない • 左辺が右辺副問い合わせの結果行のどれかと等 しい場合「真」となる。(NOT INはその逆) データベースシステム論 第 回2015 [ 8 ] 26p. mainquery WHERE 左辺 [NOT] IN subquery SELECT * FROM vineyard WHERE did NOT IN (SELECT DISTINCT did FROM wine); IN句と似たような使い方の句とし てSOME(ANY)句、ALL句があります。 これらは教科書を見てください。
  • 27. EXISTS句、NOT EXISTS句 • 引数は副問い合わせ文 • IN句と似ているが、実行順が異なる • IN句:副問い合わせが先に実行される • 副問い合わせの結果行毎ループで主問い合わせが評価 • EXISTS句:主問い合わせが先に実行される • 主問い合わせのループ毎にサブクエリが評価 ※ただし”実際の”実行順はDBMSが決定するため最適化機構が働い て、効率の良い実行プランが選択される。 データベースシステム論 第 回2015 [ 8 ] 27p. mainquery WHERE [NOT] EXISTS (subquery)
  • 28. アンチ結合の例に戻りましょう • EXISTS句:主問い合わせが先に実行される データベースシステム論 第 回2015 [ 8 ] 28p. SELECT * FROM vineyard WHERE NOT EXISTS ( SELECT NULL FROM wine WHERE vineyard.did = wine.did); • vineyardを副問い合わせで参照している • →相関副問い合わせ dID district A ブルゴーニュ B ボルドー C ロワール D シャンパーニュ E チリ vineyard 「wineテーブルにありますか?」「EXISTS!」 「wineテーブルにありますか?」「EXISTS!」 「wineテーブルにありますか?」「EXISTS!」 「wineテーブルにありますか?」「EXISTS!」 「wineテーブルにありますか?」「NOT EXISTS!」 did | district -----+---------- E | チリ (1 行)
  • 29. アンチ結合をNOT IN句で書く • IN句:副問い合わせが先に実行される データベースシステム論 第 回2015 [ 8 ] 29p. SELECT * FROM vineyard WHERE did NOT IN( SELECT DISTINCT did FROM wine); did | district -----+---------- E | チリ (1 行) wID name dID price 1 シャブリ A 2400 2 ジュヴレシャンベルタン A 3000 3 サンテミリオン B 5800 4 オーメドック B 2200 5 サンセール C 2800 6 シャンパン D 4000 wine dID A B C D subquery dID district A ブルゴーニュ B ボルドー C ロワール D シャンパーニュ E チリ vineyard 無いっ!
  • 30. 和演算 • UNION句、UNION ALL句 • スキーマが同一のテーブルを縦方向につなげる • やってみよう!違いは何? データベースシステム論 第 回2015 [ 8 ] 30p. SELECT * FROMテーブル名1 UNION [ALL] SELECT * FROMテーブル名2 SELECT * FROM wine UNION SELECT * FROM wine; SELECT * FROM wine UNION ALL SELECT * FROM wine;
  • 31. 結果の一部表示 • LIMIT句、OFFSET句 • 結果中m番目からn行表示する • ORDER BY句と一緒に使用する データベースシステム論 第 回2015 [ 8 ] 31p. SELECT * FROMテーブル名 ORDER BYソートの基準列 [並び方],… LIMIT n OFFSET m; SELECT * FROM wine ORDER BY price desc LIMIT 2 OFFSET 3;
  • 32. 小休止・・・ • SQLの役割 • データ定義言語 • テーブルの作成 (CREATE TABLE)前々回 • ビューの作成 (CREATE VIEW) • データ操作言語 • タプルの挿入・削除・変更 (INSERT, DELETE, UPDATE)前々回 • 問い合わせ (SELECT)前回・今回 • データ制御言語 • トランザクション管理 (BEGIN, ROLLBACK)あとで • ユーザ管理とセキュリティ (GRANT, REVOKE) データベースシステム論 第 回2015 [ 8 ] 32p.
  • 34. 提出課題3 IN句・EXISTS句 • 以下の問い合わせのSQL文を作成せよ。 • ただし以下の3通りのクエリを作れ • IN句を使って表す • EXISTS句を使って表す • スカラー副問い合わせを使って表す • 提出物 • 各SQLとその出力結果 • 出力結果は当然全て同じものでなければならない データベースシステム論 第 回2015 [ 8 ] 34p. (全ワインの)平均価格未満のワインを1つで も持つ産地のdidと産地名(distinct)を表示せよ
  • 35. コメントペーパー • この講義に関する感想や要望を自由に書いて提 出してください。 • 書かれた内容は成績には一切影響させませんの で、率直に書いてください。 • もらった意見のうち、以降の講義に活かせるも のに関しては極力対応していきますし、また来 年度以降の講義内容のブラッシュアップに活用 します。 • 提出方法 • 学務情報システムを通して回答 データベースシステム論 第 回2015 [ 8 ] 35p.
  • 37. 第9回 SQL応用演習2 • SQL演習の最後にビュー作成し、それを更新可 能にしましょう。またGRANT文とビューを使い、 データへのアクセス権の概念を学びます。 • 来週学ぶこと • ビューの作成 • 更新可能ビュー • アクセス権 • 予習 • 対応箇所:SQL関連の章 • 関連個所:SQL全般 データベースシステム論 第 回2015 [ 8 ] 37p.