「SQL Server - 副問い合わせ(サブクエリ)」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
(文字列「__FORCETOC__」を「{{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This pag…)
190行目: 190行目:
  C        20210103 100
  C        20210103 100
<br><br>
<br><br>
{{#seo:
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux
|image=/resources/assets/MochiuLogo_Single_Blue.png
}}


__FORCETOC__
__FORCETOC__
[[カテゴリ:SQL_Server]]
[[カテゴリ:SQL_Server]]

2024年11月10日 (日) 16:01時点における版

概要

副問い合わせ(サブクエリ)とは、SELECT文の結果を別のSQL文で使用することである。
副問い合わせは、INSERT文、UPDATE文、DELETE文でも使用できる。

以下に、SELECT文の使用時の副問合せが記述できる箇所を示す。

  • SELECT句に記述する副問合せ
  • FROM句に記述する副問合せ
  • WHERE句に記述する副問合せ
  • HAVING句に記述する副問合せ


ここでは、例で使用するテーブルを下表に示す。

T_Sampleテーブル
Name Date Sales
A 20210101 200
B 20210102 150
C 20210103 100



SELECT句にある副問合せ

SELECT句にある副問い合わせの例を示す。

 SELECT Name, Date, Sales,
 Sales > (SELECT AVG(Sales) FROM T_Sample ) as AboveAverage
 FROM T_Sample;


3行目は、SELECT句に売上の平均を求める副問い合わせである。
AboveAverageカラムには、売上の平均を超えている場合は1、それ以外の場合は0が代入される。

結果は、以下の通りである。

Name     Date     Sales     AboveAverage
A        20210101 200       1
A        20210102 150       0
B        20210103 100       0



FROM句にある副問い合わせ

FROM句にある副問い合わせの例を示す。

 SELECT b.Name, b.Sales, b.Date
 FROM (SELECT AVG(Sales) as Sales_Average FROM T_Sample) a, T_Sample b
 WHERE a.Sales_Average < b.Sales;


2行目は、FROM句にSalesカラムの平均を求める副問い合わせである。
副問い合わせの結果をテーブルのように使用している。

結果は、以下の通りである。

Name     Date     Sales
A        20210101 200


また、FROM句にある副問い合わせのSQL文は、WITH句を使用して記述することもできる。



WHERE句にある副問い合わせ

WHERE句にある副問合せの例を示す。

 SELECT * FFROM T_Sample
 WHERE Sales > (SELECT AVG(Sales) FROM T_Sample);


2行目は、WHERE句に売上の平均を求める副問い合わせである。
2行目の副問い合わせのSQL文を実行した後、1行目の主問い合わせのSQL文が実行される。

結果は、以下の通りである。

Name     Data     Sales
A        20210101 200


また、WHERE句にEXISTS句を接続することにより、相関副問い合わせを記述できる。
相関副問い合わせは、主問い合わせのSQL文を実行した後、副問い合わせのSQL文を実行する。



HAVING句にある副問い合わせ

HAVING句にある副問い合わせの例である。

 SELECT Name, MAX(Sales) 
 FROM T_Sample
 GROUP BY Name 
 HAVING MAX(Sales) > (SELECT AVG(Sales) FROM T_Sample);


4行目は、HAVING句に売上の平均を求める副問い合わせである。

結果は、以下の通りである。

Name     MAX(Sales)
A        200


HAVING句については、以下を参照すること。

  • 複数の行をまとめる (集約関数 / GROUP BY / HAVING)



副問い合わせの結果が複数件の場合

ここでは、例で使用するテーブルを下表に示す。

T_Sampleテーブル
Name Date Sales
A 20210101 200
B 20210102 150
C 20210103 100


T_Companyテーブル
Company
A
D


IN句

IN句は、副問い合わせの結果が複数件の場合に使用する。

 SELECT * FROM T_Sample 
 WHERE Sales IN (SELECT Company FROM T_Company);


2行目の副問い合わせは、結果が複数件返るため(AとC)、条件はイコール(=)ではなくIN句を使用する。

結果は、以下の通りである。

Name     Date     Sales
A        20210101 200


= ANY句

= ANY句は、副問い合わせの結果が複数件の場合に使用する。

 SELECT * FROM T_Sample
 WHERE Name = ANY (SELECT Company FROM T_Company);


2行目の副問い合わせは、結果が複数件返るため(AとC)、条件はイコール(=)ではなく= ANY句を使用する。

結果は、以下の通りである。

Name     Date     Sales
A        20210101 200


※注意
MySQLでは、上記のSQL文の= ANY句は、IN句や= SOME句でも同様の結果となる。

NOT IN句

NOT IN句は、副問い合わせの結果が複数件かつ否定を行う場合に使用する。

 SELECT * FROM T_Sample 
 WHERE Name NOT IN (SELECT Company FROM T_Company);


2行目の副問い合わせは、結果が複数件返るため(AとC)、NOT IN句でAとD以外を抽出する。

結果は、以下の通りである。

Name     Date     Sales
B        20210102 150
C        20210103 100


<> ALL句

<> ALL句は、副問い合わせの結果が複数件かつ否定を行う場合に使用する。

 SELECT * FROM T_Sample
 WHERE Name <> ALL (SELECT Company FROM T_Company);


2行目の副問合せは、結果が複数件返るため(AとC)、<> ALL句でAとD以外を抽出する。

結果は、以下の通りである。

Name     Date     Sales
B        20210102 150
C        20210103 100