4. 前回の課題はOK?
• ワインのテーブルを作ってみよう!
• 提出方法
• 学情システムにて
データベースシステム論 第 回2016 [ 7 ] 4p.
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
主キー 外部キー
主キー
15. 整列演算- 例1
• 値段順に並べる
データベースシステム論 第 回2016 [ 7 ] 15p.
SELECT * FROM wine ORDER BY price ;
dbsys=# SELECT * FROM wine ORDER BY price ;
wid | name | did | price
-----+------------------------+-----+-------
4 | オーメドック | B | 2200
1 | シャブリ | A | 2400
5 | サンセール | C | 2800
2 | ジュヴレシャンベルタン | A | 3000
6 | シャンパン | D | 4000
3 | サンテミリオン | B | 5800
(6 行)
昇順
16. 整列演算- 例2
• dID(アルファベット)でソートは可能?
データベースシステム論 第 回2016 [ 7 ] 16p.
SELECT name,did FROM wine ORDER BY did;
dbsys=# SELECT name,did FROM wine ORDER BY did;
name | did
------------------------+-----
シャブリ | A
ジュヴレシャンベルタン | A
サンテミリオン | B
オーメドック | B
サンセール | C
シャンパン | D
(6 行)
辞書順順
17. 整列演算- 例3
• name(カタカナ文字列)でソートは可能?
データベースシステム論 第 回2016 [ 7 ] 17p.
SELECT wid,name FROM wine ORDER BY name;
dbsys=# SELECT wid,name FROM wine ORDER BY name;
wid | name
-----+------------------------
4 | オーメドック
5 | サンセール
3 | サンテミリオン
1 | シャブリ
6 | シャンパン
2 | ジュヴレシャンベルタン
(6 行)
辞書順順
24. 集約演算
• GROUP BY句
• ※1
• 射影可能なフィールドは次のいずれか
• GROUP BY句で指定したフィールド
• 上記以外のフィールドを集約関数の引数に指定したもの
• 定数や単体で結果を返す関数
データベースシステム論 第 回2016 [ 7 ] 24p.
SELECTフィールド名※1
FROMテーブル名
GROUP BYグループ化するフィールド名,…;
25. 集約演算 - 例
• 産地別平均価格
データベースシステム論 第 回2016 [ 7 ] 25p.
SELECT did, round(avg(price)) FROM wine
GROUP BY did;
dbsys=# SELECT did, round(avg(price)) FROM wine GROUP BY did;
did | round
-----+-------
D | 4000
B | 4000
C | 2800
A | 2700
(4 行)
wID name dID price
1 シャブリ A 2400
2 ジュヴレシャンベルタン A 3000
3 サンテミリオン B 5800
4 オーメドック B 2200
5 サンセール C 2800
6 シャンパン D 4000
確認してみよう
26. 集約&整列演算 - 例
• 産地別平均価格(降順)
データベースシステム論 第 回2016 [ 7 ] 26p.
SELECT did, round(avg(price)) FROM wine
GROUP BY did
ORDER BY price DESC;
dbsys=# SELECT did, round(avg(price)) FROM wine
dbsys-# GROUP BY did
dbsys-# ORDER BY price DESC;
ERROR: 列"wine.price"はGROUP BY句で出現しなけ
ればならないか、集約関数内で使用しなければなり
ません
行 3: ORDER BY price DESC;
^
27. 集約&整列演算 - 例
• 産地別平均価格(降順)
• 整列基準に指定できるのは結果に表れる行のみ
• この例の場合はdidもしくは集約されたprice値
データベースシステム論 第 回2016 [ 7 ] 27p.
SELECT did, round(avg(price)) FROM wine
GROUP BY did
ORDER BY price DESC;
PostgreSQLの場合、そして大抵の
DBSMの場合、あるカラムに関数を
適用した結果のカラム名は関数名が
付いている。(この例の場合round)
28. 集約&整列演算 - 例
• 産地別平均価格(降順)
データベースシステム論 第 回2016 [ 7 ] 28p.
SELECT did, round(avg(price)) FROM wine
GROUP BY did
ORDER BY round DESC;
dbsys=# SELECT did, round(avg(price)) FROM wine
dbsys-# GROUP BY did ORDER BY round DESC;
did | round
-----+-------
D | 4000
B | 4000
C | 2800
A | 2700
(4 行)
降順
29. 集約&整列&リネーム演算 - 例
• 産地別平均価格(降順)※roundなんてカラム名は使わない版
データベースシステム論 第 回2016 [ 7 ] 29p.
SELECT did, round(avg(price)) AS price
FROM wine
GROUP BY did ORDER BY price DESC;
dbsys=# SELECT did, round(avg(price)) AS price
dbsys-# FROM wine GROUP BY did ORDER BY price DESC;
did | price
-----+-------
D | 4000
B | 4000
C | 2800
A | 2700
(4 行)
降順
30. 集約&整列&リネーム演算 - 例
• 安価なワインの産地別平均価格(降順)
• 安価=ワインの価格が4000円未満=安価なワイン
• 安価=産地平均価格が4000円未満=安価な産地
データベースシステム論 第 回2016 [ 7 ] 30p.
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;
31. 集約&整列&リネーム演算 - 例
• 安価なワインの産地別平均価格(降順)
• 安価=ワインの価格が4000円未満=安価なワイン
• 安価=産地平均価格が4000円未満=安価な産地
データベースシステム論 第 回2016 [ 7 ] 31p.
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
33. 提出課題2
• WHERE句とHAVIGN句の動作の違いを考察せよ
• 課題の具体的な内容はWebを参照のこと
• 提出方法
• 講義のホームページの「課題2」を参照
データベースシステム論 第 回2016 [ 7 ] 33p.
did | round
-----+-------
C | 2800
A | 2700
B | 2200
did | round
-----+-------
C | 2800
A | 2700
wID name dID price
1 シャブリ A 2400
2 ジュヴレシャンベルタン A 3000
3 サンテミリオン B 5800
4 オーメドック B 2200
5 サンセール C 2800
6 シャンパン D 4000
WHERE句
HAVING句