若一個查詢同時涉及到兩個或者兩個以上的表,則稱之為連接查詢。常見的包括:等值連接查詢,自然連接查詢,非等值連接查詢,自身連接查詢,外連接查詢(左右連接)。
1.等值與非等值連接查詢(內連接)。
(等值連接的圖)
?
參考表數據庫表:
(表1與表2做了外鍵關聯)
等值連接概念:當連接運算符為=時為等值連接,相當于兩表執行笛卡爾后,取兩表連結列值相等的記錄。
查詢語句:
SELECT A.*, B.*
FROM student A INNER JOIN sc B
ON A.`sno`=B.`sno`;
另外一種寫法:
SELECT student.* ,sc.*
FROM student , sc
WHERE student.`sno` = sc.`sno`;
兩種寫法除了語法上的差別,沒有明顯差距,主要方便了解。看了大多數博客上寫的都是第一次,可能有一定優劣,有興趣的可以自己去百度下。
查詢結果都是一樣:
非等值連接概念:連接規則由等號以外的運算符組成。>,=,<,,>=,<=,<>,!=,between等。
這里只使用大于號">"比較兩個表的連接列的值,相當于兩表執行笛卡爾后,取一個表大于另一個表的連結列值的記錄。(這兩個表查詢的結果并沒有太大的意義,只是為了方便理解概念)
查詢語句:
SELECT A.*, B.*
FROM student A INNER JOIN sc B
ON A.`sno`>B.`sno`;
另外一種寫法:
SELECT student.* ,sc.*
FROM student , sc?
WHERE student.`sno` >sc.`sno`;
查詢的結果仍然一樣:
自然連接:在等值連接中把重復的屬性列去掉則為自然連接。(自然連接并不是自連接,兩者要有一定區分度)
查詢語句(仍然是兩種寫法,不過我懶的copy了 -_-):
SELECT student.* ,sc.`cno`,sc.`grade`
FROM student , sc
WHERE student.`sno` = sc.`sno`;
查詢結果:
?
2.外連接(左右連接)
左連接概念:指將左表的所有記錄與右表符合條件的記錄,返回的結果除內連接的結果,還有左表不符合條件的記錄,并在右表相應列中填NULL。
?
查詢語句:
SELECT student.*,sc.`cno`,sc.`grade`
FROM student LEFT JOIN sc
ON student.`sno`=sc.`sno`;
?
右外連接:指將右表的所有記錄與左表符合條件的記錄,返回的結果除內連接的結果,還有右表不符合條件的記錄,并在左表相應列中填NULL。(畫圖功底太low,就不多此一舉了 -_-)
查詢語句:
SELECT student.*,sc.`cno`,sc.`grade`
FROM student RIGHT JOIN sc
ON student.`sno`=sc.`sno`;
?
這里要提示一下:
on和where條件的區別如下:
1、?on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。
2、where條件是在臨時表生成好后,再對臨時表進行過濾的條件。
而inner jion(內連接)沒這個特殊性,則條件放在on中和where中,返回的結果集是相同的。
?
3.自身連接(自連接)
自身連接概述:連接操作不僅可以在兩個表之間進行,也可以是一個表與其自己進行連接,成為表的自身連接,也就是所謂的自連接。
自連接查詢其實等同于連接查詢,需要兩張表,只不過它的左表(父表)和右表(子表)都是自己。做自連接查詢的時候,是自己和自己連接,分別給父表和子表取兩個不同的別名,然后附上連接條件。
這里以一個課程的數據庫表來做實例。
查詢語句:
SELECT a.*,b.name
FROM SUBJECT a , SUBJECT b
WHERE a.`pno`=b.`cno`;
查詢結果:
有些課程沒有先行課,因此我們可以用左關聯結合自連接來查詢,便于觀察。
查詢語句:
SELECT a.*,b.name
FROM SUBJECT a LEFT JOIN SUBJECT b
ON a.`pno`=b.`cno`;
查詢結果:
?