oracle中简单查询语句的格式及执行顺序分析

一条简单的查询sql格式如下:

  SELECT ...

  FROM ....

  [WHERE ...] --过滤单行

  [GROUP BY ...   [HAVING ...]]--GROUP BY对前面where条件过滤后的结果进行分组,HAVING过滤行组

  

  [ORDER BY ...]--对结果进行排序

 

eg: 现在有个exchangetime表,表结构如下

  名称                                            是否为空? 类型
 ----------------------------------------------- -------- --------------------------------
 ID                                              NOT NULL NUMBER(18)
 SYSTEM_TYPE                                     NOT NULL CHAR(1)
 TIME_KIND                                       NOT NULL NUMBER(10)
 TIME_NAME                                       NOT NULL VARCHAR2(16)
 BEGIN_TIME                                      NOT NULL NUMBER(10)
 END_TIME                                        NOT NULL NUMBER(10)

 

查询语句及结果如下:

SQL> list  

   1     select t.system_type, avg(t.begin_time) from exchangetime t

     2     where t.id < 10  

        3     group by t.system_type  

        4     having avg(t.begin_time)>110000  

        5*    order by system_type

SQL> /

 

SYSTEM_TYPE  AVG(T.BEGIN_TIME)

------------ -----------------

0                       110750

1                       150000

 

SQL> spool off

 

在上面这个查询语句中where t.id < 10 先对exchagetime中的记录进行过滤,过滤后的行由group by 按照system_type进行分组,接着having子句对行组进行过滤,只保留avg(t.begin_time)>110000的行,最后order by语句按照system_type字段将结果进行升序排列,得到最终结果。

 

ps: 1、group by 后面可以不接having,但是如果有having子句的话必须与group by 语句结合使用

      2、where子句只能对单行进行过滤而不能过滤行组,过滤行组必须使用having子句,如where avg(t.begin_time)就是错误的。必须像上面的语句一样用having对行组进行过滤。

  

 

posted @ 2014-09-24 09:46  tarbitrary  阅读(332)  评论(0编辑  收藏  举报