欢迎大家来到IT世界,在知识的湖畔探索吧!
在数据库的世界里,MySQL 是当之无愧的明星产品,被广泛应用于各类项目中。今天,咱们就来深入聊聊 MySQL 中非常实用的分组查询、聚合查询以及联合查询,看看它们如何帮助我们从海量数据里精准捞出所需信息!
聚合查询:数据统计小能手
聚合查询,说白了就是对数据库里的行数据搞运算,汇总出我们想要的结果。MySQL 给咱们准备了一堆超好用的内置聚合函数:
- COUNT 函数:想知道某列有多少数据,用COUNT(列名)就行。要是想统计整个表有多少行,直接COUNT(*),简单粗暴。比如SELECT COUNT(*) FROM employees;,就能立马告诉你employees表有多少条记录。还有个小细节,COUNT(1)效果和COUNT(*)差不多,大家可以按需选择。
- SUM 函数:计算某列数值总和必备。假设你有个存储员工工资的salary列,想知道工资总额,SELECT SUM(salary) FROM employees;,瞬间搞定。
- AVG 函数:算平均值靠它。像求员工平均工资,SELECT AVG(salary) FROM employees;,结果一目了然。
- MAX 和 MIN 函数:找某列最大值、最小值就用它们。例如SELECT MAX(salary), MIN(salary) FROM employees;,最高工资、最低工资马上呈现。
这些聚合函数还能和WHERE约束搭配使用,进一步筛选数据。比如说,你只想算某个部门员工的平均工资,就可以SELECT AVG(salary) FROM employees WHERE department = ‘销售部’; 。
分组查询:让数据条理清晰
分组查询,简单来讲,就是把数据按指定列进行分组。在SELECT语句里加上GROUP BY子句,就能实现这个操作。举个例子,咱们有个students表,里面记录了学生的班级和成绩,现在想看看每个班级的平均成绩,SQL 语句就可以这么写:
SELECT class, AVG(score) FROM students GROUP BY class;
欢迎大家来到IT世界,在知识的湖畔探索吧!
这里GROUP BY class就是按班级分组,AVG(score)计算每个分组里成绩的平均值。
使用GROUP BY分组查询时,要注意SELECT指定的字段,要么是分组依据字段(像上面例子里的class),要么就得包含在聚合函数里,不然可会报错哦。
分组之后,如果还想对分组结果进行条件过滤,这时候WHERE就不管用了,得请出HAVING。比如,你想找出平均成绩大于 80 分的班级,SQL 就得这么改:
欢迎大家来到IT世界,在知识的湖畔探索吧!SELECT class, AVG(score) FROM students GROUP BY class HAVING AVG(score) > 80;
HAVING专门用来过滤分组后的结果,而WHERE是在分组前筛选数据,这俩可别搞混啦。
联合查询:整合多方数据
实际工作中,数据往往分散在不同表,联合查询就是把多张表的数据整合到一块儿。常见的联合查询方式有内连接、外连接(左外连接、右外连接)、自连接和子查询。
- 内连接(INNER JOIN):最常用的连接方式,它会返回两张表中满足连接条件的所有行。比如有students表存学生信息,scores表存成绩,想查询学生及其对应的成绩,SQL 语句如下:
SELECT students.name, scores.score FROM students INNER JOIN scores ON students.id = scores.student_id;
这里ON students.id = scores.student_id就是连接条件,指定了两张表通过id和student_id关联。
- 外连接(LEFT JOIN/RIGHT JOIN):左外连接(LEFT JOIN)会返回左表所有行以及满足连接条件的右表行,右表没匹配上的用NULL填充;右外连接(RIGHT JOIN)则相反。假设students表有学生信息,scores表部分学生有成绩,现在想展示所有学生及其成绩(没成绩的显示NULL),用左外连接:
欢迎大家来到IT世界,在知识的湖畔探索吧!SELECT students.name, scores.score FROM students LEFT JOIN scores ON students.id = scores.student_id;
- 自连接:就是同一张表自己和自己连接。比如员工表,想找出每个员工及其上级领导,就可以用自连接。假设员工表employees里,员工和领导通过manager_id关联:
SELECT e.employee_name, m.employee_name AS manager_name FROM employees e JOIN employees m ON e.manager_id = m.employee_id;
这里把employees表当成俩表,e代表员工,m代表领导。
- 子查询:简单来说,就是在一个 SQL 语句里嵌套另一个SELECT语句。比如,想找出成绩高于平均成绩的学生,先算平均成绩,再筛选学生:
欢迎大家来到IT世界,在知识的湖畔探索吧!SELECT name, score FROM students WHERE score > (SELECT AVG(score) FROM students);
括号里的SELECT AVG(score) FROM students就是子查询,先算出平均成绩,外面主查询再根据这个结果筛选学生。
除了上面这些,还能用UNION和UNION ALL合并多个SELECT结果。UNION会去掉重复行,UNION ALL则保留所有行,包括重复的。例如:
SELECT name, age FROM students UNION SELECT name, age FROM teachers;
这条语句会把students表和teachers表的姓名、年龄数据合并,重复行只显示一次。要是用UNION ALL,重复行也会保留。
怎么样,分组查询、聚合查询、联合查询是不是挺有意思?在实际开发中,这些查询技巧能帮我们高效处理数据。大家不妨动手试试,用这些方法从自己的数据库里挖掘有价值的信息。要是在学习过程中有啥疑问,或者碰到有趣的应用场景,欢迎在评论区分享交流,咱们一起进步!
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/135302.html