プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • SQL
  • 【SQL】「サブクエリ(副問い合わせ)」について
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【SQL】「サブクエリ(副問い合わせ)」について

06.21

  • miyabisan2
  • コメントを書く

この記事は2分で読めます

サブクエリ(副問い合わせ)とは?

一言で言えば、SELECT文の中で使用できる「使い捨てのビュー」です。

サブクエリの階層を増やした場合

サブクエリの階層を増やすと、複数文ではなく、単一のSQLで書けるというメリットもありますが、下記のデメリットがあるのでなるべく避けた方がよいでしょう。

  • SQL文が読みづらくなる。
  • パフォーマンスが悪くなる。

サブクエリに名前を付けるには?

ASキーワードを使用してもよいですし、省略してもかまいません。

サブクエリのメリット

サブクエリ はパフォーマンス面において不利な点が多いです。

ただ、結合が関係するクエリにおいては性能面でサブクエリを使っていくというのも選択肢の一つになってきます。

例えば、以下のような二つの例があるとします。

joinを先にやって、条件を絞る。

1
2
3
select * from テーブル1
inner join テーブル2 on 結合条件
where 条件

サブクエリ の中で条件を抽出してそれをjoinする。

1
2
select * from テーブル1
inner join (条件つきのサブクエリ) on 結合条件

この場合だと、joinで結合するテーブルの件数が減るので、サブクエリ を使用した方がパフォーマンスが良くなるケースがあります。

サブクエリ の問題点

サブクエリ の計算コストが上乗せされる。

サブクエリ はテーブルと違って実体のデータを保持していないので、アクセスするたびにSELECT文が発行されて計算コストがかかります。サブクエリ の中身が複雑であればあるほどこのコストは増えます。

データのI/Oコストがかかる。

計算した結果がメモリ上に乗れば早いのですが、メモリからはみ出た場合は「TEMP落ち」になって速度が低下します。

最適化が受けられない。

明示的に制約やインデックスを使っているテーブルと違って、サブクエリ にはそのようなメタ情報が一切存在しない。

オプティマイザがクエリを解析するための必要な情報がサブクエリ の結果からは得ることができません。

対策

本当にサブクエリ を使わないとできないかを常に考えるようにすること。

ウインドウ関数などで置き換えられないか考える。

サブクエリの注意点

基本的には、通常のサブクエリであれば、複数行返すのでSELECT句には書けません。

また、WHERE句に書いたとしても、比較演算子を使うことができません。

しかし、「スカラ・サブクエリ」という類のサブクエリを使うことで、書ける場所が広がります。

スカラ・サブクエリとは?

サブクエリの実行結果として、「必ず1行、1列の値を返す」サブクエリのことです。

スカラ・サブクエリの戻り値の例

ITEM
商品1

スカラ・サブクエリの特徴

比較演算子(=、<、>等)を使うことができます。

例えば、WHERE句では、集計関数を使うことはできませんが、サブクエリで集計するSELECT文を作って、その結果を返せば、WHERE句で集計結果の抽出と言うような使い方も可能です。

SELECT文の中で、書ける場所が多い。

基本的には、複数行を返すサブクエリの場合は、書ける場所も制限があります。

しかし、スカラ・サブクエリの場合は、定数や列名を記述できる場所であればどこでもよく、記述できる句が多いです。

  • SELECT句
  • GROUP BY句
  • HAVING句
  • ORDER BY句

相関サブクエリ

複数行値を返すようなサブクエリでも、条件を指定してテーブルの一部分のみに絞ることで、述語(=、<、>等)を使えるようにする目的で使うサブクエリです。

詳しくは下記の記事でも解説しています。

【SQL】「相関サブクエリ」とは何か?

スポンサーリンク
  • 2018 06.21
  • miyabisan2
  • コメントを書く
  • SQL
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2018 06.21

    【SQL】SELECT文の評価順

  2. 2018 05.20

    【PL/SQL】「変数」や「固定値」の使い方

  3. 2021 10.24

    【SQL】「ON句」の意外と知らない活用法

  4. 2018 06.21

    【SQL】「述語」(BETWEEN、IN、EXISTS等)の種類

  5. 2021 11.07

    【SQL】アンチパターン「UNIONを使った条件分岐」

  6. 2018 05.20

    【PL/SQL】導入の基本、プログラムの基本構文について

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【SQL】「述語」(BETWEEN、IN、EXISTS…

【SQL】CASE式について

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー