OUTER JOIN の理由
ところで、私たちがスプレッドシートを統合したとき、クリーナーがまだいなかったため、オフィスの清掃タスクが消えてしまったときのことを覚えていますか?
次のようなクエリを実行すると:
SELECT * FROM task
すると、次の結果が得られます。
ID | 従業員ID | 名前 | 締め切り |
---|---|---|---|
1 | 1 | フロントエンドのバグを修正 | 2022-06-01 |
2 | 2 | バックエンドのバグを修正 | 2022-06-15 |
3 | 5 | コーヒーを買う | 2022-07-01 |
4 | 5 | コーヒーを買う | 2022-08-01 |
5 | 5 | コーヒーを買います | 2022-09-01 |
6 | (ヌル) | オフィスを掃除する | (ヌル) |
7 | 4 | 人生を楽しむ | (ヌル) |
8 | 6 | 人生を楽しむ | (ヌル) |
タスクテーブルと従業員テーブルをemployee_idで結合しようとすると、「Clear Office」タスクが消えてしまいます。
この問題を解決するために、このような孤立した行をペアなしで別のテーブルに保存できるようにするさまざまな修飾子が JOIN 演算子に追加されました。
JOIN 演算子の古典的な形式を思い出してください。
table 1 JOIN table 2 ON
condition
SQL Server に、左側のテーブル (table1) のすべてのデータが結合テーブルに存在することを確認するように指示できます。たとえ右の表にそれらのペアがない場合でも。これを行うには、次のように記述するだけです。
table 1 LEFT JOIN table 2 ON condition
結合テーブルに右側のテーブルのすべての行を含める場合は、次のように記述する必要があります。
table 1 RIGHT JOIN table 2 ON
condition
実行者のないタスクが失われないように、すべてのタスクと従業員を結合するクエリを作成してみましょう。これを行うには、次のクエリを作成します。
SELECT * FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id
そして、このクエリの結果は次のようになります。
ID | 名前 | 職業 | 給料 | 年 | 参加日 | ID | 従業員ID | 名前 |
---|---|---|---|---|---|---|---|---|
1 | イワノフ・イワン | プログラマー | 100000 | 25 | 2012-06-30 | 1 | 1 | フロントエンドのバグを修正 |
2 | ペトロフ・ペトル | プログラマー | 80000 | 23 | 2013-08-12 | 2 | 2 | バックエンドのバグを修正 |
4 | ラビノビッチ・モイシャ | 監督 | 200000 | 35 | 2015-05-12 | 7 | 4 | 人生を楽しむ |
5 | キリエンコ・アナスタシア | 事務長 | 40000 | 25 | 2015-10-10 | 3 | 5 | コーヒーを買う |
5 | キリエンコ・アナスタシア | 事務長 | 40000 | 25 | 2015-10-10 | 4 | 5 | コーヒーを買う |
5 | キリエンコ・アナスタシア | 事務長 | 40000 | 25 | 2015-10-10 | 5 | 5 | コーヒーを買う |
6 | バスカ | 猫 | 1000 | 3 | 2018-11-11 | 8 | 6 | 人生を楽しむ |
(ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | 6 | (ヌル) | オフィスを掃除する |
別の行がテーブルに追加されました。興味深いことに、そこには多くの NULL 値があります。従業員テーブルから「Clean office」タスクの実行者が存在しないため、従業員テーブルから取得されたすべてのデータは NULL として表示されます。
結合タイプ
JOINには全部で4種類あります。それらを以下の表に示します。
簡単なエントリー | ロングエントリー | 説明 | |
---|---|---|---|
1 | 加入 | 内部結合 | テーブル A と B にあるレコードのみ |
2 | 左結合 | 左外部結合 | テーブル A のペアのないすべての行は、 |
3 | 右結合 | 右外部結合 | テーブル B のペアのないすべての行は、 |
4 | 外部結合 | 完全外部結合 | テーブル A および B の塩基対のすべての行は、 |
簡単にするために、テーブルをセットとして表すと、JOIN は図として表示できます。
![](https://cdn.codegym.cc/images/article/66aba568-a02a-45e0-9939-6beebbb190ed/512.jpeg)
集合交差とは、あるテーブルに対して、そのテーブルが参照する別のテーブルの対応するレコードが存在することを意味します。
インタビューでの質問
初心者プログラマーは、面接で非常に単純な質問にさらされることがあります。テーブルを考慮すると、次のように定式化できます。
「タスクが存在しないすべての従業員のリスト を表示するクエリを作成します。」まず、この質問を少し言い換えてみましょう。「タスク テーブルにタスクがないすべての従業員のリストを従業員テーブルから表示するクエリを作成します。」このセットを取得する必要があります。![](https://cdn.codegym.cc/images/article/d3cc4f4a-b340-4b3a-9ae0-3e38eca36bb2/512.jpeg)
この問題を解決するには多くの方法がありますが、最も簡単な方法から始めます。まず、LEFT JOIN を使用してテーブルを結合し、次に WHERE を使用して、欠落データが NULL で埋め込まれているすべての行を除外します。
SELECT * FROM employee e LEFT JOIN task t ON e.id = t.emploee_id
WHERE t.id IS NULL
そして、このクエリの結果は次のようになります。
ID | 名前 | 職業 | 給料 | 年 | 参加日 | ID | 従業員ID | 名前 |
---|---|---|---|---|---|---|---|---|
3 | イワノフ・セルゲイ | テスター | 40000 | 30 | 2014-01-01 | (ヌル) | (ヌル) | (ヌル) |
このソリューションの唯一の欠点は、テーブル内の行に NULL が含まれており、条件によって従業員のリストを表示する必要があることです。
これを行うには、従業員テーブルの必要な列を SELECT でリストするか、すべての列を表示する必要がある場合は、次の構造を作成する必要があります。
SELECT e.* FROM employee e, task t
完全なリクエストは次のようになります。
SELECT e.*
FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id
WHERE t.id IS NULL
このクエリの結果:
ID | 名前 | 職業 | 給料 | 年 | 参加日 |
---|---|---|---|---|---|
3 | イワノフ・セルゲイ | テスター | 40000 | 30 | 2014-01-01 |
残りの方法は宿題として残してください。自分で見つける楽しみを奪うつもりはありません。
GO TO FULL VERSION