[Mysql] 的基础知识和sql 语句.教你速成(下)——查询的进阶 聚合查询与联合查询

 前言

这是MYsql系列博客中的第四篇

[Mysql] 的基础知识和sql 语句.教你速成(上)——逻辑清晰,涵盖完整-CSDN博客

[Mysql] 的基础知识和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, ...;

什么意思呢?就是给我们查询的事物加一个限定范围 

比如我们计算一个公司有多少人,那我们肯定是按部门来算的

伪代码如下(没有建立数据库和表格,仅仅是示意一下)

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)

内连接是最常见的一种连接类型,它返回两张表中匹配的记录。只有当两张表中都存在匹配的记录时,结果集才会包含这些记录。

示例

假设有两张表 studentscourses

students 表:

student_idstudent_name
1Alice
2Bob
3Charlie

courses 表:

course_idstudent_idcourse_name
1011Math
1022English
1031Science

查询每个学生选修的课程:

SELECT students.student_name, courses.course_name
 FROM students INNER JOIN courses ON 
students.student_id = courses.student_id;

结果

student_namecourse_name
AliceMath
AliceScience
BobEnglish

首先把所有情况都列举出来,然后筛掉没有用的数据,这样我们就可以把两张表连起来 

外连接 (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_name
AliceMath
AliceScience
BobEnglish
CharlieNULL
  • 右外连接 (RIGHT JOIN):与左外连接相反,返回右表中的所有记录,以及右表中与左表匹配的记录。如果右表中某些记录在左表中没有匹配,则结果中仍会包含这些记录,并在左表的列中显示 NULL。

示例

SELECT students.student_name, courses.course_name FROM 
students RIGHT JOIN courses ON 
students.student_id = courses.student_id;

结果

student_namecourse_name
AliceMath
AliceScience
BobEnglish
  • 全外连接 (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_name
AliceMath
AliceScience
BobEnglish
CharlieNULL

自连接 (SELF JOIN)

自连接是指在同一张表中进行连接查询。它将表的一个实例作为另一张表来使用。

示例

假设有一张表 employees

employee_idemployee_namemanager_id
1JohnNULL
2Jane1
3Jack1
4Jill2

查询每个员工及其经理的名字:

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;

结果

EmployeeManager
JohnNULL
JaneJohn
JackJohn
JillJane

除此以外,还有一部分知识点,比如子查询和合并查询,这个就留给读者们自己去学了,我写不动了.

结尾

更新真的不容易的,要写例子,还要排版,希望看到这里,给个赞不过分吧

  • 20
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值