Mysql联结表

Mysql联结表教程

在使用数据库查询语句时,单表的查询有时候不能满足项目的业务需求,在项目开发过程中,有很多需求都是要涉及到多表的连接查询,这个时候就需要使用到表的关联查询,JOIN 语句。

表链接查询分为 内连接查询(inner join),左关联查询(left join),右关联查询(right join)。

本章使用到的 sql 语句如下

-- 学生表 CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `stu_no` int(11) DEFAULT NULL, `stu_name` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL, `class_id` int(11) NOT NULL COMMENT '班级ID', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; INSERT INTO `student` VALUES (1, 1001, 'xiaoming', 17, 1); INSERT INTO `student` VALUES (2, 1002, 'honghong', 16, 2); INSERT INTO `student` VALUES (3, 1003, 'xiaojun ', 18, 3); INSERT INTO `student` VALUES (4, 1004, '小亮', 19, 1); INSERT INTO `student` VALUES (5, 1005, 'LIANGLIANG', 19, 4); INSERT INTO `student` VALUES (6, 1006, ' 小 杰 ', 16, 4); INSERT INTO `student` VALUES (7, 1007, '小亮', NULL, 1); INSERT INTO `student` VALUES (8, 1008, '无年龄', NULL, 2); INSERT INTO `student` VALUES (9, 1009, '欧阳亮亮', 19, 5);
-- 班级表 CREATE TABLE `class`( `id` int(11) NOT NULL AUTO_INCREMENT, `class_name` varchar(100) NOT NULL DEFAULT '' COMMENT '班级名称', PRIMARY KEY (`id`) )ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; INSERT INTO class VALUES(1,'一年级一班'); INSERT INTO `class` VALUES(2,'一年级二班'); INSERT INTO `class` VALUES(3,'二年级一班'); INSERT INTO `class` VALUES(4,'二年级二班'); INSERT INTO `class` VALUES(6,'二年级三班');

内连接查询

语法

内连接,他有两种语法,两种语法执行查询到的效果一样。

select 表1.列,表1.列...表2.列... from 表1 INNER JOIN 表2 ON 表1.列 = 表2.列;
select 表1.列,表1.列...表2.列... from 表1,表2 WHERE 表1.列 = 表2.列;

描述

INNER JOIN 是将两个表内连接查询。它最终得到的数据是两个表里面公共的数据。

04 inner_join_01.png

案例

第一种语法查询

-- 嗨客网(www.haicoder.net) SELECT student.stu_no,student.stu_name,student.age,class.class_name FROM student INNER JOIN class ON class.id = student.class_id;

运行结果如下

05 inner_join_02.png

第二种语法查询

-- 嗨客网(www.haicoder.net) SELECT student.stu_no,student.stu_name,student.age,class.class_name FROM student,class WHERE student.class_id = class.id;

运行结果如下

06 inner_join_03.png

上面的 sql 是查询我们的学生信息和学生对应的班级信息。由于班级信息和学生信息在两张表里面,所以我们就用 INNER JOIN 将两张表连接。通过 class 表里面的 ID,将两个表里面的数据关联起来。

我们 student 表里面有 9 条记录,它有一个学生的班级 ID 对应的 5,班级表中没有这样的数据。所以我们看到的到的结果和上面图里面展示的结果一致,获取的是两个表里面共有的数据。

上面的第二种语法里面的 where 条件是相当重要的,如果第二个语句里面的 where 条件不加,它会将两个表里面的数据都会匹配一遍。的到的结果就是将两张表里面的数据进行笛卡尔积

左连接查询

语法

select 表1.列,表1.列...表2.列... from 表1 LEFT JOIN 表2 ON 表1.列 = 表2.列;

描述

它和内连接类似,它不仅会将两个表共有的数据获取也会将 LEFT 左表的 表1 里面的所有数据都查询出来,右边表里面没有的字段会用 null 代替。

07 left_join_01.png

案例

-- 嗨客网(www.haicoder.net) SELECT student.stu_no,student.stu_name,student.age,class.class_name FROM student INNER JOIN class ON class.id = student.class_id;

运行结果如下

08 left_join_02.png

右连接查询

语法

select 表1.列,表1.列...表2.列... from 表1 RIGHT JOIN 表2 ON 表1.列 = 表2.列;

描述

它和左连接相反,它会将两个表共有的数据和 LEFT 右边的 表2 里面的所有数据都查询出来,左边表里面没有的字段会用 null 代替。

09 right_join_01.png

案例

-- 嗨客网(www.haicoder.net) SELECT student.stu_no,student.stu_name,student.age,class.class_name FROM student RIGHT JOIN class ON class.id = student.class_id;

运行结果如下

10 right_join_02.png

我们看到,有一个二年级三班,它的班级 ID 是 6 ,没有学生的表里面的班级 ID 是 6 的,所以左边学生的信息用 null 代替。

总结

表关联不仅仅可以两个表关联,也可以多表关联。我们文章中只讲了两表关联的情况,其实多表关联的情况和上面类似,只要你将两表关联的情况使用熟练,那么多表关联就不是问题了。

表连接关联的时候,通过 on 将两张表联系了起来,其中 on 条件里面的两个字段含义是需要一样的。表连接的方式有多种,平时工作中,你需要哪种方式可以自行选择。