MySQL中的where,group by,order by和having的区别。

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: MySQL中的where,group by,order by和having的区别。

where 和having

首先我们可以先从下面的一个例子来了解where和having:


select sno,avg(grade)
from sc
where avg(grade)>90
group by sno;

我们可以看到这个代码是错误的,因为什么呢?


答:where的子句中是不能使用聚集函数作为条件表达式的


正确的查询语句应该是:


select sno,avg(grade)
from sc
group by sno
having avg(grade)>90;

我们呢现在这里做一个补充:


聚集函数有哪些?


COUNT(*)——统计元组个数。


COUNT([DISTINCT|ALL]<列名>)——统计一列中值的个数。


SUM([DISTINCT|ALL]<列名>)——计算一列值的总和(此列必须是数值类型)。


AVG([DISTINCT|ALL]<列名>)——计算一列的平均值(同上)。


MAX([DISTINCT|ALL]<列名>)——求一列值中的最大值。


MIN([DISTINCT|ALL]<列名>)——求一列值中的最小值。


where后面不能使用聚合函数


原因:


聚合函数是针对结果集进行的,但是where条件,并不是在查询出结果集之后运行的,所以主函数放在where语句中会出现错误。


而having不一样,having是针对结果集做的筛选的,所以我们一般把主函数放在having中,用having来代替where。having一般是跟在group by 后面的!


where和having直接的区别有哪些?


相同点:where和having都可以加条件。


不同点:


1.where在分组前加条件,having在分组后加条件。


2.where的效率高于having,分组资源消耗非常大。


group by和order by

首先我们先弄明白两者的英文字面意思。


order by是排序的意思。


group by是分组的意思。


一般order by是默认asc(升序)排序,还可以使用desc(降序)来排序。order by后面必须列出排序的字段名,可以是多个字段名!


而group by为分组必须配合聚合函数才能使用!,使用时至少需要一个分组标志字段。


一些特殊案例

group by和where的一起使用。


我们来看下面这个例子:


select model,count(*) as count 
    from temptable 
    where trim(model) in ("A4","A5","A6") 
    group by model 
    having count(*) >= 50
;

由代码可以看到既有where也有group by。


这句话是没有任何错误的!!!


上句话的执行大概是这样的:


先根据where条件子句经行过来,再根据group by 子句进行聚合,最后再根据having自己对聚合结果进行过滤!


当我们使用where和group by一起时,应当注意:


1.where在前,group by在后。即先对select xx from xx的记录集合用where进行筛选,然后再使用group by 对筛选后的结果进行分组 使用having字句对分组后的结果进行筛选。


2.需要注意having和where的用法区别:

      1.having只能用在group by之后,对分组后的结果进行筛选(即使用having的前提条件是分组)。

      2.where肯定在group by 之前。

      3.where后的条件表达式里不允许使用聚合函数,而having可以。


3.当一个查询语句同时出现了where,group by,having,order by的时候,执行顺序和编写顺序是:

1.执行where xx对全表数据做筛选,返回第1个结果集。

2.针对第1个结果集使用group by分组,返回第2个结果集。


3.针对第2个结果集中的每1组数据执行select xx,有几组就执行几次,返回第3个结果集。

4.针对第3个结集执行having xx进行筛选,返回第4个结果集。

5.针对第4个结果集排序。


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
16天前
|
关系型数据库 MySQL 数据库
轻松入门MySQL:精准查询,巧用WHERE与HAVING,数据库查询如虎添翼(7)
轻松入门MySQL:精准查询,巧用WHERE与HAVING,数据库查询如虎添翼(7)
|
16天前
|
缓存 关系型数据库 MySQL
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
|
11天前
|
SQL 存储 关系型数据库
【mysql】将逗号分割的字段内容转换为多行并group by
【mysql】将逗号分割的字段内容转换为多行并group by
|
1月前
|
SQL 关系型数据库 MySQL
923.【mysql】 only full group by 模式
923.【mysql】 only full group by 模式
20 1
|
3月前
|
关系型数据库 MySQL Java
MySQL group by分组后,将每组所得到的id拼接起来
MySQL group by分组后,将每组所得到的id拼接起来
33 0
|
3月前
|
SQL 关系型数据库 MySQL
MySQL WHERE 子句
【1月更文挑战第2天】MySQL 使用讲解 第02期
|
SQL 关系型数据库 MySQL
《零基础》MySQL GROUP BY 语句(十九)
GROUP BY 语句根据一个或多个列对结果集进行分组。 在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。 GROUP BY 语法
91 0
|
关系型数据库 MySQL
MySQL GROUP BY 语句
MySQL GROUP BY 语句 GROUP BY 语句根据一个或多个列对结果集进行分组。 在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。 GROUP BY 语法 SELECT column_name, function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name; 实例演示 本章节实例使用到了以下表结构及数据,使用前我们可以先将以下数据导入数据库中。
967 0
|
11天前
|
关系型数据库 MySQL 数据库
mysql卸载、下载、安装(window版本)
mysql卸载、下载、安装(window版本)
|
29天前
|
关系型数据库 MySQL 数据库
rds安装数据库客户端工具
安装阿里云RDS的数据库客户端涉及在本地安装对应类型(如MySQL、PostgreSQL)的客户端工具。对于MySQL,可选择MySQL Command-Line Client或图形化工具如Navicat,安装后输入RDS实例的连接参数进行连接。对于PostgreSQL,可以使用`psql`命令行工具或图形化客户端如PgAdmin。首先从阿里云控制台获取连接信息,然后按照官方文档安装客户端,最后配置客户端连接以确保遵循安全指引。
82 1