「データベースの正答率を上げたい!」
「表の結合とか、副問合わせとかよくわかんない・・・」
本記事は、そんな方へ向けた記事となります!
前回の記事を読んでいない方は、ぜひこちらからお読みください。
データ操作言語の基礎知識⑥ 表の結合
前回の「集合関数」の見出しで説明した「和」では、表を縦につなげるイメージだと書きましたが、今回紹介する「表の結合」は、表を横につなげるイメージです。
種類ごとに細かな違いがありますので、説明していきます。
INNER JOIN
内結合とも呼ばれます。特徴としては、両方の表に存在する行だけを抜き出すことです。詳しくは後述しますが、外結合(OUTER JOIN)は片方の表だけに存在する行も含めて結合するので、そこが大きく違う点になります。
また、外結合と比べ、内結合のほうが圧倒的に出題されていますので、よく覚えておきましょう。
結合はFROM句の中で行われます。
| 学生番号 | クラス名 | 名前 |
| 101 | 1-1 | 田中 太郎 |
| 102 | 1-2 | 佐藤 花子 |
| 103 | 1-3 | 鈴木 一郎 |
| 104 | 1-4 | 高橋 優子 |
| 学生番号 | 所属部活 |
| 101 | 卓球部 |
| 102 | 陸上部 |
| 103 | 水泳部 |
SELECT 学生番号, クラス名, 名前, 所属部活 FROM 表1 INNER JOIN 表2 ON 表1.学生番号 = 表2.学生番号
↓
| 学生番号 | クラス名 | 名前 | 所属部活 |
| 101 | 1-1 | 田中 太郎 | 卓球部 |
| 102 | 1-2 | 佐藤 花子 | 陸上部 |
| 103 | 1-3 | 鈴木 一郎 | 水泳部 |
このような感じになります。「JOIN」の結合条件は、「WHERE」ではなく「ON」でつなぎます。もしも結合で作成した表から、さらに特定の行を抜き出す場合は、「ON」の下に「WHERE」が来るという感じです。
また、2つ以上の表を結合することもあります。その場合は、表1と表2を結合する→結合した表と表3を結合するという流れになりますので、結合条件(ONの中で書く条件)の数は増えていきます。3つの表を結合するなら最低2つ、4つの表を結合するなら最低3つの条件が必要になってきますので、ご注意ください。
LEFT OUTER JOIN
左外結合とも呼ばれます。特徴としては、「LEFT OUTER JOIN」の左側に書かれた表を基準にして、右側の表に存在しない情報に関しては空値(NULL)で埋める点です。
| 学生番号 | クラス名 | 名前 | 部活番号 |
| 101 | 1-1 | 田中 太郎 | 1 |
| 102 | 1-2 | 佐藤 花子 | 2 |
| 103 | 1-3 | 鈴木 一郎 | 3 |
| 104 | 1-4 | 高橋 優子 |
| 部活番号 | 所属部活 |
| 1 | 卓球部 |
| 2 | 陸上部 |
| 3 | 水泳部 |
| 4 | 美術部 |
SELECT 学生番号, クラス名, 名前, 所属部活 FROM 表1 LEFT OUTER JOIN 表2 ON 表1.部活番号 = 表2.部活番号
↓
| 学生番号 | クラス名 | 名前 | 所属部活 |
| 101 | 1-1 | 田中 太郎 | 卓球部 |
| 102 | 1-2 | 佐藤 花子 | 陸上部 |
| 103 | 1-3 | 鈴木 一郎 | 水泳部 |
| 104 | 1-4 | 高橋 優子 | NULL |
おおまかな使い方は「INNER JOIN」と変わりませんが、作成された表は変わります。表2に存在しない高橋さんの部活は「NULL」となっています。
RIGHT OUTER JOIN
右外結合とも呼ばれています。「RIGHT OUTER JOIN」の右側に書かれた表を基準にして、左側の表に存在しない情報に関しては空値(NULL)で埋める点です。
| 学生番号 | クラス名 | 名前 | 部活番号 |
| 101 | 1-1 | 田中 太郎 | 1 |
| 102 | 1-2 | 佐藤 花子 | 2 |
| 103 | 1-3 | 鈴木 一郎 | 3 |
| 104 | 1-4 | 高橋 優子 |
| 部活番号 | 所属部活 |
| 1 | 卓球部 |
| 2 | 陸上部 |
| 3 | 水泳部 |
| 4 | 美術部 |
SELECT 学生番号, クラス名, 名前, 所属部活 FROM 表1 LEFT OUTER JOIN 表2 ON 表1.部活番号 = 表2.部活番号
↓
| 学生番号 | クラス名 | 名前 | 所属部活 |
| 101 | 1-1 | 田中 太郎 | 卓球部 |
| 102 | 1-2 | 佐藤 花子 | 陸上部 |
| 103 | 1-3 | 鈴木 一郎 | 水泳部 |
| NULL | NULL | NULL | 美術部 |
「LEFT OUTER JOIN」との違いは、左の表を基準にするか、右の表を基準にするかという点のみになります。今回は右の表(表2)を基準にしているので、所属している人がいない美術部の学生番号、クラス名、名前は空値(NULL)になっています。
FULL OUTER JOIN
完全外結合とも呼ばれます。イメージとしては「LEFT OUTER JOIN」と「RIGHT OUTER JOIN」を合わせたような表が作成されます。
| 学生番号 | クラス名 | 名前 | 部活番号 |
| 101 | 1-1 | 田中 太郎 | 1 |
| 102 | 1-2 | 佐藤 花子 | 2 |
| 103 | 1-3 | 鈴木 一郎 | 3 |
| 104 | 1-4 | 高橋 優子 |
| 部活番号 | 所属部活 |
| 1 | 卓球部 |
| 2 | 陸上部 |
| 3 | 水泳部 |
| 4 | 美術部 |
SELECT 学生番号, クラス名, 名前, 所属部活 FROM 表1 FULL OUTER JOIN 表2 ON 表1.部活番号 = 表2.部活番号
↓
| 学生番号 | クラス名 | 名前 | 所属部活 |
| 101 | 1-1 | 田中 太郎 | 卓球部 |
| 102 | 1-2 | 佐藤 花子 | 陸上部 |
| 103 | 1-3 | 鈴木 一郎 | 水泳部 |
| 104 | 1-4 | 高橋 優子 | NULL |
| NULL | NULL | NULL | 美術部 |
見てわかるとおり、片方の表にしか存在しないデータもすべて結合されます。
データ操作言語の基礎知識⑦ 副問合わせ
( )で囲んだSELECT文を、副問合わせと呼びます。
副問合わせでしか使わない演算子や、今まで学習したものとの合わせ技もありますので、ぜひ一緒に習得しましょう!
使用例1
まずは、FROM句に副問合わせを使用するパターンを紹介します。
SELECT 学生氏名 FROM 学生表 WHERE 出席番号 = 1
SELECT 学生氏名 FROM (SELECT * FROM 学生表 WHERE 出席番号 = 1)
上記2つのSQLの結果は等しくなります。下の( )内にSELECTがあるほうが副問合わせです。副問合わせで作成された、出席番号が1の人しか載っていない表を使って、学生氏名を抽出します。
そうすることで、上の表と同じ結果を導き出せるのです。
仕様例2
次に、WHERE句で副問合わせを使うパターンです。
SELECT 学生氏名 FROM 学生表 WHERE 部活動 = '陸上部'
SELECT 学生氏名 FROM 学生表 WHERE 部活動 = (SELECT 部活動 FROM 部活表 WHERE 部活動名 LIKE '%陸上部')
下のSQLが副問合わせです。このように、FROM句で指定した表以外の表から情報を引っ張ってくることができます。
また、このSQLの場合、部活動が「陸上部」1つであった場合は=演算子を使いますが、「女子陸上部」「男子陸上部」など当てはまるものが2つ以上ある場合は「IN」を使います。
EXISTS
「EXISTS」とは、表に対して副問合わせを1行ずつ実行し、合致すれば真、しなければ偽と判断することで、2つの表に共通して存在する行を抜き出すことによく使われる演算子です。
EXISTSのように、表に対して副問合わせを1行ずつ実行するものを、相関副問合わせと呼びます。
SELECT 学生名 FROM 数学名簿 WHERE EXISTS(SELECT 学生名 FROM 科学名簿 WHERE 数学.学生名 = 科学.学生名)
| クラス | 学生名 |
| 1 | 竹村 心 |
| 1 | 佐藤 大樹 |
| 2 | 加藤 隆 |
| クラス | 学生名 |
| 1 | 佐々木 あかり |
| 2 | 加藤 隆 |
| 2 | 宮本 愛子 |
この場合、どちらにも存在している加藤さんの名前が抽出されます。
逆に、数学名簿で加藤さん以外の名前を抽出したい場合は、「NOT EXISTS」とすると、重複している人以外の名前が抽出されます。
イメージがつかみづらい人は、とりあえず「この副問合わせの条件に合った人は存在しますか?」と聞かれていると思えば解きやすいかもしれません。
INとの合わせ技
前回の記事のWHERE句の見出しで紹介した「IN」ですが、( )の中身は数字でなく、副問合わせでも構いません。
SELECT 学生番号, 氏名 FROM 学生表 WHERE 点数 IN (SELECT 点数 FROM 学生表 WHERE 点数 >=80)
上記のようなSQLだったときの動きを考えてみましょう。
まずは副問合わせの部分ですが、学生表の中の、点数が80点以上である列の、点数の部分を抜き出します。つまり、(90,83,87,95・・・)という感じで、実際には表なので縦に並ぶイメージです。
仮に副問合わせで抽出されるのが(95,83)だったとすると、( )の中をその数字に置き換えて考えれば、普通の「IN」と同じように解けるようになります。
SELECTの後に、( )に入ったSELECTが来るという点では「EXISTS」と似ていますが、「IN」の場合はWHERE句の後の要素が1つだけであること、上のWHERE句の要素と下のSELECT句の要素が同じであることが特徴です。
今回は結合と副問合わせについてまとめました!残りの量を考えると、次の記事でひとまずSQLはまとめきれそうです。今回の記事で紹介したものは午後問題でよくでる演算子も多いので、しっかり頭に入れておきましょう!



コメント