📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
細 文字列「__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… |
|||
| 28行目: | 28行目: | ||
== SELECT句にある副問合せ == | == SELECT句にある副問合せ == | ||
副問合せで記述すべきクエリとは、以下に示すようなものである。<br> | |||
* インデックスを活用できるシンプルなサブクエリ | |||
* 明確な目的を持った相関サブクエリ | |||
* 集計関数を使用した効率的な計算 | |||
<br> | |||
<code>SELECT</code>句にある副問い合わせの例を示す。<br> | <code>SELECT</code>句にある副問い合わせの例を示す。<br> | ||
<syntaxhighlight lang="sql"> | <syntaxhighlight lang="sql"> | ||
SELECT Name, Date, Sales, | SELECT Name, Date, Sales, | ||
Sales > (SELECT AVG(Sales) FROM T_Sample ) as AboveAverage -- 売上の平均を求める副問い合わせ | |||
-- AboveAverageカラムには、売上の平均を超えている場合は1、それ以外の場合は0が代入される | |||
FROM T_Sample; | FROM T_Sample; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
# 結果 | |||
Name Date Sales AboveAverage | Name Date Sales AboveAverage | ||
A 20210101 200 1 | A 20210101 200 1 | ||
A 20210102 150 0 | A 20210102 150 0 | ||
B 20210103 100 0 | B 20210103 100 0 | ||
<br> | |||
==== スカラーサブクエリ (単一の値を返す) ==== | |||
<syntaxhighlight lang="sql"> | |||
-- 最小売上との差分を計算 | |||
SELECT Name, Sales, | |||
Sales - (SELECT MIN(Sales) FROM T_Sample) as DiffFromMin | |||
FROM T_Sample; | |||
</syntaxhighlight> | |||
<br> | |||
==== 相関サブクエリ (外部クエリの値を参照) ==== | |||
<syntaxhighlight lang="sql"> | |||
-- 各レコードより前の日付の平均売上を計算 | |||
SELECT Name, Date, Sales, | |||
(SELECT AVG(Sales) | |||
FROM T_Sample t2 | |||
WHERE t2.Date < t1.Date) as PriorAvgSales | |||
FROM T_Sample t1; | |||
</syntaxhighlight> | |||
<br> | |||
==== IN句 / EXISTS句 / ANY句 / ALL句 ==== | |||
<syntaxhighlight lang="sql"> | |||
-- 平均以上の売上のレコードを取得 | |||
SELECT * FROM T_Sample | |||
WHERE Sales > ANY ( | |||
SELECT Sales FROM T_Sample | |||
WHERE Sales > 150 | |||
); | |||
</syntaxhighlight> | |||
<br> | |||
<syntaxhighlight lang="sql"> | |||
-- 売上が存在するレコードを取得 | |||
SELECT * FROM T_Sample t1 | |||
WHERE EXISTS ( | |||
SELECT 1 FROM T_Sample t2 | |||
WHERE t2.Sales = t1.Sales | |||
); | |||
</syntaxhighlight> | |||
<br> | |||
==== FROM句のサブクエリ ==== | |||
<syntaxhighlight lang="sql"> | |||
-- 日付ごとの累計売上を計算 | |||
SELECT t1.Date, t1.Sales, | |||
(SELECT SUM(t2.Sales) | |||
FROM T_Sample t2 | |||
WHERE t2.Date <= t1.Date) as CumulativeSales | |||
FROM T_Sample t1; | |||
</syntaxhighlight> | |||
<br> | |||
==== アンチパターン ==== | |||
* 過度に複雑なネストされたサブクエリ | |||
<syntaxhighlight lang="sql"> | |||
-- 避けるべき例 | |||
SELECT * FROM T_Sample | |||
WHERE Sales > ( | |||
SELECT AVG(Sales) FROM ( | |||
SELECT Sales FROM T_Sample | |||
WHERE Sales > ( | |||
SELECT MIN(Sales) FROM T_Sample | |||
) | |||
) | |||
); | |||
</syntaxhighlight> | |||
<br> | |||
* JOINで代替可能な非効率なサブクエリ | |||
<syntaxhighlight lang="sql"> | |||
-- 非効率な例 | |||
SELECT * FROM T_Sample t1 | |||
WHERE EXISTS ( | |||
SELECT 1 FROM T_Sample t2 | |||
WHERE t2.Name = t1.Name | |||
); | |||
-- 推奨される記述方法 | |||
SELECT DISTINCT t1.* | |||
FROM T_Sample t1 | |||
JOIN T_Sample t2 ON t1.Name = t2.Name; | |||
</syntaxhighlight> | |||
<br> | |||
* 不必要なサブクエリの使用 | |||
<syntaxhighlight lang="sql"> | |||
-- 非効率な例 | |||
SELECT Name, | |||
(SELECT MAX(Sales) FROM T_Sample) as MaxSales | |||
FROM T_Sample; | |||
-- 推奨される記述方法 | |||
SELECT Name, MAX(Sales) OVER() as MaxSales | |||
FROM T_Sample; | |||
</syntaxhighlight> | |||
<br> | |||
<u>※注意</u><br> | |||
<u>パフォーマンスの観点から、以下に示すことに注意が必要である。</u><br> | |||
* サブクエリは適切なインデックスが存在するか確認する。 | |||
* 可能な限りJOINやウィンドウ関数で代替することを検討する。 | |||
* 実行計画を確認し、パフォーマンスへの影響を評価する。 | |||
<br><br> | <br><br> | ||