sql篇 select from where group by having order by

本文详细解析了SQL语句中Select、From、Where、Group By、Having及Order By的使用顺序与应用场景,通过实例帮助读者掌握正确的SQL编写逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


       以前,自己总是记不住如何用group by,如何用order by,什么时候用group by,什么时候用order by,什么时候两者一起用,怎么用,谁先谁后,现在,我们就一起来说一下Select   from   where   groupby   having   order by 的那些事,简单的总结一下,加深一下自己的印象,也给有需要的人提供点资源

      Select   from   where   groupby   having   order by ,不用说,select from肯定是一起的,然后是where,然后是group by,having的前提是先分组,所以跟着group by,来的是分组之后的筛选条件。最后是从艺的数据集中select 字段,最最后,对已得的数据进行排序


所以执行顺序依次是:

Where
Group by
Having   <span style="font-family: Arial, Helvetica, sans-serif;">Select    Order by</span>

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

2.针对第1个结果集使用group by分组,返回第2个结果集。 
3.针对第2个结集执行having xx进行筛选,返回第3个结果集。
4针对第3个结果集中的每1组数据执行select xx,有几组就执行几次,返回第4个结果集。 
5.针对第4个结果集排序       其实说起来,我们的sql语句主要就是这几个加上一些聚合函数,嵌套用法什么的,在有一些什么case when语句,下面来个更形象的图文并茂

数据源:

           

 

先来一个比较另类的、简单的,组内排序

Select StudentName,LessonName,Result  from TestTable order byStudentName,LessonName,Result

     

       先执行Select StudentName,LessonName,Result from TestTable,然后根据StudentName排序,在此基础上再根据LessonName排序,在以上基础上再根据Result进行升序排序

 

another:

 select StudentName,SUM(Result) asResultField from TestTable where LessonName='语文' GROUP BYStudentName HAVING SUM(Result)>7 ORDER BY ResultField
       

       他的执行顺序是先执行筛选出LessonName=’语文’的,根据StudentName进行分组,在以分组基础上筛选Result之和大于7的数据,然后就是从已得数据集中select StudentName,SUM(Result) as ResultField,然后最后数据集根据总分大小升序排列

 

这里面呢,其他的都挺简单,值得注意的是group by的用法:

select 列a,聚合函数(聚合函数规范) from 表明 where 过滤条件 group by 列a ;
select 列a,列b 聚合函数(聚合函数规范) from 表明 where 过滤条件 group by 列a , 列b

也就是说,我们从select里面展示的字段都是要用来分组的依据,如果是:

select 列a,列b 聚合函数(聚合函数规范) from 表明 where 过滤条件 group by 列a 



重:下面说一下having和where的用法区别: 
        1.having只能用在group by之后,对分组后的结果进行筛选(即使用having的前提条件是分组)。 
        2.where肯定在group by 之前,即也在having之前。 
        3.where后的条件表达式里不允许使用聚合函数,而having可以。



当然可以!`SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY` 这些关键字组合起来用于构建SQL查询语句,目的是从数据库表中提取特定的数据,并对其进行过滤、分组以及排序等操作。 ### SQL 查询示例 假设有一个名为 `orders` 的表格,包含以下列: | order_id | customer_name | product | quantity | price | |----------|---------------|-----------|----------|-------| | 1 | Alice | Pen | 5 | 2.00 | | 2 | Bob | Notebook | 3 | 4.50 | | 3 | Charlie | Pen | 7 | 2.00 | | 4 | David | Eraser | 6 | 1.50 | 我们想找出每个客户的总订单金额并且只显示那些购买了超过两件商品的客户,并按总金额降序排列结果。我们可以编写如下的SQL查询: ```sql SELECT customer_name, SUM(quantity * price) AS total_amount FROM orders WHERE quantity > 2 -- 筛选出数量大于2的商品记录 GROUP BY customer_name -- 按顾客姓名对数据进行分组 HAVING COUNT(*) >= 1 -- 只选择有至少一条符合条件记录的用户 (这里表示只要存在就保留) ORDER BY total_amount DESC; -- 结果按照总金额降序排列 ``` 在这个例子中: - **SELECT** 选择了我们要查看的结果字段 (`customer_name`, 计算后的总计费用). - **FROM** 表明我们将从哪一个表(`orders`) 中获取信息. - **WHERE** 添加了一个条件限制,即筛选出数量大于2的商品. - **GROUP BY** 将所有行依据指定的标准(customer_name),将属于同一个标准值的所有行归并在一起计算聚合函数(SUM(), COUNT()... ). - **HAVING** 再次设置了条件,这次是对经过分组之后的结果施加约束(比如要求每组至少有一条有效记录),因为这里的聚合运算是在group by之后做的, 所以不能放在where里去限定. - 最后通过 **ORDER BY**, 我们指定了输出顺序 - 根据总价由高到低. #### 输出结果可能类似于这样: | customer_name | total_amount | |---------------|--------------| | Charlie | 14.00 | | David | 9.00 | 请注意实际返回的具体数值取决于测试用表的内容;此示例仅为了说明如何构造相应的SQL查询。 ---
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值