< 20 ORDER BY name; • クエリ結果を任意の列で昇順にソート • デフォルトでは昇順 (ASC) だが、降順 (DESC) にもできる • 複数のASCとDESCのミックス SELECT sid, nam FROM student WHERE age < 20 ORDER BY age DESC, name ASC; 例:氏名の辞書順で並び替え 例:年齢順、名前順で並び替え
= ‘計算機科学’; COUNT(*) 30 SELECT COUNT(age) FROM student WHERE major = ‘計算機科学’; COUNT(age) 30 SELECT COUNT(1) FROM student WHERE major = ‘計算機科学’; COUNT(1) 30
COUNT(*) 30 SELECT COUNT(age) FROM student WHERE major = ‘計算機科学’; COUNT(age) 30 SELECT COUNT(1) FROM student WHERE major = ‘計算機科学’; COUNT(1) 30 • COUNT(*)とCOUNT(定数)は全行数 • COUNT(列名)はNULLを除外した行数 Q. 計算機科学を専攻する学生の数がしりたい
HAVING SELECT major, AVG(age), COUNT(*) FROM student GROUP BY major HAVING COUNT(*) >= 30; 計算機科学 文化人類学 経済学 AVG(age)=20.8 COUNT(*)=21 AVG(age)=21.9 COUNT(*)=30 AVG(age)=21.3 COUNT(*)=41 例:集計対象の専攻を学生数30以上のものに絞る x
対応関係による関連集合の分類 ◦ 多対多関連集合 (many-to-many) ◦ 1対多関連集合 (1-to-many) ◦ 多対1関連集合 (many-to-1) ◦ 1対1関連集合 (1-to-1) 多対多 N M A B 表記法の例 多対1 N 1 A B Bの実体がこの関連集合に参加できる最大の数
複合インデックス • 都度、前のインデックスはDROP 1. CREATE INDEX idx_major on student (major); EXPLAIN SELECT * FROM student WHERE major = "計算幾何学"; 2. CREATE INDEX idx_age on student (age); EXPLAIN SELECT * FROM student WHERE ORDER BY age; 3. CREATE INDEX idx_major on student (major); EXPLAIN SELECT major, COUNT(*) FROM student WHERE age > 20 GROUP BY major; 4. CREATE INDEX idx_major_age on student (major); EXPLAIN SELECT * FROM student WHERE major = "計算幾何学" ORDER BY age; インデックスを貼る前後でクエリの実行計画 にどんな変化があるか確認しよう!
major FROM student GROUP BY major HAVING COUNT(*) < 30) m ON s.major = m.major; 例:専攻人数が30人未満の分野を専攻している学生一覧 • サブクエリは、ほぼどこにでも書ける ◦ SELECT句, FROM句, WHERE句, HAVING句, ....
• ELSE句は必ず書く (ないと暗黙にELSE NULL) SELECT name, CASE WHEN age >= 22 THEN "22歳以上" WHEN age >= 20 THEN "20歳以上22歳未満" ELSE "20歳未満" END as age_category FROM student s; 例:学生に年齢カテゴリを付与
計算機科学 11 20 10 経済学 9 12 9 SELECT major, SUM(CASE WHEN age >= 22 THEN 1 ELSE 0 END) as "22歳以上の数", SUM(CASE WHEN age >= 20 AND age < 22 THEN 1 ELSE 0 END) as "20歳以上22歳未満の数", SUM(CASE WHEN age < 20 THEN 1 ELSE 0 END) as "20歳未満の数" FROM student GROUP BY major; • こういうこともできる 集約関数の中で使うと、行 を列に変換できる 例:各分野における年齢カテゴリごとの学生数
SQL実践入門 ──高速でわかりやすいクエリの書き方 • Webエンジニアのための データベース技術[実践]入門 • リレーショナルデータベース入門―データモデル・SQL・管理システム・NoSQL 第3版 • 失敗から学ぶRDBの正しい歩き方 • データ指向アプリケーションデザイン――信頼性、拡張性、保守性の高い分散システム設計の原理 • CS 15-445/645 Database Systems at Carnegie Mellon University • CS186 Introduction to Database Systems at University of California, Berkeley