數據庫:區分笛卡兒積、自然連接、內連接、等值連接、外連接

假設存在兩張表 c 和 p,這裏使用的是MySQL數據庫。

數據表 c

course_id title dept_name credits
BIO-301 Genetics Biology 4
CS-190 Game Design Comp.sci 4
CS-315 Robotics Comp.sci 3

數據表 p

course_id prereq_id
BIO-301 BIO-101
CS-190 CS-101
CS-347 CS-101

1. 笛卡兒積

SQL語句如下

select * from c,p;

select * from c cross join p;

結果如下
在這裏插入圖片描述

2. 自然連接

”natrual join 自然連接”的處理方式:先進行笛卡兒積操作,然後重複的屬性只保留一份。

自然連接的步驟是將第一張表的第一條記錄和第二張表的每一條記錄匹配,如果符合條件就組成一條記錄,然後第一張表的第二條記錄再和第二張表的每一條記錄匹配,這步驟一直循環到第一張表的最後一條記錄。

SQL語句如下

select c.course_id, c.title, c.dept_name, c.credits, p.prereq_id from c,p where c.course_id = p.course_id;

select * from c natural join p;

結果如下:
在這裏插入圖片描述

3. 內連接

“inner join 內連接”的處理方式:雖然重複,但兩份都保留。

內連接的結果和自然連接的結果是一樣的,只不過是顯示的屬性不一樣而已。內連接會將兩張表的重複屬性都分別列出來。

SQL語句如下

select * from c,p where c.course_id = p.course_id;

select * from c inner join p on c.course_id = p.course_id;

結果如下
在這裏插入圖片描述

4. 等值連接

從集合論角度看:等值連接是內連接的子集。

5. 外連接

(1)左連接

left join 是left outer join的簡寫,它的全稱是左外連接,是外連接中的一種。左(外)連接,左表的記錄將會全部表示出來,而右表只會顯示符合搜索條件的記錄。右表記錄不足的地方均爲NULL。其實就是將右邊的表的第一項根據條件分別和左邊的每一行數據進行對比,如果符合條件,就拼成一條記錄。

SQL語句如下

select * from c left join p on c.course_id = p.course_id;

結果如下
在這裏插入圖片描述

SQL語句如下

select * from c natural left join p;

結果如下
在這裏插入圖片描述

(2)右連接

right join是right outer join的簡寫,它的全稱是右外連接,是外連接中的一種。與左(外)連接相反,右(外)連接,左表只會顯示符合搜索條件的記錄,而右表的記錄將會全部表示出來。左表記錄不足的地方均爲NULL。

右連接的匹配步驟是先將左邊的表的第一項根據條件分別和右邊的每一行數據進行對比,如果符合條件,就拼成一條記錄。

SQL語句如下

select * from c right join p on c.course_id = p.course_id;

結果如下
在這裏插入圖片描述

SQL語句如下

select * from c natural right join p;

結果如下
在這裏插入圖片描述

(3)全連接

全連接也是屬於外連接的一種。但是MySQL裏沒有全連接的關鍵字。但是可以通過union來實現。

注意:

UNION 內部的每個 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每個 SELECT 語句中的列的順序必須相同。

默認地,UNION 操作符選取不同的值。如果允許重複的值,請使用 UNION ALL。

UNION 結果集中的列名總是等於 UNION 中第一個 SELECT 語句中的列名。

SQL語句如下

(select * from c left join p on c.course_id = p.course_id) union (select * from c right join p on c.course_id = p.course_id);

結果如下
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章