複数のテーブルのすべてのレコードを表示(外部結合)
外部結合とは、テーブルを結合する際に、2つのテーブルの、左右どちらか一方にある値はすべての行が表示されます。
外部結合はどちらのテーブルの値をすべて表示するか指定する必要があります。
【ポイント】
結合する対象のない行では、列の値としてNULL値が表示されます。
左外部結合(LEFT OUTER JOIN)
【書式】LEFT OUTER JOIN
SELECT 列名
FROM テーブル1 LEFT OUTER JOIN テーブル2
ON テーブル1.列名 = テーブル2.列名
「一致したレコード」および「テーブル1(左側に指定したテーブル)の全データ」を表示します。
右外部結合(RIGHT OUTER JOIN)
【書式】RIGHT OUTER JOIN
SELECT 列名
FROM テーブル1 RIGHT OUTER JOIN テーブル2
ON テーブル1. 列名 = テーブル2. 列名
「一致したレコード」および「テーブル2(右側に指定したテーブル)の全データ」を表示します。
副問い合わせ(サブクエリ)
これまでSELECT文でWHERE句に条件を指定して、必要なレコードを抽出してきました。
このSELECT文による抽出を、問い合わせと呼ぶことがあります。
副問い合わせ(サブクエリとも言います)は、問い合わせによって取り出されたデータを使って、さらに問い合わせをする、という2段階の処理を行います。
下の図を見てください。
1段階目で「1stの平均が73.5以上のレコードを抽出」し、2段階目で「1段階目で取り出された部員番号から氏名を検索し、氏名と1stを表示する」といった処理をしています。
この1段階目の処理を、サブクエリと言います。
なぜ1段階目が「サブ」なのかと言うと、最終的な結果を出すのは2段階目の処理で、1段階目は2段階目を出すための準備作業なのです。
したがって、1段階目を「サブクエリ」(副問い合わせ)と呼ぶわけです。
具体的なSQLでは、SQL文の内側にさらに別のSQL文を記述します。
副問い合わせは、主にWHERE句の抽出条件を別のSQLの実行結果によって決めたい時に使われます。(他にもDBMSによっては、FROM句に指定することでSELECT文の実行結果をテーブルと見立ててSQLを実行する方法などがあります。)
副問い合わせは、内側のSQLがどのように結果を返すかによって以下の2種類に分けられます。
- 単一行副問い合わせ
- 複数行副問い合わせ
単一行副問い合わせ
副問い合わせとなるSELECT文の実行結果が1行の場合を、単一行副問い合わせと呼びます。
集計の結果など、集約関数の結果を元にしたSQL文を作る場合などに使われます。
単一行副問い合わせでは以下のいずれかの比較演算子を使用します。
比較演算子
比較演算子 | 意味 |
---|---|
= | 等しい |
> | 大きい |
>= | 以上 |
< | 小さい |
<= | 以下 |
<> または != | 等しくない |
【書式】単一行副問い合わせ
SELECT 列名1 , 列名2 ・・・ FROM テーブル名
WHERE 列名 比較演算子 ( SELECT 列名 FROM テーブル名 WHERE 条件 );
内側の括弧の中のSELECT文を実行した結果が、外側のSELECT文の条件の比較対象となります。
単一行副問い合わせを使った比較では、副問い合わせの結果が1行である必要があります。
結果が0行または2行以上の場合にはエラーになります。
複数行問い合わせ
副問い合わせとなるSELECT文の実行結果が複数行に渡る場合を、複数行副問い合わせと呼びます。
副問い合わせの抽出結果が複数になる場合は、比較演算子にINを使用します。
複数行副問い合わせでは以下のいずれかの比較演算子を使用します。
主な比較演算子
比較演算子 | 意味 |
---|---|
IN | 問い合わせ結果となる値のいずれかと一致する |
NOT IN | 問い合わせ結果となる値のいずれとも一致しない |
書式は、単一行副問い合わせの書式とほぼ同じですが、比較演算子は複数の結果を導き出せるIN、NOT INを使います。
それでは次の図を見てみましょう。
第1段階で、部員番号がM001かM002かM003の学生を抽出し、第2段階ですべてのフィールドを表示しています。
この複数行副問い合わせは、第1段階の結果が複数行あります。
単一行副問合せのとの違いはこの部分です。
【書式】複数行副問い合わせ
SELECT 列名1 , 列名2 ・・・ FROM テーブル名
WHERE 列名 IN または NOT IN ( SELECT 列名 FROM テーブル名 WHERE 条件 );
複数行副問合せでは、副問合せの結果が0行以上であれば構いません。(単一行副問合せとは異なり、結果が0行であってもエラーになりません)
副問合せの応用
副問い合わせの結果を使って、テーブルを作成したり、レコードの挿入や編集を行ったりすることもできます。
ここではいくつか代表的な使い方を確認しておきます。
次のSQLは副問合せを利用することができます。
- CREATE TABLE
- INSERT
- UPDATE
CREATE TABLE文に副問合せを利用する
CREATE TABLE文に副問い合わせを使うには、AS句を用いて以下のような記述形式を取ります。
【書式】CREATE TABLEでの副問い合わせの利用
SELECT 列名1 , 列名2 ・・・
AS 副問合せによる SELECT 文;
CREATE TABLE文では、SELECT文の結果の、それぞれの列のデータ型に合わせて、テーブルの列のデータ型が決定されます。
NOT NULL制約やDEFAULT値などはSELECT文の元となったテーブルから引き継がれますが、主キーや一意キーなどは引き継がれないので注意が必要です。
INSERT 文に副問合せを利用する
INSERT文に副問い合わせを使うには、VALUES句の代わりにSELECT文を用いて以下のような記述形式を取ります。
【書式】INSERT文での副問い合わせの利用
INSERT INTO テーブル名 ( 列名1 , 列名2 , 列名n 〜 );
INSERT文では指定された列のデータ型と、SELECT文の結果のデータ型が一致している必要があります。
UPDATE文に副問合せを利用する
UPDATE文に副問い合わせを使うには、SET句の設定をする値に副問い合わせの結果を用いて以下のような記述形式を取ります。
【書式】UPDATE 文での副問い合わせの利用
UPDATE テーブル名
SET 列名 = (《 SELECT 文》) WHERE《行の抽出条件》;
MySQLではこの機能は使用できません。
UPDATE文では列にデータ値を設定するため、単一行副問い合わせである必要があります。
(SELECT文の結果が複数行であると、列にデータを設定できずにエラーとなります。)
参考図書
LINE公式アカウント
仕事が辛くてたまらない人生が、仕事が楽しくてたまらない人生に変わります。
【登録いただいた人全員に、無料キャリア相談プレゼント中!】