SQL 聚合函数、分组GROUP BY、子查询及组合查询JOIN
SQL 聚合函数、分组GROUP BY、子查询及组合查询JOIN
1、聚合函数:
- COUNT:统计行数量
- SUM:获取列的合计值(求和)
- AVG:计算列的平均值
- MAX:计算列的最大值
- MIN:计算列的最小值
1.1 COUNT 计数
1 | SELECT COUNT (*) FROM TABLE1; |
1 | SELECT COUNT ( DISTINCT 字段) FROM TABLE1; --DISTINCT即去重 |
1.2 返回列合计值(SUM):
1 | SELECT SUM (字段) FROM TABLE1 ; |
1.3 返回列平均值(AVG):
1 | SELECT AVG (字段) FROM TABLE1; |
1.4 返回最大值/最小值(MAX/MIN):
1 2 | SELECT MAX (字段) FROM TABLE1; SELECT MIN (字段) FROM TABLE1; |
2、数据分组(GROUP BY):
字段1 分组,统计 字段2 的数量:
1 | SELECT 字段1, COUNT ( ALL 字段2) AS 数量 FROM TABLE1 GROUP BY (字段1); |
执行顺序为:WHERE过滤→分组→聚合函数
字段1分组 统计 字段2 中 字段3 >100 的数量:
1 | SELECT 字段1, COUNT (字段2) AS 数量 FROM TABLE1 WHERE 字段3>100 GROUP BY (字段1); |
HAVING 子句过滤条件(where):
字段1 分组 统计 字段3平均值 > 100 的值
1 | SELECT 字段1, AVG (字段3) AS 平均值 FROM TABLE1 GROUP BY (字段1) HAVING AVG (字段3)>100; |
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。
注意:SQL的执行顺序:
- 1、执行FROM
- 2、WHERE条件过滤
- 3、GROUP BY分组
- 4、执行SELECT投影列
- 5、HAVING条件过滤
- 6、执行ORDER BY 排序
3、子查询:
什么是子查询?子查询就是嵌套在主查询中的查询。
子查询可以嵌套在主查询中所有位置,包括SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY。
从两个不同的表中,查出 t1.id,t1.name,t2.name
1 | SELECT t1.id,t1. name ,( SELECT name FROM table2 t2 WHERE t2.ccid=t1.ccid) FROM table1 t1 GROUP BY t1.id; |
--查出字段1='SQL'的且 字段2 的最大的信息
1 | SELECT * FROM table1 WHERE 字段1= 'SQL' AND 字段2>= ALL ( SELECT 字段2 FROM table1 WHERE 字段1= 'SQL' ) ; |
运算符:
- ALL //和子查询的结果逐一比较,必须全部满足时表达式的值才为真。
- ANY //和子查询的结果逐一比较,其中一条记录满足条件则表达式的值就为真。
- EXISTS/NOT EXISTS //EXISTS判断子查询是否存在数据,如果存在则表达式为真,反之为假。NOT EXISTS相反。
1 | SELECT * FROM table1 WHERE 字段1= 'SQL' AND 字段2 >( SELECT 字段2 FROM table1 WHERE 字段3= '你好' AND 字段1= 'SQL' |
1 | SELECT * FROM table1 t1 WHERE t1.字段1>= ALL ( SELECT t2.字段1 FROM table2 t2 WHERE t1.字段2=t2.字段2); |
4、组合查询(UNION、INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN):
4.1 UNION 操作符
用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
UNION 不会出现重复值
1 2 3 | SELECT 列1 , 列2 FROM 表1 UNION SELECT 列3 , 列4 FROM 表2; |
UNION ALL 列出所有值:
1 2 3 | SELECT 列1 , 列2 FROM 表1 UNION ALL SELECT 列3 , 列4 FROM 表2; |
4.2 INNER JOIN
在表中存在至少一个匹配时,INNER JOIN 关键字返回行。
语法:
1 2 3 4 | SELECT column_name(s) FROM table_name1 INNER JOIN table_name2 ON table_name1.column_name=table_name2.column_name |
4.3 LEFT JOIN
LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
语法:
1 2 3 4 | SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name |
4.4 RIGHT JOIN
RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。
语法:
1 2 3 4 | SELECT column_name(s) FROM table_name1 RIGHT JOIN table_name2 ON table_name1.column_name=table_name2.column_name |
4.5 FULL JOIN
只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。
语法:
1 2 3 4 | SELECT column_name(s) FROM table_name1 FULL JOIN table_name2 ON table_name1.column_name=table_name2.column_name |
创建时间:2020.09.10 更新时间:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报