一条简单的查询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对行组进行过滤。