使用語句的先后順序並不是優先級的排序:
連接分為:內連接和外連接,外連接分為左外連接,右外連接,全連接
概念上解釋,表之間聯合后數據如何整合。
返回的數據條數,可以通過集合求算。假如A集合有10條數據,B集合有8條數據,交集的有3條數據。
左外連接:左表的數據全部保留,右表中如果沒有滿足條件的用null對應。返回數據條數假如A是左表,B是右表,那么返回10條。
內連接:兩個表連接條件都存在數據保留,相當於數據集合的交集。返回數據條數假如A是左表,B是右表,那么返回3條。
右外連接:右表數據全部保留,左表中如果沒有滿足條件的用null對應。返回數據條數假如A是左表,B是右表,那么返回8條。
全連接:左表右表數據全部保留。返回數據條數假如A是左表,B是右表,那么返回13條。
語句:
內連接: table A inner join table B on(條件)/ table A inner join table B using(連接字段名稱在兩個表中相同)。
左外連接:table A left join table B on(條件)/table A left join table B on(連接字段名稱在兩個表中相同)。
右外連接:table A right join table B on(條件)/table A right join table B on(連接字段名稱在兩個表中相同)。
全連接(全外連接):table A full join table B on(條件)/table A full join table B on(連接字段名稱在兩個表中相同)。
測試實例:
測試表:
create table tbl_course( course_id bigint not null primary key, course_name varchar(12) not null ); create table tbl_student( stu_id bigint not null, stu_name varchar(12), constraint pk_tbl_student_stu_id primary key(stu_id) ); create table tbl_student_course( stu_id bigint not null, course_id bigint not null, constraint pk_tbl_student_course_stu_id_course_id primary key(stu_id,course_id), constraint fk_tbl_student_course_stu_id foreign key(stu_id) references tbl_student(stu_id) , constraint fk_tbl_student_course_course_id foreign key(course_id) references tbl_course(course_id) );
insert into tbl_course values(1,‘高等數學‘),(2,‘大學英語‘),(3,‘大學物理‘),(4,‘電影欣賞‘); insert into tbl_student values(1,‘張三‘),(2,‘李四‘),(3,‘王五‘),(4,‘麻子‘); insert into tbl_student_course values (1,2),(1,4),(2,4),(3,4);
二.內連接
INNER JOIN,其中INNER可以省略。
語法:
A INNER JOIN B ON (A.a = B.b)
如果ON條件中兩張表的字段名稱相同,還可以簡單一點
A INNER JOIN B USING(a = b)
內連接的結果如下圖中紅色部分

示例:查詢選課情況
test=# select * from tbl_student_course join tbl_student using(stu_id) join tbl_course using(course_id); course_id | stu_id | stu_name | course_name -----------+--------+----------+------------- 2 | 1 | 張三 | 大學英語 4 | 1 | 張三 | 電影欣賞 4 | 2 | 李四 | 電影欣賞 4 | 3 | 王五 | 電影欣賞 (4 rows)
三.左外連接
左外連接其實是一個內連接然后加上左表獨有的數據行,結果集中右表的字段自動補充NULL。
LEFT OUTTER JOIN ,其中OUTTER可以省略。
語法:
A LEFT JOIN B ON (A.a=B.b)
A LEFT JOIN B USING(a)
左外連接的結果如下圖紅色部分

示例:查詢所有學生的選課信息,包括沒選課的學生
test=# select * from tbl_student left join tbl_student_course using(stu_id) left join tbl_course using(course_id); course_id | stu_id | stu_name | course_name -----------+--------+----------+------------- 2 | 1 | 張三 | 大學英語 4 | 1 | 張三 | 電影欣賞 4 | 2 | 李四 | 電影欣賞 4 | 3 | 王五 | 電影欣賞 NULL | 4 | 麻子 | NULL (5 rows)
四.右外連接
右外連接其實是一個內連接然后加上右表獨有的數據行,結果集中左表的字段自動補充NULL。
RIGHT OUTTER JOIN ,其中OUTTER可以省略。
語法:
A RIGHT JOIN B ON (A.a=B.b)
A RIGHT JOIN B USING(a)
右外連接的結果如下圖紅色部分

示例:查詢所有課程被選情況
test=# select * from tbl_student right join tbl_student_course using(stu_id) right join tbl_course using(course_id); course_id | stu_id | stu_name | course_name -----------+--------+----------+------------- 2 | 1 | 張三 | 大學英語 4 | 1 | 張三 | 電影欣賞 4 | 2 | 李四 | 電影欣賞 4 | 3 | 王五 | 電影欣賞 3 | NULL | NULL | 大學物理 1 | NULL | NULL | 高等數學 (6 rows)
五.全外連接
全外連接其實是一個內連接然后加上左表和右表獨有的數據行,左表獨有的數據行右表的字段補充NULL,右表獨有的數據行左表字段補充NULL。
FULL OUTTER JOIN,其中OUTTER可以省略。
語法:
A FULL OUTTER JOIN B ON (A.a = B.b)
A FULL OUTTER JOIN B USING(a)
全外連接的結果如下圖紅色部分

示例:查詢所有學生和課程的選課信息
test=# select * from tbl_student full join tbl_student_course using(stu_id) full join tbl_course using(course_id); course_id | stu_id | stu_name | course_name -----------+--------+----------+------------- 2 | 1 | 張三 | 大學英語 4 | 1 | 張三 | 電影欣賞 4 | 2 | 李四 | 電影欣賞 4 | 3 | 王五 | 電影欣賞 NULL | 4 | 麻子 | NULL 3 | NULL | NULL | 大學物理 1 | NULL | NULL | 高等數學 (7 rows)
查詢只在左表存在的數據

示例:查詢沒有選課的學生
test=# select * from tbl_student left join tbl_student_course using(stu_id) where tbl_student_course.stu_id is null; stu_id | stu_name | course_id --------+----------+----------- 4 | 麻子 | NULL (1 row)
NOT IN存在很大的性能瓶頸,除NOT EXISTS外,也可以使用這種查詢方式作為替代方案。
查詢只在右表中存在的數據

示例:查詢沒有被選的課程
test=# select * from tbl_student_course right join tbl_course using(course_id) where tbl_student_course.course_id is null; course_id | stu_id | course_name -----------+--------+------------- 1 | NULL | 高等數學 3 | NULL | 大學物理 (2 rows)
查詢只在左表或只在右表存在的數據

示例:查詢沒有選課的學生和沒有被選的課程
test=# select * from tbl_student full join tbl_student_course using(stu_id) full join tbl_course using(course_id) where tbl_student.stu_id is null or tbl_course.course_id is null; course_id | stu_id | stu_name | course_name -----------+--------+----------+------------- NULL | 4 | 麻子 | NULL 3 | NULL | NULL | 大學物理 1 | NULL | NULL | 高等數學 (3 rows)
所有的JOIN查詢,只要理解了下面的圖,一切就OK了!

