[Mysql] 的根本知识和sql 语句.教你速成(下)——查询的进阶 聚合查询与联合查询
前言这是MYsql系列博客中的第四篇
的根本知识和sql 语句.教你速成(上)——逻辑清晰,涵盖完备-CSDN博客
的根本知识和sql 语句.教你速成(下)——数据库的约束篇-CSDN博客
JDBC编程的学习——MYsql版本-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, ...;
什么意思呢?就是给我们查询的事物加一个限定范围
比如我们盘算一个公司有多少人,那我们肯定是按部分来算的
伪代码如下(没有建立数据库和表格,仅仅是示意一下)
SELECTCOUNT(*) 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_idstudent_name1Alice2Bob3Charlie courses 表:
course_idstudent_idcourse_name1011Math1022English1031Science 查询每个学生选修的课程:
SELECT students.student_name, courses.course_name
FROM students INNER JOIN courses ON
students.student_id = courses.student_id; 结果:
student_namecourse_nameAliceMathAliceScienceBobEnglish 起首把所有情况都列举出来,然后筛掉没有用的数据,这样我们就可以把两张表连起来
外毗连 (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_namecourse_nameAliceMathAliceScienceBobEnglishCharlieNULL
[*]右外毗连 (RIGHT JOIN):与左外毗连相反,返回右表中的所有记录,以及右表中与左表匹配的记录。如果右表中某些记录在左表中没有匹配,则结果中仍会包含这些记录,并在左表的列中显示 NULL。
示例:
SELECT students.student_name, courses.course_name FROM
students RIGHT JOIN courses ON
students.student_id = courses.student_id; 结果:
student_namecourse_nameAliceMathAliceScienceBobEnglish
[*]全外毗连 (FULL OUTER JOIN):返回左表和右表中的所有记录,并包含所有在另一表中没有匹配的记录。
示例:
SELECT students.student_name, courses.course_name FROM
students FULL OUTER JOIN courses ON
students.student_id = courses.student_id; 结果:
student_namecourse_nameAliceMathAliceScienceBobEnglishCharlieNULL 自毗连 (SELF JOIN)
自毗连是指在同一张表中进行毗连查询。它将表的一个实例作为另一张表来使用。
示例:
假设有一张表 employees:
employee_idemployee_namemanager_id1JohnNULL2Jane13Jack14Jill2 查询每个员工及其经理的名字:
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; 结果:
EmployeeManagerJohnNULLJaneJohnJackJohnJillJane
除此以外,另有一部分知识点,比如子查询和合并查询,这个就留给读者们自己去学了,我写不动了.
结尾
更新真的不容易的,要写例子,还要排版,盼望看到这里,给个赞不外分吧
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]