单表查询

一、SQL语句中各子句的执行顺序
  1.  from
  2.  where
  3.  group by
  4.  having
  5.  select
  6.  order by

 注:a)每一步操作都会返回一个数据集,下一个子句的操作对象是:上一个子句返回的数据集

         b)由上述原理也可看出,select子句中自定义的别名,只能在order by子句中使用

1 use edisondb;
2  selectdistinct custid as'顾客号'
3  from orders
4 orderby'顾客号'desc
5 ;

输出结果为:

二、group by与having子句的使用

Orders表中的所有数据如下:

1.group by子句的使用

1 use edisondb;
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 返回的数据集中没有该列

1 use edisondb;
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子句的使用

1 use edisondb;
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

         操作对象:整个结果集中的所有记录

        

posted @ 2011-06-26 21:34  edisonfeng  阅读(366)  评论(0编辑  收藏  举报