「 と の違いを知ろうとする」部分に着目するとJOIN
、LEFT JOIN
外部結合は、関連する別のテーブルに対応する行がない場合でも、あるテーブルのすべての行を表示したい場合に便利です。
学生とテストの成績を使用した簡単な例を次に示します。
create table students (student_id serial primary key, student_name text);
create table tests (test_id serial primary key, test_name text, test_date date);
create table grades (
student_id int,
test_id int,
grade char,
primary key (student_id, test_id),
foreign key (student_id) references students (student_id),
foreign key (test_id) references tests (test_id));
insert into students (student_name) values ('joe');
insert into students (student_name) values ('amber');
insert into students (student_name) values ('steve');
insert into tests (test_name, test_date) values ('test 1', '2013-01-20');
insert into tests (test_name, test_date) values ('test 2', '2013-02-10');
insert into grades (student_id, test_id, grade) values (1, 1, 'A');
insert into grades (student_id, test_id, grade) values (1, 2, 'B');
insert into grades (student_id, test_id, grade) values (2, 1, 'B');
insert into grades (student_id, test_id, grade) values (2, 2, 'A');
次のクエリは、学生とその成績のリストを返します。これには、まだ成績のない学生 (この場合は Steve) を識別する 1 つの行が含まれます。
select s.student_name, t.test_name, t.test_date, g.grade
from students as s
left join grades as g on s.student_id = g.student_id
left join tests as t on g.test_id = t.test_id;
student_name | test_name | test_date | grade
--------------+-----------+------------+-------
joe | test 1 | 2013-01-20 | A
joe | test 2 | 2013-02-10 | B
amber | test 1 | 2013-01-20 | B
amber | test 1 | 2013-01-20 | A
steve | | |
(5 rows)
外部結合を使用する非常に便利な方法の 1 つは、関連するテーブル内の一致する行がない行のみを表示する場合です。サブクエリでこれを行うこともできますが、外部結合を使用することは悪いオプションではありません。
select s.student_name
from students as s
left join grades as g on s.student_id = g.student_id
where g.student_id is null;
student_name
--------------
steve
(1 row)
...機能的には次と同等です。
select student_name from students where student_id not in (select student_id from grades);
student_name
--------------
steve
(1 row)