1. SQL的通用语法为:
SELECT [DISTINCT | ALL] { *
| { [schema.]{table | view | snapshot}.*
| expr } [ [AS] c_alias ]
[, { [schema.]{table | view | snapshot}.*
| expr } [ [AS] c_alias ] ] ... }
FROM [schema.]{table | view | snapshot}[@dblink] [t_alias]
[, [schema.]{table | view | snapshot}[@dblink] [t_alias] ] ...
[WHERE condition ]
[GROUP BY expr [, expr] ... [HAVING condition] ]
[{UNION | UNION ALL | INTERSECT | MINUS} SELECT command ]
[ORDER BY {expr|position} [ASC | DESC]
[ {expr|position} [ASC | DESC]] ...]
2. SQL中有如下几种子句类型:
- WHERE
- STARTING WITH
- ORDER BY
- GROUP BY
- HAVING
- 集合子句UNION,UNION ALL, INTERSECT, 和MINUS (前节已介绍)
3. 几个子句的详述
1) WHERE子句
WHERE是使用频度仅次于SELECT 和FROM 的语句,用于对返回数据进行限制,基本的语句为
select ... from ... where...
其中,where中出现的字段可以不出现在select的部分,即,作为限定条件的列可以不是查询的列,例如:
SELECT LOCATION AS "WHERE'S WALDO?" FROM PUZZLE WHERE NAME = 'WALDO';
在WHERE子句中NAME是限定条件,但它不出现在select部分。(这个例子中的AS也可以省略。 )
2) STARTING WITH 子句
STARTING WITH 子句附加于WHERE 子句上,它的作用与LIKE exp% 相似,例如:
SELECT PAYEE, AMOUNT, REMARKS FROM CHECKS WHERE PAYEE LIKE('Ca%');
等价于 SELECT PAYEE, AMOUNT, REMARKS FROM CHECKS WHERE PAYEE STARTING WITH 'CA';
注: Oracle 10似乎不支持starting with子句
3) ORDER BY子句
用于对输出结果排序,默认为升序(即ASC),如需要降序可使用DESC,还可以对几列进行排序(逗号隔开),例子:
SELECT * FROM CHECKS ORDER BY PAYEE ASC, REMARKS DESC 首先结果按PAYEE升序,然后按REMARKS降序排序
4) GROUP BY子句
用于对汇总函数(COUNT,SUM,AVG,MIN,MAX)的输出进行分组。
SQL 无法把正常的列和汇总函数结合在一起这时就需要GROUP BY子句,它可以对SELECT 的结果进行分组后再应用汇总函数。即:
SELECT PAYEE, SUM, AMOUNT FROM CHECKS; 将执行错误
而 SELECT PAYEE, SUM, AMOUNT FROM CHECKS GROUP BY PAYEE; 则可以执行,它将把数据先按PAYEE分组,然后汇总
注意:
A)当要求分组结果返回多个数值时,不能在在SELECT 子句中使用除分组列以外的列,这将会导致错误的返回值
B)可以使用在SELECT 中未列出的列进行分组
5) HAVING子句
用于对GROUP BY中的分组汇总数据结果进行限制,此子句的引入是因为汇总子句不能存在于WHERE子句中.
假设要按照部门统计平均工资,并且显示平均工资大于38000的组的信息
错误: SELECT TEAM,AVG(SALARY) FROM ORGCHART WHERE AVG(SALARY)>38000 GROUP BY TEAM;
正确:SELECT TEAM,AVG(SALARY) FROM ORGCHART GROUP BY TEAM HAVING AVG(SALARY)>38000;
注意:
A)如果HAVING后面跟的是非汇总函数,某些解释器会处理出错;而另一些会只对组内所有数值均符合该条件的组别汇总统计并显示.
B)HAVING可以使用SELECT中没有出现的汇总函数进行汇总过滤
C)其他逻辑操作符,如OR,AND,IN等也可以在HAVING子句中使用
4. 子句使用的要点
1) WHERE, ORDER BY子句通常用于对单行的处理
2) GROUP BY, HAVING子句通常用于对数据进行汇总操作
3) 把(WHERE,ORDER BY)和(GROUP BY, HAVING)结合起来使用经常会有出人意料的结果,应尽量避免
例如下面这个查询:
SQL>SELECT PAYEE,SUM(AMOUNT),TOTAL,COUNT(PAYEE) NUMBER_WRITTEN
2>FROM CHECKS
3>WHERE AMOUNT>=100
4>GROUP BY PAYEE
5>HAVING SUM(AMOUNT) >50;
首先过滤数据,只选择AMOUNT>=100的行,然后按照PAYEE分组汇总,并且只显示AMOUNT求和大于50的结果。