MySQL數據庫學習筆記(9)- DQL之表連接(內連接、外連接、自連接)

表連接(JOIN)是在多個表之間通過一定的連接條件,使表之間發生關聯,進而能從多個表直接獲取數據。


在介紹表連接之前,首先介紹一下外鍵

1. 外鍵(foreign key)

外鍵(foreign key) 爲某個表中的一列,它包含另一個表的主鍵。

下面是一個簡單的例子,比如一個學生表studen中,存儲學生的信息(學號、姓名、年齡等),另一張成績表中,記載着學生的成績(學號、科目、成績),其中成績表的學號可以聲明爲一個外鍵。
創建表時,SQL語句如下:

CREATE TABLE stu_score(
	id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	student_no INT NOT NULL,
	course VARCHAR(30) NOT NULL,
	grade INT NOT NULL,
	foreign key(student_no) references student(id)	# 聲明爲外鍵
);

2. 內連接與外連接

各種表連接的區別如下表所示:
MySQL數據庫學習筆記(9)- DQL之表連接(內連接、外連接、自連接)
交叉連接:沒有 WHERE 子句的交叉連接將產生 笛卡爾積 第一個表的行數乘以第二個表的行數等於笛卡爾積和結果集的大小。

下面的列舉一個內連接和左連接的示例(右連接左右顛倒就是左連接),MySQL不支持全連接。

下面是學生表 student 中的內容:
MySQL數據庫學習筆記(9)- DQL之表連接(內連接、外連接、自連接)
下面是成績表 score 中的內容:
MySQL數據庫學習筆記(9)- DQL之表連接(內連接、外連接、自連接)
內連接 查詢語句:

SELECT A.id, A.name, B.course, B.grade 
	FROM student A 
	JOIN score B 
	ON A.id = B.student_no;

結果如下:
MySQL數據庫學習筆記(9)- DQL之表連接(內連接、外連接、自連接)
左連接 查詢語句:

SELECT A.id, A.name, B.course, B.grade 
	FROM student A 
	LEFT JOIN score B 
	ON A.id = B.student_no;

這裏我們僅僅是把 JOIN 換成可 LEFT JOIN ,其結果如下:
MySQL數據庫學習筆記(9)- DQL之表連接(內連接、外連接、自連接)
可以明顯的看出,左連接是將A的全部+A和B相交的部分的集合。

3. 自連接

自連接是一種特殊的表連接,它是指相互連接的表在物理上是同一張表,但是在邏輯上是多張表。自連接通常用於表中的數據有層次結構,如區域表、菜單表、商品分類表等。

比如這裏是一張區域表 china_area ,表中的內容如下:
MySQL數據庫學習筆記(9)- DQL之表連接(內連接、外連接、自連接)
這裏的 嫩江縣黑河市哈爾濱 他們的pid 都爲1,都是屬於黑龍江省的
昌平區海淀區 他們的pid都爲2,都是屬於北京的
可見這個表達到了我們的要求物理上是一張表,邏輯上爲多張表

下面是自連接的SQL語句:

SELECT A.id, A.name, B.name 
	FROM china_area A, china_area B
	WHERE A.pid = B.id AND A.pid != 0;

查詢結果如下:
MySQL數據庫學習筆記(9)- DQL之表連接(內連接、外連接、自連接)

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