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之表连接(内连接、外连接、自连接)

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