前言
这是MYsql系列博客中的第四篇
[Mysql] 的基础知识和sql 语句.教你速成(上)——逻辑清晰,涵盖完整-CSDN博客
[Mysql] 的基础知识和sql 语句.教你速成(下)——数据库的约束篇-CSDN博客
这篇呢我们聚焦于一些进阶的查询sql语句的写法,由于笔者精力和内容的原因,就不再像教小孩子一样手把手的举例子了,能读到这篇博哥的读者想必也不是什么都不会的小白哥(姐)了,因此,偏向理论的会多一点
聚合查询
聚合查询用于计算表中数据的总和、平均值、最大值、最小值等统计信息。
常用的聚合函数
常用的聚合函数包括:
COUNT() | 计算行数或非 NULL 值的数量 | SELECT COUNT(*) FROM table_name; |
SUM() | 计算指定列的总和 | SELECT SUM(column_name) FROM table_name; |
AVG() | 计算指定列的平均值 | SELECT AVG(column_name) FROM table_name; |
MAX() | 找出指定列的最大值 | SELECT MAX(column_name) FROM table_name; |
MIN() | 找出指定列的最小值 | SELECT MIN(column_name) FROM table_name; |
GROUP_CONCAT() | 将组中的值连接成一个字符串 | SELECT GROUP_CONCAT(column_name) FROM table_name; |
STDDEV() | 计算指定列的标准差 | SELECT STDDEV(column_name) FROM table_name; |
VARIANCE() | 计算指定列的方差 | SELECT VARIANCE(column_name) FROM table_name; |
COUNT(DISTINCT) | 计算不同值的数量 | SELECT COUNT(DISTINCT column_name) FROM table_name; |
这都是一组打包好的函数,比起使用表达式查询会更方便一些
下面我随便举使用这些函数查询的例子,大伙学习下就好了
-- 计算员工表中的总人数
SELECT COUNT(*) FROM employees;
-- 计算销售表中的总销售额
SELECT SUM(sales_amount) FROM sales;
-- 计算产品表中产品价格的平均值
SELECT AVG(price) FROM products;
-- 找出员工表中最高的薪水
SELECT MAX(salary) FROM employees;
-- 找出学生表中最小的年龄
SELECT MIN(age) FROM students;
-- 将每个部门的员工名字连接成一个字符串
SELECT department_id, GROUP_CONCAT(employee_name) AS employees
FROM employees
GROUP BY department_id;
-- 计算产品价格的标准差
SELECT STDDEV(price) FROM products;
-- 计算产品价格的方差
SELECT VARIANCE(price) FROM products;
-- 计算订单表中不同客户的数量
SELECT COUNT(DISTINCT customer_id) FROM orders;
但是要记住,使用聚合函数,你如果不查询数字,约等于这玩意没什么用.
Group-by子句
Group-by 子句用于将结果集按一个或多个列进行分组,并对每个组应用聚合函数。
SELECT column1, column2, ..., aggregate_function(column)
FROM table_name
WHERE condition
GROUP BY column1, column2, ...;
什么意思呢?就是给我们查询的事物加一个限定范围
比如我们计算一个公司有多少人,那我们肯定是按部门来算的
伪代码如下(没有建立数据库和表格,仅仅是示意一下)
SELECT COUNT(*) AS employee_count
FROM employees
GROUP BY department;
同时记住我们的满足条件:
使用 GROUP BY 进行分组查 询时,SELECT 指定的字段必须是“分组依据字段”
说人话就是:
当你使用 GROUP BY进行分组查询时,select 语句中的字段必须是你用来分组的字段,或者是用聚合函数(例如 COUNT()
、SUM()
、AVG()
等)计算得出的结果。
也就是,我要查一个数据,然后通过一种属性给他分组.不知道大家看懂没有
HAVING
GROUP BY 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 WHERE 语句,而需要用 HAVING
例如
显示平均工资低于1500的角色和它的平均工资
select role,max(salary),min(salary),avg(salary) from emp group by role
having avg(salary)<1500
所以通常来说,这两位是一起出现的
记住这个顺序
书写顺序
select -- from --where--group--having--order by--limit ;
执行顺序
from -- where--group by--having--select--order by--limit;
聚合查询的内容就写到这里. 大家也能感觉到,这个玩意我们不会经常用的,个人感觉了解即可了
联合查询
什么是联合查询呢?
顾名思义,就通过两张或以上数量的表进行关联,查询一些数据
内连接 (INNER JOIN)
内连接是最常见的一种连接类型,它返回两张表中匹配的记录。只有当两张表中都存在匹配的记录时,结果集才会包含这些记录。
示例:
假设有两张表 students
和 courses
:
students
表:
student_id | student_name |
---|---|
1 | Alice |
2 | Bob |
3 | Charlie |
courses
表:
course_id | student_id | course_name |
---|---|---|
101 | 1 | Math |
102 | 2 | English |
103 | 1 | Science |
查询每个学生选修的课程:
SELECT students.student_name, courses.course_name
FROM students INNER JOIN courses ON
students.student_id = courses.student_id;
结果:
student_name | course_name |
---|---|
Alice | Math |
Alice | Science |
Bob | English |
首先把所有情况都列举出来,然后筛掉没有用的数据,这样我们就可以把两张表连起来
外连接 (OUTER JOIN)
外连接分为左外连接(LEFT JOIN)、右外连接(RIGHT JOIN)和全外连接(FULL OUTER JOIN)。
- 左外连接 (LEFT JOIN):返回左表中的所有记录,以及左表中与右表匹配的记录。如果左表中某些记录在右表中没有匹配,则结果中仍会包含这些记录,并在右表的列中显示 NULL。
示例:
SELECT students.student_name, courses.course_name FROM
students LEFT JOIN courses ON
students.student_id = courses.student_id;
结果:
student_name | course_name |
---|---|
Alice | Math |
Alice | Science |
Bob | English |
Charlie | NULL |
- 右外连接 (RIGHT JOIN):与左外连接相反,返回右表中的所有记录,以及右表中与左表匹配的记录。如果右表中某些记录在左表中没有匹配,则结果中仍会包含这些记录,并在左表的列中显示 NULL。
示例:
SELECT students.student_name, courses.course_name FROM
students RIGHT JOIN courses ON
students.student_id = courses.student_id;
结果:
student_name | course_name |
---|---|
Alice | Math |
Alice | Science |
Bob | English |
- 全外连接 (FULL OUTER JOIN):返回左表和右表中的所有记录,并包含所有在另一表中没有匹配的记录。
示例:
SELECT students.student_name, courses.course_name FROM
students FULL OUTER JOIN courses ON
students.student_id = courses.student_id;
结果:
student_name | course_name |
---|---|
Alice | Math |
Alice | Science |
Bob | English |
Charlie | NULL |
自连接 (SELF JOIN)
自连接是指在同一张表中进行连接查询。它将表的一个实例作为另一张表来使用。
示例:
假设有一张表 employees
:
employee_id | employee_name | manager_id |
---|---|---|
1 | John | NULL |
2 | Jane | 1 |
3 | Jack | 1 |
4 | Jill | 2 |
查询每个员工及其经理的名字:
SELECT e1.employee_name AS Employee, e2.employee_name AS Manager FROM
employees e1 LEFT JOIN employees e2 ON
e1.manager_id = e2.employee_id;
结果:
Employee | Manager |
---|---|
John | NULL |
Jane | John |
Jack | John |
Jill | Jane |
除此以外,还有一部分知识点,比如子查询和合并查询,这个就留给读者们自己去学了,我写不动了.
结尾
更新真的不容易的,要写例子,还要排版,希望看到这里,给个赞不过分吧