はじめに
IPAのデータベーススペシャリストの試験が近いので勉強した内容をアウトプットしていく
用語
縦の列を
属性、フィールド、カラム(columns)
横の行を
タプル、ロー(row)
表のことを
テーブル(table)
と呼ぶ
和両立とは表の結合の際に選択項目をそろえる必要があることである
和集合(UNION)
差集合(EXCEPT)
共通集合(INTERSECT)
ただし直積(CROSS JOIN)
は和両立ではない
射影
- COALESCE
A表にnameがなかった場合は'unknown'と表示する
SELECT COALESCE(name,'unknown') FROM A
COALESCEを使わずこれでも結果は同じ
SELECT CASE WHEN name IS NULL THEN 'unknown'
ELSE name END FROM A
- DISTINCT
A表のnameの重複を排除する
SELECT DISTINCT(name) FROM A
- CASE WHEN
A表からもしpriceが300以下なら割引価格それ以外なら通常価格と表示
SELECT
CASE WHEN price <= 300 THEN '割引対象'
ELSE 通常価格
END FROM A
内部結合
- 直積
- すべての組み合わせ
A表のタプルが500行、B表のタプルが500行あったとき
500*500=250000行となる
SELECT * FROM A,B
副問い合わせ
EXISTS(実行されるかされないか)
まずかっこの部分を評価する
Bが存在(EXISTS)したらAをすべて表示する
SELECT * FROM A
WHERE EXISTS (
SELECT * FROM B
)
Bが存在しなかったらAをすべて表示する
SELECT * FROM A
WHERE NOT EXISTS (
SELECT * FROM B
)
相関副問い合わせ
内側にその側のテーブルを記載することで1行ずつ評価していく
B表にあるnameがA表にもあったらA表からnameを一行表示
B表にあるnameがA表にもあったらA表からnameを一行表示と一行ずつ実行する
SELECT name FROM A
WHERE EXISTS (
SELECT * FROM B.name = A.name
)
SELECT name FROM A
WHERE IN (
SELECT * FROM B.name = A.name
)