在介绍表连接之前,首先介绍一下外键
外键(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) # 声明为外键
);
各种表连接的区别如下表所示:
交叉连接:没有 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相交的部分的集合。
自连接是一种特殊的表连接,它是指相互连接的表在物理上是同一张表,但是在逻辑上是多张表。自连接通常用于表中的数据有层次结构,如区域表、菜单表、商品分类表等。
比如这里是一张区域表 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;
查询结果如下: