假設存在兩張表 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);
結果如下: