Mysql子查询

Mysql子查询教程

子查询,就是指嵌套在其他查询语句中的查询。它有两个作用:用子查询进行过过滤和用子查询作为计算字段。

本章使用到的 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=10 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, 2); INSERT INTO `student` VALUES (6, 1006, ' 小 杰 ', 16, 3); INSERT INTO `student` VALUES (7, 1007, '小亮', NULL, 1); INSERT INTO `student` VALUES (8, 1008, '无年龄', NULL, 2); INSERT INTO `student` VALUES (9, 1009, '欧阳亮亮', 19, 3);

表里面数据可视化如下

01 子查询_01.png

用子查询进行过过滤

语法

SELECT 列1,列2... FROM 表名 WHERE 列n = (SELECT 列n FROM 表名 ...)

描述

上面的语法是比较简单的一个语法,它将另外一条 SQL 语句查询的结果作为 WHERE 后面的判断条件,我们使用的时候,不仅可以用 = ,也可以用其他的判断条件。判断条件详见 mysql 过滤查询。我们也知道在 where 后面可以进行过滤查询,我们也可以使用 HAVING 对数据进行过滤。

案例

我们以简单的一张表来进行查询。查询出年龄最小的学生的详细信息

-- 嗨客网(www.haicoder.net) SELECT * FROM student WHERE age = (SELECT MIN(age) FROM student);

运行结果如下

02 子查询_02.png

可以看到,将 SELECT MIN(age) FROM student 的结果当作条件,与表里面的 age 字段比较。将符合结果的数据都查询出来。我们例子中使用的是同一张表,当然不同的表也是可以作为子查询的,前提是子查询中的结果要和 where 条件中的列类型相符合。

用子查询作为计算字段

-- 嗨客网(www.haicoder.net) SELECT id,stu_no,stu_name,age,(select COUNT(1) FROM student) as total_count FROM student;

运行结果如下

03 子查询_03.png

本例子中,我们还是用的一张学生表,将学生表里面的所有学生总数作为结果,在查询结果里面展示了出来。

总结

很多查询中需要使用子查询。使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的 SQL 操作,同时也可以避免事务或者表锁死。子查询可以使查询语句很灵活,但子查询的执行效率不高。

子查询时,MySQL 需要为内层查询语句的查询结果建立一个临时表。然后外层查询语句再临时表中查询记录。查询完毕后,MySQL 需要撤销这些临时表。因此,子查询的速度会受到一定的影响。

如果查询的数据量比较大,这种影响就会随之增大。在 MySQL 中可以使用连接查询来替代子查询。连接查询不需要建立临时表,其速度比子查询要快。