1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

IN述語とEXISTS述語を有効活用してSQLマスターになろう

Posted at

述語

述語とは戻り値が真理値になる関数
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は存在するかどうかだけを判定するので、一つでも対象レコードが見つかれば処理を終了する。

評価順序

  1. IN句
  2. 主問い合わせのWHERE句
  3. EXISTS

できるだけ早い段階でデータ量を絞り込めるかどうかを考える。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?