SQLのexistsとinの違いは、返り値とカラム指定するかどうか
  • facebookページ
  • twitterページ
  • 2020.04.29

    SQLのexistsとinの違いは、返り値とカラム指定するかどうか

    SQLのexistsとinの違いについてまとめています。

    SQLのexistsとinの違い existsはtrueかfalseしか返さない

    existsは、存在するかどうかだけを判定するのに対し、inは条件に当てはまるデータを全て抽出します。また、inはカラム名を指定するのに対して、existsは無指定です。

    inは対象となるレコードを返しますが、existsは存在したらtrueと返すだけです。

    以下はexistsを使ったSQLの例です。employees(社員)テーブルと、肩書(titles)テーブルを結合して肩書がStaffの社員を抽出します。

    【関連記事】
    SQL not exists サンプルコード 2テーブルの片方にしかないデータを抽出

    以下は、inを使った例です。dept_emp(部署社員紐付テーブル)で社員が30,000人以上の部署を抽出しています。

    【関連記事】
    SQL in句のサンプルコード集 複数カラムの指定方法とは?

    existsとinは、どちらも速度が遅い

    SQLの実行速度としては、existsもinもクエリの応答速度が遅いです。一件でも見つかった時点でスキャンを中止するexistsが、SQLによっては早いケースもあります。

    速度を改善するには、explainでボトルネックを確認し、場合によってはクエリを結合(join)で書き換えできないかどうかを検討しましょう。

    上記の場合、existsを使ったSQLは、possible_keysが2テーブルともPRIMARYとなっていて、インデックスが利用できていることがわかります。

    また、後者のinを使ったSQLでは、departmentsに対してpossible_keysがNULLとなっており、テーブルフルスキャンが発生していますが、テーブルのデータ件数が9件のため大した速度低下が起こっていないことがわかります。

    【関連記事】
    SQLのexplainは、実行計画を表示 遅いSQLのボトルネックを発見する

    まとめ

    ポテパンダの一言メモ
    • existsとinの違いは返す値。inは対象レコードを返すが、existsはtrueかfalseのみ返す。
    • existsもinも、クエリ速度は遅いため、速度改善には結合(join)での書き換えを検討する
    • ボトルネックになる箇所を発見するには、explain(実行計画)を確認する


    優良フリーランス案件多数掲載中!
    フリーランスエンジニアの案件をお探しなら
    ポテパンフリーランス

    この記事をシェア

    • Facebookシェア
    • Twitterシェア
    • Hatenaシェア
    • Lineシェア
    pickup









    ABOUT US

    ポテパンはエンジニアと企業の最適なマッチングを追求する企業です。

    READ MORE