新手村之SQL——分组与子查询

1.GROUP BY

GROUP BY 函数就是 SQL 中用来实现分组的函数,其用于结合聚合函数,能根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。

sql 复制代码
mysql> SELECT `country`, COUNT(`country`) AS `teacher_count`
    -> FROM `teachers`
    -> GROUP BY `country`
    -> ORDER BY `teacher_count`, `country`;
+---------+---------------+
| country | teacher_count |
+---------+---------------+
| JP      |             1 |
| UK      |             1 |
| USA     |             1 |
| CN      |             2 |
+---------+---------------+
4 rows in set (0.04 sec)

2.HAVING 子句

我们在使用 WHERE 条件子句时会发现其不能与聚合函数联合使用,为解决这一点,SQL 中提供了 HAVING 子句。在使用时, HAVING 子句经常与 GROUP BY 联合使用,HAVING 子句就是对分组统计函数进行过滤的子句。

sql 复制代码
mysql> SELECT `T`.`name`, IFNULL(SUM(`C`.`student_count`),0) AS `student_count`
    -> FROM `courses` `C` 
    -> RIGHT JOIN `teachers` `T` ON `C`.`teacher_id` = `T`.`id`
    -> GROUP BY `T`.`id`
    -> HAVING `student_count` < 3000
    -> ORDER BY `student_count`, `name`;
+------------------+---------------+
| name             | student_count |
+------------------+---------------+
| Linghu Chong     |             0 |
| Northern Beggar  |             0 |
| Southern Emperor |          1520 |
+------------------+---------------+
3 rows in set (0.02 sec)

例题


筛选出同一国家的教师平均年龄大于所有教师平均年龄的国家,并获取这些国家的所有教师信息

拆分:

1.先选出教师平均年龄大于所有教师平均年龄的国家

sql 复制代码
SELECT country from teachers
group by country
having avg(age) > (SELECT avg(age) from teachers)

2.拿着这些国家去teachers表里找出教师信息

sql 复制代码
SELECT * from teachers
where country in(
SELECT country from teachers
group by country
having avg(age) > (SELECT avg(age) from teachers)
);

3.内联视图子查询

现需要查询国籍为美国(USA),且年龄最大的教师,请使用内联视图子查询实现。

本题将从教师表中查询到的美国教师作为内联表,再使用 WHERE 子句进行查询操作。

sql 复制代码
SELECT *
FROM (
	SELECT *
	FROM `teachers`
	WHERE `country` = 'USA'
) `T`
WHERE `age` = (
	SELECT MAX(`age`)
	FROM `teachers`
	WHERE `country` = 'USA'
);
相关推荐
ChrisitineTX8 小时前
凌晨突发Java并发问题:synchronized锁升级导致接口超时,排查过程全记录
java·数据库·oracle
极限实验室8 小时前
Easysearch 2.0.0 性能测试
数据库·性能优化
老华带你飞9 小时前
社团管理|基于Java社团管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
shayudiandian9 小时前
用LangChain打造你自己的智能问答系统
java·数据库·langchain
马克学长9 小时前
SSM特殊教育学校学生管理系统002k1(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·学生管理系统·特殊教育·ssm 框架
卿雪10 小时前
Redis 线程模型:Redis为什么这么快?Redis为什么引入多线程?
java·数据库·redis·sql·mysql·缓存·golang
梁萌10 小时前
MySQL中innerDB引擎的锁机制
数据库·mysql·索引·表锁·行锁
老华带你飞10 小时前
汽车销售|汽车报价|基于Java汽车销售系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot·后端·汽车
黑客思维者10 小时前
数据库连接池的并发控制与超时处理:从参数调优到动态适配
数据库
Chloeis Syntax10 小时前
MySQL初阶学习日记(4)--- 插入、聚合、分组查询 + 数据库约束
数据库·笔记·学习·mysql