SQLその9 サブクエリとwith句をつかって効率化する

SQLその9 サブクエリとwith句をつかって効率化する

サブクエリは日本語では副問合せとも呼ばれ、selectで始まるSQLに入れ子で利用することや、入れ子になると、親子関係がうまれる子のSQL文を指すようだ。

場所↓/戻り値のデータ構造スカラー型ベクター型マトリックス型
SELECT使える
WHERE使える使える
FROM使える使える

サブクエリで何ができるの?(スカラーの求め方)

  • 全体と個別の比較ができる。荷重直帰率のような全データを分母にするのができるのかな
  • JOINを利用しなくても他のテーブルを参照できる
  • 一度集計したデータを利用できる。例えば日別の売上を合算した上で、それぞれの平均を出すこともできる

SELECT 列1,
–サブクエリで呼び出したい列ね
(SELECT列2 FROM テーブル名) AS 名前2
FROM テーブル名 AS 名前3
GROUP BY 集計したい列

サブクエリが先に集計されてから親クエリが集計されることになる。

サブクエリでは
スカラー:1つの値だけではなく、
ベクター:リストのように1列n行の値
マトリクス:表のようにn列×m行の値
も指定できる。驚き。

サブクエリはSELECTの他、WHERE句やFROMでつかえる。

サブクエリのベクター型データの利用

やる前はどうつかうか意味わかんねw・・・・

ベクター型をWHEREで使う場合

WHERE で使う場合、サブクエリで取得したデータが含まれてるかどうか、WHERE句で絞り込むという使い方。このときにはINを使う。

SELECT
 列
FROM テーブルA
WHERE 絞り込みたい列 IN (SELECT 絞り込みたい列 FROM テーブルB WHERE 絞り込み条件の列 = 絞り込み条件)
;

INはSQLその1で学んだ、WHEREでの絞り込み方法の1つね。忘れてたw

WHERE

BETWEEN data AND data NOT BETWEEN data AND data

IN (data,data,data) NOT IN (data,data,data)”

ベクター型データをFROMで使う場合

同じようにFROM句に(SELECT 値を出したい列 FROM テーブル ORDER BY 並べたい列)となり、その結果をFROM句で使うテーブルにつかうのだが、そのテーブル名を決めるときに
(SELECT 値を出したい列 AS テーブル名 FROM テーブル ORDER BY 並べたい列)
となる。僕は列の途中にASでテーブル名つけるのが以外だった。

だから

SELECT
 列A
FROM (SELECT 出したい列B AS テーブル名 FROM テーブルC ORDER BY 並べたい列D)
;
なんて形になる

サブクエリのマトリクス型データの利用

m×n列のデータを取り出してサブクエリでテーブルを作りそのテーブルをFROM句で利用するやり方。

SELECT
 列A
FROM (SELECT 出したい列A,出したい列B AS テーブル名 FROM テーブルC ORDER BY 並べたい列D)
なんて形になる。

この場合のサブクエリは表だから当然別な表とJOINだってできる。

WITH句によるサブクエリの表現の効率化

こういうサブクエリは便利なのだが、その結果、主にマトリクス型サブクエリで表現した表を何度も何度も何度も使いたくなることがある。

それってまあ効率が悪いよね、ということで頭の方にWITH句で定義しておくと、その句でつけた名前で呼び出せる。便利よね。
ASをつけて名前つけてくのだが、今までみたいに
SQL文 AS 名前
ではなく
名前 AS サブクエリ
となる。

WITH
テーブルの名前A AS (サブクエリ),
テーブルの名前B AS (サブクエリ)

となるわけだ。