SQL Server
 Computer >> コンピューター >  >> プログラミング >> SQL Server

SQL Serverのサブクエリ(副問い合わせ)とは?WHERE・FROM・SELECT句での使い方を実例付きで解説

この記事では、SQL Serverにおけるサブクエリ(副問い合わせ)の基本的な概念と、具体的な構文や使用例について詳しく解説します。

SQL Serverにおけるサブクエリとは?

SQL Serverにおいて、サブクエリ(subquery/副問い合わせ)とは、別のクエリの中に組み込まれたクエリのことを指します。SQL文の中にさらに問い合わせを作成でき、そのサブクエリは主にWHERE句FROM句SELECT句の中に記述されます。

押さえておきたいポイント

  1. サブクエリは「内部クエリ(INNER QUERY)」または「内部SELECT(INNER SELECT)」とも呼ばれます。
  2. 一方、サブクエリを含むメインのクエリは「外部クエリ(OUTER QUERY)」または「外部SELECT(OUTER SELECT)」と呼ばれます。

WHERE句でのサブクエリ

最も一般的なのは、WHERE句内にサブクエリを配置するパターンです。このようなサブクエリは「ネストされたクエリ」や「副問い合わせ」と呼ばれることもあります。

SELECT s.sanpham_id, s.sanpham_ten
FROM sanpham s
WHERE s.sanpham_id IN
  (SELECT htk.sanpham_id
   FROM hangtonkho htk
   WHERE htk.soluong > 10);

上記のSELECT文の中にあるサブクエリ部分は以下の通りです。

(SELECT htk.sanpham_id
 FROM hangtonkho htk
 WHERE htk.soluong > 10);

このサブクエリは、hangtonkho(在庫)テーブルから数量(soluong)が10より大きいレコードのsanpham_id(製品ID)を抽出します。そして、その結果をもとにIN条件を使ってメインクエリの結果を絞り込みます。

なお、同じ結果はINNER JOINを使っても次のように記述できます。

SELECT s.sanpham_id, s.sanpham_ten
FROM sanpham s
INNER JOIN hangtonkho htk
ON s.sanpham_id = htk.sanpham_id
WHERE htk.soluong > 10;

多くの場合、INNER JOINの方が元のサブクエリよりも効率的に処理されます。ただし、すべてのサブクエリがJOINに書き換えられるわけではない点には注意が必要です。

FROM句でのサブクエリ

サブクエリはFROM句内にも記述できます。この場合、サブクエリは一時的なテーブル(派生テーブル)のように扱われます。

SELECT nhacung.nhacung_ten, truyvancon1.tong_sl
FROM nhacung,
  (SELECT nhacung_id, SUM(donhang.soluong) AS tong_sl
   FROM donhang
   GROUP BY nhacung_id) truyvancon1
WHERE truyvancon1.nhacung_id = nhacung.nhacung_id;

この例では、FROM句内に次のようなサブクエリが作成されています。

(SELECT nhacung_id, SUM(donhang.soluong) AS tong_sl
 FROM donhang
 GROUP BY nhacung_id) truyvancon1

このサブクエリには「truyvancon1」という別名(エイリアス)が付けられています。以降はこの名前を使って、サブクエリ自体やその各フィールドを参照することになります。

SELECT句でのサブクエリ

SELECT句内にサブクエリを配置するケースでは、SUM、COUNT、MIN、MAXなどの集計関数を使った計算を行いたいものの、それをメインクエリ本体に含めたくない場合によく用いられます。

SELECT n1.ho, n1.ten,
  (SELECT MAX(luong)
   FROM nhanvien n2
   WHERE n1.nhanvien_id = n2.nhanvien_id) truyvancon2
FROM nhanvien n1;

上記の例で作成されているサブクエリは以下の部分です。

(SELECT MAX(luong)
 FROM nhanvien n2
 WHERE n1.nhanvien_id = n2.nhanvien_id) truyvancon2

ここでもサブクエリには「truyvancon2」という別名が付けられており、この名前を通じてサブクエリやその情報フィールドを参照できます。

SELECT句内にサブクエリを置くテクニックが使われる理由は、サブクエリが単一の値を返す必要があるためです。だからこそ、SUM、COUNT、MIN、MAXといった集計関数がサブクエリ内で頻繁に利用されるのです。

  1. MS SQL Serverでデータベースを選択する2つの基本方法

    MS SQL Serverで操作対象となるデータベースを選択するには、主に以下の2つの方法があります。GUI操作とコマンド操作それぞれの特徴を理解し、状況に応じて使い分けることで、作業効率を高めることができます。 方法1:SQL Server Management Studio(SSMS)を使用する 視覚的に操作したい方には、SQL Server Management Studio(SSMS)を使った方法がおすすめです。 例として、msdbという名前のデータベース上でバックアップ履歴を参照するクエリを実行したい場合、ツールバーのドロップダウンリストからmsdbを選択します。 データベースのバッ

  2. SQL Serverクエリストアとは?設定方法から実行プランの強制まで徹底解説

    Microsoft® SQL Server® のクエリストア(Query Store)は、その名のとおり、データベース上で実行されたクエリの履歴、ランタイム実行統計、実行プランを「保管庫」のように記録してくれる機能です。収集されたデータはディスク上に保存されるため、トラブルシューティングが必要になったときにいつでも参照でき、SQL Server を再起動してもデータは失われません。SQL Server 2016 で導入され、それ以降のすべてのエディションで利用可能なクエリストアを活用すれば、クエリプランの変更に起因するパフォーマンス問題の切り分けが格段に容易になります。 はじめに パフォーマン