表連接(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. 內連接與外連接
各種表連接的區別如下表所示:
交叉連接:沒有 WHERE 子句的交叉連接將產生 笛卡爾積 第一個表的行數乘以第二個表的行數等於笛卡爾積和結果集的大小。
下面的列舉一個內連接和左連接的示例(右連接左右顛倒就是左連接),MySQL不支持全連接。
下面是學生表 student 中的內容:
下面是成績表 score 中的內容:
內連接 查詢語句:
SELECT A.id, A.name, B.course, B.grade
FROM student A
JOIN score B
ON A.id = B.student_no;
結果如下:
左連接 查詢語句:
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 ,其結果如下:
可以明顯的看出,左連接是將A的全部+A和B相交的部分的集合。
3. 自連接
自連接是一種特殊的表連接,它是指相互連接的表在物理上是同一張表,但是在邏輯上是多張表。自連接通常用於表中的數據有層次結構,如區域表、菜單表、商品分類表等。
比如這裏是一張區域表 china_area ,表中的內容如下:
這裏的 嫩江縣 、 黑河市 和 哈爾濱 他們的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;
查詢結果如下: