MySQL数据库学习笔记(9)- DQL之表连接(内连接、外连接、自连接)

在介绍表连接之前,首先介绍一下外键

1. 外键(foreign key)

外键(foreign key) 为某个表中的一列,它包含另一个表的主键。

下面是一个简单的例子,比如一个学生表studen中,存储学生的信息(学号、姓名、年龄等),另一张成绩表中,记载着学生的成绩(学号、科目、成绩),其中成绩表的学号可以声明为一个外键。

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;

查询结果如下:

不会飞的纸飞机
扫一扫二维码,了解我的更多动态。

下一篇文章:MySQL数据库学习笔记(10)- distinct与in和exists子查询