MySQL - 全結合(Full Join)
こんにちは、データベース愛好家の皆さん!今日は、MySQLのエキサイティングな世界に飛び込み、私たちのSQLツールキットの中の強力なツールを探ってみましょう:それが全結合(Full Join)です。プログラミングが初めてであっても心配しないでください。私はこの概念をステップバイステップでガイドします。これまでに数多くの学生を指導してきました。コーヒー(または、あなたの好み次第でティー)を片手に、この学習冒険を一緒に楽みましょう!
全結合とは?
MySQLでの全結合の詳細に飛び込む前に、簡単な類似を考えてみましょう。パーティを計画しているとします。あなたの親友と兄弟がそれぞれのゲストリストを持っているとします。全結合は、これらのリストを結合する方法で、どちらのリストにも含まれているすべての人々を含める东西です。
データベースの言葉で言うと、全結合は関連する列に基づいて2つ以上のテーブルの行を結合し、すべてのテーブルからのすべての行を含めます。他のテーブル(s)にマッチがない場合でもです。
文法
以下はSQLでの全結合の基本文法です:
SELECT columns
FROM table1
FULL JOIN table2
ON table1.column = table2.column;
今、あなたが言っているのを almost 聞こえます、「でも待って!MySQLにはFULL JOINキーワードがないじゃない!」そして、あなたは完全に正しいです!MySQLは直接FULL JOINをサポートしていませんが、心配しないでください - UNIONを使った賢い回避策があります。詳細に見ていきましょう。
MySQL 全結合(UNIONを使って)
MySQLには組み込みのFULL JOINがないため、LEFT JOINとRIGHT JOINを組み合わせてUNIONを使って模倣することができます。以下のようにします:
SELECT t1.column1, t1.column2, t2.column1, t2.column2
FROM table1 t1
LEFT JOIN table2 t2 ON t1.id = t2.id
UNION
SELECT t1.column1, t1.column2, t2.column1, t2.column2
FROM table1 t1
RIGHT JOIN table2 t2 ON t1.id = t2.id;
これを分解してみましょう:
- 我们执行一个LEFT JOIN,以获取table1中的所有行以及table2中匹配的行。
- 然后我们用UNION将这个结果与一个RIGHT JOIN结合起来,后者获取table2中的所有行以及table1中匹配的行。
- UNIONはこれらの結果を結合し、効果的にFULL JOINを提供します。
実際の例
これをより具体的にするために、現実の例を使ってみましょう。想像してみてください、小さな図書館を管理していて、2つのテーブルがあります:「books」と「borrowers」。
まず、これらのテーブルを作成しましょう:
CREATE TABLE books (
book_id INT PRIMARY KEY,
title VARCHAR(100),
author VARCHAR(100)
);
CREATE TABLE borrowers (
borrower_id INT PRIMARY KEY,
book_id INT,
borrower_name VARCHAR(100)
);
INSERT INTO books VALUES (1, 'To Kill a Mockingbird', 'Harper Lee');
INSERT INTO books VALUES (2, '1984', 'George Orwell');
INSERT INTO books VALUES (3, 'Pride and Prejudice', 'Jane Austen');
INSERT INTO borrowers VALUES (1, 1, 'Alice');
INSERT INTO borrowers VALUES (2, NULL, 'Bob');
INSERT INTO borrowers VALUES (3, 4, 'Charlie');
今、全結合を実行しましょう:
SELECT b.book_id, b.title, br.borrower_id, br.borrower_name
FROM books b
LEFT JOIN borrowers br ON b.book_id = br.book_id
UNION
SELECT b.book_id, b.title, br.borrower_id, br.borrower_name
FROM books b
RIGHT JOIN borrowers br ON b.book_id = br.book_id;
このクエリは以下の結果を返します:
book_id | title | borrower_id | borrower_name |
---|---|---|---|
1 | To Kill a Mockingbird | 1 | Alice |
2 | 1984 | NULL | NULL |
3 | Pride and Prejudice | NULL | NULL |
NULL | NULL | 2 | Bob |
NULL | NULL | 3 | Charlie |
この結果を分析してみましょう:
- 我们看到所有的书,甚至是那些没有被借出的(例えば '1984' と 'Pride and Prejudice')。
- 我们看到所有的借阅者,甚至是那些当前没有借阅任何书籍的人(例えば Bob)。
- 我们甚至看到Charlie,彼は図書館の本(book_id 4)を借しているが、私たちの
books
テーブルには存在しません。
これが全結合の力です - 它为我们提供了完整的数据画面,突出显示表之间的匹配和不匹配。
WHERE句と全結合
時々、全結合の結果をフィルタリングしたい場合があります。WHERE句をクエリに追加してこれを行うことができます。例えば、現在借出されていないすべての本を見つめたいとします:
SELECT b.book_id, b.title, br.borrower_id, br.borrower_name
FROM books b
LEFT JOIN borrowers br ON b.book_id = br.book_id
WHERE br.borrower_id IS NULL
UNION
SELECT b.book_id, b.title, br.borrower_id, br.borrower_name
FROM books b
RIGHT JOIN borrowers br ON b.book_id = br.book_id
WHERE b.book_id IS NULL;
このクエリは以下の結果を返します:
book_id | title | borrower_id | borrower_name |
---|---|---|---|
2 | 1984 | NULL | NULL |
3 | Pride and Prejudice | NULL | NULL |
NULL | NULL | 2 | Bob |
NULL | NULL | 3 | Charlie |
この結果は以下を示しています:
- 現在借出されていない本('1984' と 'Pride and Prejudice')。
- 当前没有借阅任何书籍的借阅者(Bob)。
- 借阅者Charlieは、私たちの
books
テーブルには存在しない本(book_id 4)を借しています。
結論
そして、ここまでに、私亲爱的学生们!私たちはMySQLの全結合の土地を旅し、概念的理解から実際の例の実装までを探求しました。忘れないでください、MySQLには組み込みのFULL JOINがないため、LEFT JOIN、RIGHT JOIN、そしてUNIONの組み合わせで同じ結果を達成することができます。
全結合は、複数のテーブル間のマッチング値に関係なくすべてのデータを見る必要がある場合に非常に便利です。それは、パーティの包容力のある友達のように、誰もが関わることを確実にします!
MySQLの冒険を続ける中で、さまざまなシナリオで練習を続けてください。これらの概念をより多く遊ぶことで、より快適になるでしょう。そして、誰 knows? 友達の間でデータベースの達人になるかもしれません!
幸せなコーディングを、そしてあなたのクエリが常に望む結果を返すことを祈っています!
Credits: Image by storyset