这两天嘎嘎写sql啊,然后嘎嘎载跟头,特别是那个group by,谁让咱没正儿八经实践过oracle呢,参考链接在末尾哈
group by
分组函数,对by后面的字段进行一个分组,即后面一个字段就按照该字段分组,两个字段就把两个字段当成一组进行分组,查询出来的数据不会重复(自带去重效果,但是论执行时间还是distinct函数更加快速)
是和聚合函数搭配的
当在一个SQL中同时使用where和group by和having子句时,其执行顺序为:where>group by>having。
同时where子句作用于表或者视图,having子句作用于组,having子句必须作用在group by之后。
而group by子句必须放在where子句之前
一般情况下where,group by,having三者并不会连用,而是group by和另两个进行一个搭配,因为
group by子句用于分组数据,where子句用于筛选行级数据,而having子句用于筛选分组数据
oracle和mysql在该函数上的区别
select * from table group by id;
这条sql语句可以用在mysql中而无法用在oracle中,因为**select子句后的任一非聚合函数字段都应来源于group by 分组语句后,否则语法会编译不通过。**简单点理解就是没有使用聚合函数的列都得出现在group by之后。问就是今天在这里猛猛栽跟头
拓展
where
条件查询,后跟筛选条件,筛选条件可以分为以下三类:
- 按条件表达式筛选,>,=这些条件运算符
- 按照逻辑表达式筛选,and,or这些逻辑运算符
- 模糊查询,like,in这些模糊查询关键字
where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
having
在oracle中一定要结合group by使用,在mysql中没有强制要求一定
having函数后面可以接聚合条件参数,也就是聚合函数+一些运算符和字段,用来弥补where语句不能搭配聚合函数的缺陷
having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。
sql语句执行顺序
这个就很重要了,毕竟是写sql逻辑顺序的一个关键点
-
from子句:从数据库中选择要查询的表,并进行必要的连接操作。
-
join子句:如果在 from子句中使用了连接操作(如 inner join、left join等),则执行连接操作并获取匹配的行。
-
where子句:根据指定的条件筛选行级数据。
-
group by子句:按照指定的列进行分组。
-
having子句:对分组后的结果进行筛选。
-
select子句:选择要返回的列或表达式。
-
distinct:如果有使用distinct关键字,则对结果进行去重操作,保留唯一值。
-
order by子句:按照指定的列对结果进行排序。
-
limit(或类似的操作):如果有使用限制或分页等操作,根据指定的条件限制结果集的大小。
-
offset(或类似的操作):如果有使用偏移量操作,跳过指定数量的结果行。
我这边比较简短,想要更详细的可以参考这个链接(图解 SQL 执行顺序,通俗易懂! (qq.com)),并且人家带图,更加容易理解,我的这个主要好记
参考链接
Oracle分组查询group by的用法及讲解 (baidu.com)
oracle group by 的各种用法_M_Jack的博客-优快云博客
一文讲懂SQL条件子句WHERE - 知乎 (zhihu.com)
SQL的having函数用法以及与where函数的区别_sql对查询结果进行条件限制having_小白修炼晋级中的博客-优快云博客