述語
述語とは戻り値が真理値になる関数
IN述語とEXISTS述語はどちらも述語である
IN述語
ORの便利な省略形である
構文
<column_name> IN <vector>
例
pop_sex
pref_name | sex | population |
---|---|---|
東京 | 1 | 250 |
東京 | 2 | 250 |
神奈川 | 1 | 200 |
神奈川 | 2 | 100 |
福岡 | 1 | 150 |
福岡 | 2 | 100 |
埼玉 | 1 | 100 |
埼玉 | 2 | 150 |
長崎 | 1 | 20 |
長崎 | 2 | 30 |
千葉 | 1 | 120 |
千葉 | 2 | 130 |
山形 | 1 | 50 |
山形 | 2 | 50 |
東京と長崎と千葉のレコードだけ見たい場合
SELECT
SELECT
pref_name,
pop
FROM
pop_sex
WHERE
pref_name
IN
('東京', '長崎', '千葉')
;
pop_sex
pref_name | sex | population |
---|---|---|
東京 | 1 | 250 |
東京 | 2 | 250 |
長崎 | 1 | 20 |
長崎 | 2 | 30 |
千葉 | 1 | 120 |
千葉 | 2 | 130 |
引数にサブクエリ(ビューやテーブル)を指定することも可能
サブクエリについてはこちら
<column_name> IN <sub_query>
EXISTS述語
条件に合致するレコードの存在有無を調べる述語
引数は常に相関サブクエリを指定する
構文
EXISTS <相関サブクエリ>
INと大きく異なるのは、INはカラム名などとサブクエリを引数としていたが、EXISTSは相関サブクエリ1つだけを引数とする
例
関東の人口が200以上のレコードだけ見たい場合
kanto_pref
pref_name | pref_cod |
---|---|
東京 | 1 |
神奈川 | 2 |
埼玉 | 3 |
千葉 | 4 |
SELECT
SELECT
pref_name,
pop
FROM
pop_sex AS P
WHERE
EXISTS
(
SELECT
*
FROM
kanto_pref AS K
WHERE
P.pref_name = K.pref_name
AND
P.population >= 200
)
;
EXISTS述語の注意点
相関サブクエリのSELECT *
EXISTSはレコードの存在有無のみを判定条件としているため、列は一切関係ない。
そのため *(アスタリスク)を指定するのが慣習。
INとEXISTSの違い
サブクエリのreturn
INは条件に当てはまるデータを全て抽出し、対象となるレコードを全て返す。
EXISTSは存在するかどうかだけを判定するので、一つでも対象レコードが見つかれば処理を終了する。
評価順序
- IN句
- 主問い合わせのWHERE句
- EXISTS
できるだけ早い段階でデータ量を絞り込めるかどうかを考える。