はじめに
以下はスッキリわかるSQL入門第7章から第8章までの学習備忘録です。
引用されている個所は書籍の内容をそのまま書き、引用されていない箇所は私が調べて補足した内容を書いてあります。SQLのタグが付いているコードブロックに関しては、書籍の引用と私が調べて補足したものを織り交ぜた内容になっています。
また私が曖昧な理解や、知識として定着していない個所を記述していますので、基本的な文法や構文に関しては記述されていない可能性があることをご了承ください。
RDMSについてはMySQLを想定しています。
第7章 副問い合わせ
7.1 検索結果に基づいて表を操作する
副問い合わせ(サブクエリ)
他のSQL文の1部分として登場するSELECT文。丸かっこでくくって記述する。
副問い合わせの3つのパターン
- 単一の値(スカラー)の代わりとして、副問い合わせの結果を用いる。
- 複数の値(ベクター)の代わりとして、副問い合わせの結果を用いる。
- 表の値(マトリックス)の代わりとして、副問い合わせの結果を用いる。
データ構造の種類
ITの世界の中で、1つ以上のデータで形成されたものをデータ構造(data structure)と呼ぶ。
- スカラー・・・単一の値
- ベクター・・・1次元に並んだ値/配列
- マトリックス・・・2次元に並んだ値/表
副問い合わせの3つのパターンは、検索結果がそれぞれスカラー、ベクター、マトリックスになると考えると理解しやすい
7.2 単一の値(スカラー)の代わりに副問い合わせを用いる
単一行副問い合わせとは
- 検索結果が1行1列の1つの値となる副問い合わせのことを指す。
- SELECT文の選択列リストやFROM句、UPDATEのSET句、また1つの値との判定を行うWHERE句の条件式などに記述できる。
7.3 複数の値(ベクター)の代わりに副問い合わせを用いる
複数行副問い合わせとは
- 検索結果がN行1列の複数の値となる副問い合わせ(ただしnは1以上)
- 複数の値との判定を行うWHERE句の条件式(IN、ANY、ALL演算子を用いた条件式)や、SELECT文のFROM句に記述可能。
複数行と比較したい時には
複数行副問い合わせは複数の値に化けるので、単なる等号や不等号では比較できない(エラーが発生する)。等号や不等号にANYやALL演算子を組み合わせることで、複数の値と比較が可能となる。
同じ意味となる演算子
- NOT IN と <>ALLはすべての値と一致しないことを判定する演算子
- IN と =ANY はいずれかの値を一致することを判定する演算子
副問い合わせがNULlを含んでいた場合
NOT IN と <>ALLで判定する副問い合わせの結果に NULLが含まれると、全体の結果も NULLとなる
副問い合わせの結果から確実にNULLを除外する方法
1. 副問い合わせの絞り込み条件に、IS NOT NULL 条件を含める。
2. COALESCE 関数を使って NULL を別の値に置き換える。
7.4 表(マトリックス)の代わりに副問い合わせを用いる
表形式の結果となる副問い合わせとは
- 検索結果が n行m列 の表となる副問い合わせ(ただしn、mは1以上)
- SELECT文のFROM句やINSERT文などに記述可能。
第8章 複数テーブルの結合
8.1 リレーショナルの意味
リレーションシップ
ある2つのテーブルの行に情報としての関連があること。
外部キー
他のテーブルの関連行を指すための値を格納することでリレーションシップを結ぶ役割を担っている列のこと。
複数のテーブルに分けるメリット
データを複数のテーブルに分けて格納した方が、安全、確実にデータを管理しやすい。
そして、開発者が普段利用する多くのデータベース製品は、複数のテーブルに分けて格納されたデータを関連付けて管理、利用するための様々な機能を有している。
このようなデータベースを特に、リレーショナルデータベース(RDB: Relational Database)と呼ぶ。
8.2 テーブルの結合
1. 内部結合
/* 選択列リストには両テーブルの列を指定 */
SELECT 選択列リスト
FROM テーブルA
JOIN テーブルB
ON 両テーブルの結合条件
- 結合に関係する2つのテーブルは対等な関係ではない
あくまでもFROM句で指定したテーブル(以後、左表)が主役であり、それにJOIN句で指定したテーブル(以後、右表)の内容を必要に応じて結合していく。
結合とは、テーブルを丸ごと繋ぐことではなく、結合条件が満たされた行を1つ1つ繋いでいくこと。
- 右表の結合条件列の重複
繋ぐべき右表の行が複数ある時、DBMSは左表の行を複製して結合する。
結果表の行数は、元の左表の行数より増える。
- 結合相手のない結合
右表に結合相手の行がない場合や、左表の結合条件の列がNULLの場合、結果表から消滅する。
2. 左外部結合
/* 選択列リストには両テーブルの列を指定 */
SELECT 選択列リスト
FROM 左表
LEFT (OUTER) JOIN 右表
ON 両テーブルの結合条件
/* ※結合相手の行がない場合や、左表の結合条件列がNULLの場合、
選択列リストに抽出される右表の列はすべてNULLとなる。*/
※右外部結合と完全外部結合は使う事例はほとんどないと言われているので割愛します。
8.4 結合に関するさまざまな構文
結合構文のバリエーション
- 3テーブル以上の結合も、順に1つずつ処理される。
- 副問い合わせの結果表と結合することも可能。
- 自分自身のテーブルと結合することが可能。