关于mysql中 group by , order by , where, having 语句的区别与运用

本文通过具体案例详细解析了SQL语句中的group by、order by、where及having的使用方法,展示了如何利用这些语句进行数据筛选和排序。

最近一直在忙着和数据库有关的一些工作,这几天在写存储过程的时候,一些mysql的语句突然感觉有些不太明白,就是group   by   ,  order   by  ,where   ,  having这些语句,这次通过一个实例来总结和归纳一下,这几个语句的用法,仅供以后参考学习。

一.   首先以字面形式阐述一下这几个语句的功能:

    group  by:从英文上理解  就是分组的意思。需要和  聚合函数(例如:max(),count(),avg()等)配合使用,使用时至少有一个分组标识字段(例如某一列的列名)。

    oder  by :从英文上理解就是排序。一般后面跟上某一列的列名,然后查询到的数据会以该列的大小顺序进行排序显示,默认的是ASC(从小到大排列),desc(大到小排列)

    where: 对查询到的内容进行筛选,where后面跟上限定条件,where使用在分组和排序之后。

    having:作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。

二.  下面来看一个例子:

       首先建立一张,表名为STAFF.

       

    1.假如我们要列出每个部门最高薪水的结果(group  by的使用)。

        

        结果显示两列,分别是查询语句中需要的两个列,group by后面指定按照dept分组,正好为三组。注意select语句后面的两个查询对象需要用逗号隔开。

    2. 假如我们要按照日期从小到大列出表的信息(order  by 的使用)。

       

        如显示结果数据按照日期的大小从小到大依次列出。

    3.假如我们只想显示开发部们的信息(where的使用).

      

      如上显示结果,where后边的限定条件为开发部(字符使用单引号)。

    4.假如我们使用group by  分组过后,如1中,如果想筛选出分组后max(salary)大于3000的一组。

      

    如上结果所示,筛选出分组后需要列出的组。

  5.  下面来在一个例子中综合使用这几个语句。

      假如我们要倒序显示日期大于 2010-10-03中 ,每个部门中工资最高且大于2000的数据。

    

 

 

以上就是关于这几个语句的具体使用,仅供学习交流,有错忘指出。

MySQL 查询语句中 `WHERE`、`GROUP BY` 和 `ORDER BY` 等子句的执行顺序是由数据库引擎内部机制决定的,其实际执行顺序书写顺序存在差异,理解这一顺序对于优化查询性能至关重要。 1. **FROM 子句** 查询执行的第一步是确定数据来源,即从哪个表或视图中获取数据。这一步会加载表中的原始数据供后续操作使用[^2]。 2. **WHERE 子句** 在加载数据之后,`WHERE` 子句会对这些数据进行初步过滤,只保留满足条件的数据行。这一步的结果集将作为后续操作的基础。例如,`WHERE ProductPlace = 'china'` 会筛选出所有产地为中国的产品记录[^4]。 3. **GROUP BY 子句** 接下来,`GROUP BY` 子句会根据指定的列对数据进行分组。每个分组将包含一组具有相同值的行。这一步的结果是一个分组后的数据集,每个分组通常会结合聚合函数(如 `SUM`、`COUNT`、`AVG` 等)来计算统计数据。 4. **HAVING 子句** `HAVING` 子句用于对分组后的结果集进行进一步的过滤。它 `WHERE` 子句不同,`WHERE` 是在分组前对原始数据进行过滤,而 `HAVING` 是在分组后对分组结果进行过滤。例如,可以使用 `HAVING COUNT(*) > 5` 来筛选出包含超过5条记录的分组[^1]。 5. **SELECT 子句** 在分组和过滤完成后,`SELECT` 子句将决定最终返回的列。此时,可以使用聚合函数来生成最终的查询结果。需要注意的是,除了聚合函数外,`SELECT` 中的列必须出现在 `GROUP BY` 子句中,否则会导致错误[^2]。 6. **ORDER BY 子句** 最后,`ORDER BY` 子句会对最终的结果集进行排序。排序可以是升序(默认)或降序。MySQL 有两种方式实现排序:一种是通过索引扫描排序,另一种是通过文件排序(filesort)。索引扫描排序通常更快,因为它利用了索引的有序性;而文件排序则需要将数据加载到内存中进行排序,适用于没有合适索引的情况[^3]。 ### 示例代码 以下是一个包含 `WHERE`、`GROUP BY` 和 `ORDER BY` 的 SQL 查询示例: ```sql SELECT FruitName, ProductPlace, COUNT(*) AS Total FROM T_TEST_FRUITINFO WHERE ProductPlace = 'china' GROUP BY FruitName, ProductPlace ORDER BY Total DESC; ``` - **执行顺序**: 1. `FROM T_TEST_FRUITINFO`:从表中加载所有数据。 2. `WHERE ProductPlace = 'china'`:筛选出所有产地为中国的产品记录。 3. `GROUP BY FruitName, ProductPlace`:按水果名称和产地进行分组。 4. `SELECT FruitName, ProductPlace, COUNT(*) AS Total`:计算每个分组的数量。 5. `ORDER BY Total DESC`:按数量降序排列最终结果。 ### 总结 MySQL 查询的执行顺序如下: 1. `FROM` 2. `WHERE` 3. `GROUP BY` 4. `HAVING` 5. `SELECT` 6. `ORDER BY` 理解这一顺序有助于编写高效的 SQL 查询,并能够更好地优化数据库性能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值