单表查询
一、SQL语句中各子句的执行顺序
1. from
2. where
3. group by
4. having
5. select
6. order by
注:a)每一步操作都会返回一个数据集,下一个子句的操作对象是:上一个子句返回的数据集
b)由上述原理也可看出,select子句中自定义的别名,只能在order by子句中使用
2 selectdistinct custid as'顾客号'
3 from orders
4 orderby'顾客号'desc
5 ;
输出结果为:
二、group by与having子句的使用
Orders表中的所有数据如下:
1.group by子句的使用
2 select custid as'顾客号', empid as'售货员号',sum(freight) as'总路费'
3 from orders
4 groupby custid,empid
5 ;
输出结果为:
注:a)select中用到的列名,必须是group by 中出现的,但是可以用聚合函数对每个组的数据进行处理和输出;若使用其他列名,则会出错,原因:select子句在group by子句之后执行,而group by 返回的数据集中没有该列
2 select orderid as'订单号',custid as'顾客号', empid as'售货员号',sum(freight) as'总路费'
3 from orders
4 groupby custid,empid
5 ;
输出结果为:
ps: mysql与sqlserver机制不一样,mysql中允许在select中使用未在group by中出现的字段,
默认显示当前组中,第一条记录里该字段的值。
b)聚合函数的执行方式为:以组为单位对其中的所有元素进行处理
2.having子句的使用
2 select custid as'顾客号', empid as'售货员号',sum(freight) as'总路费'
3 from orders
4 groupby custid,empid
5 havingcount(*)>1
6 ;
输出结果为:
注:a)由于having子句实际是对group by子句返回的数据集进行操作,所以,group by中未使用的列,也不能在having子句中使用
b)having子句中使用的聚合函数是针对group by的每个组的数据进行处理
三、对比where和having
where:一般的条件筛选
having:依赖于group by,只能和group by一起使用,分组后的条件筛选
PS:having 只能和group by一起使用,且只能使用group by中出现的列,或者把列包含在聚合函数中
SELECT FSno,AVG(FGrade) AS FAvgGrade FROM TStudent GROUP BY FSno HAVING AVG(FGrade) > 60
四、聚合函数的操作对象
1.有group by
操作对象:每一组中的所有记录
2.无group by
操作对象:整个结果集中的所有记录