1章 SQL
03/15
SELECT
射影と選択
- 射影はcolumnを抜き出す
- 選択はrowを抜き出す
- SELECT * FROM R WHERE X 比較演算子 Y
選択項目リスト
- 算術演算子
- 連結演算子
- 別名(相関名)の指定
- 重複の除去
- NULL処理
- COALESCE句を使用する
- isNotNull?(a:b)とCOALESCE (a,b)が同義
- 条件式(CASE文)
- CASE WHEN 条件式 THEN 文 ELSE 文 END
notes
- COUNTはstd::mapのような感じ
- NULLの時にカウントされない
- SQLは3値論理(True/False/Unknown(不定))
WHERE
BETWEEN
- 閉区間の範囲指定
- BETWEEN A AND Bで[A,B]の閉区間となる
IN
- 値の完全一致
- IN (A, B)で==A || ==Bと同義
LIKE
- 文字列の部分一致
- %は*と同義(ワイルドカード)
- _は任意の1文字
記法 | 意味 |
LIKE 'hoge%' | 前方一致検索 |
LIKE '%hoge' | 後方一致検索 |
LIKE '%hoge%' | 中間一致検索 |
NULL
NOT
GROUP BY
集約関数
関数 | 補足 |
AVG(列名) | 平均 |
MAX(列名) | 最大値 |
MIN(列名) | 最小値 |
SUM(列名) | 総和 |
COUNT(*) | 行数を数える(std::map) |
COUNT(DISTINCT 列名) | 列名を指定して, その列の重複値を除く行数を求める |
使用例
通常時
- 年齢をグループ化して各年齢の人数合計を求める時は, 次のように書く
- GROUP BYを使用する時, 次の値のみしかSELECTできない
HAVING句を使用する時
- GROUP BYの結果に対してvalidationを指定したい場合は, HAVING句の後に条件式を指定する
- 同じ年齢の人間が5人以上いる時のみ表示する時は, 次のように書く
ORDER BY
使用例
- 年齢をグループ化して各年齢の人数合計を求め, 年齢について降順で表示する時は, 次のように書く
- 年齢をグループ化して各年齢の人数合計を求め, 年齢について昇順で表示する時は, 次のように書く
- 年齢をグループ化して各年齢の人数合計を求め, 合計人数について昇順で表示する時は, 次のように書く
結合
内部結合と外部結合
名称 | 補足 |
内部結合 | A AND B |
左外部結合 | A |
右外部結合 | B |
全外部結合 | A OR B |
等結合と自然結合
- いずれも, rowが同じ要素を結合する
- 等結合は, そのままくっつける
- 自然結合は, 同じ列を重複して表示しない
- e.g.)
- 以下の表を年齢で結合する時
年齢 | 足のサイズ |
10 | 18 |
11 | 20 |
12 | 22 |
年齢 | 体重 | 年齢 | 足のサイズ |
10 | 40 | 10 | 18 |
11 | 50 | 11 | 20 |
12 | 55 | 12 | 22 |
年齢 | 体重 | 足のサイズ |
10 | 40 | 18 |
11 | 50 | 20 |
12 | 55 | 22 |
和・差・直積・積・商
和
- R ∪ S
- UNIONで和を表す
- UNION ALLと書くと重複を許す
差
直積
積
- R ∩ S
- INTERSECTで積を表す
商
- R ÷ S
- ∃ T, S × T = R ⇒ R ÷ S = Tと定義する