SQL--SQL中的子句 (4)

本文详细介绍了SQL查询语句的基本语法及其子句的使用方法,包括WHERE、STARTING WITH、ORDER BY、GROUP BY和HAVING等子句的功能及注意事项。

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的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值