3. SQL中的子句
Posted 江湖@小小白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3. SQL中的子句相关的知识,希望对你有一定的参考价值。
1. where
仅使用 SELECT 和 FROM 子句你会受到表中的每一行数据均返回的限制.
2. starting with
SELECT
PAYEE,
AMOUNT,
REMARKS
FROM CHECKS
WHERE
PAYEE STARTING WITH('Ca')
OR REMARKS LIKE 'G%';
3. order by
对查询输出的结果按照一定的规则排序,不使用order by,数据输出的情况是按照它们被输入的先后次序排序的。
1. 降序排列:
SELECT * FROM
CHECKS
ORDER BY PAYEE DESC;
2. 升序排列(默认):
SELECT PAYEE,AMOUNT
FROM CHECKS
ORDER BY PAYEE ASC;
3. order by 可以使用多个字段
SELECT * FROM
CHECKS
ORDER BY PAYEE,REMARKS;
如何将一列按字母的正顺排列,
而把第二列按字母的逆序进行排列.
SELECT * FROM
CHECKS
ORDER BY
PAYEE ASC,
REMARKS DESC;
注:如果你已经知道了进行排列的列是表中的第一列,
可以用 ORDER BY 1 来代替输入列的名字;
SELECT * FROM CHECKS ORDER BY 1;
4. group by
1. SELECT PAYEE,
SUM(AMOUNT)
FROM CHECKS
GROUP BY PAYEE;
注意:
SELECT 子句有一个正常的列,
之后是一个汇总函数,
如果它的后边只有 FROM 表 子句的话,那么会报错.
报错信息:
SELECT PAYEE SUM AMOUNT FROM CHECKS
Dynamic SQL Error
-SQL error code = -104
-invalid column reference
错误信息表明 SQL 无法把正常的列和汇总函数结合在一起,
这时,就需要 GROUP BY 子句,
它可以对 SELECT 的结果进行分组后应用在汇总函数.
eg:对 REMARKS 进行分组并找出组中的最大值和最小值.
SELECT
MIN(AMOUNT),
MAX(AMOUNT)
FROM CHECKS
GROUP BY
REMARKS;
注:如果我们在分组时指定的列名
与 SELECT 中指定的列名不相同,
报错。
SELECT PAYEE,
MAX(AMOUNT),
MIN(AMOUNT),
FROM CHECKS
GROUP BY REMARKS;
报错信息:
GROUP BY REMARKS
Dynamic SQL Error
-SQL error code = -104
-invalid column reference
分析:查询无法对 REMARK 进行分组,
当查询在 REMARK 字段中找到了两个重复的数值,
但他们的PAYEE不同,
这表明 GAS 有两个 PAYEE.
这将导致错误的发生.
规则是,
当要求分组结果返回多个值时,
不能在 SELECT 子句中使用除分组列之外的列,
这将导致错误的返回值,
可以使用在 SELECT 中未列出的的列进行分组
5. having
1. 对输出的结果进行分组并显示每一组的平均工资:
SELECT
TEAM,
AVG(SALARY)
FROM
ORGCHART
GROUP BY TEAM;
2. 返回分组后平均工资低于38000的组:
SELECT
TEAM,
AVG(SALARY)
FROM ORGCHART
WHERE AVG(SALARY) < 38000
GROUP BY TEAM;
报错信息:
Dynamic SQL Error
-SQL error code = -104
-Invalid aggregate reference
分析:
错误产生的原因是
由于汇总函数不能工作在 WHERE 子句中.
让这个查询工作,可以使用 —— HAVING 子句.
eg:
SELECT TEAM,
AVG(SALARY)
FROM
ORGCHART
GROUP BY TEAM
HAVING
AVG(SALARY) < 38000;
HAVING 子句允许将汇总函数作为条件,
SELECT TEAM,
AVG(SICKLEAVE),
AVG(ANNUALLEAVE)
FROM ORGCHART
GROUP BY TEAM
HAVING
AVG(SICKLEAVE) > 25
AND
AVG(ANNUALLEAVE) < 20;
SELECT
TEAM,
AVG(SICKLEAVE),
AVG(ANNUALLEAVE)
FROM ORGCHART
GROUP BY
TEAM
HAVING
COUNT(TEAM) > 1
注:
该查询返回了组中成员大于 1 的组,
虽然的 SELECT 子句中没有出现 COUNT(TEAM)语句,
但是它还是在 HAVING 子句中起到了它应有的作用.
在 HAVING 子句中也可以使用其它的逻辑操作符:
SELECT
TEAM,
MIN(SALARY),
MAX(SALARY)
FROM
ORGCHART
GROUP BY TEAM
HAVING AVG(SALARY) > 37000
OR
MIN(SALARY) > 32000;
注:操作符 IN 也可以在 HAVING 子句中使用.
6. 子句的综合使用
-
找出所有 CHECKS 表中对 CASH 和对 GAS 支付的记录并按 REMARKS 进行排序。
SELECT PAYEE, REMARKS FROM CHECKS WHERE PAYEE='Cash' OR REMARKS LIKE 'Ga%' ORDER BY REMARKS; 注: 无论在什么情况下进行分组, SELECT 语句中出现的字段只能是在 GROUP BY 中出现过才可以。
-
使用 ORGCHART 表找出病候天数少于 25 天的人的工资并按名字进行排序
SELECT NAME, SALARY FROM ORGCHART WHERE SICKLEAVE < 25 ORDER BY NAME;
-
使用 ORGCHART 表对每一个 TEAM 显示 TEAM,AVG(SALARY),AVG(SICKLEAVE) 和 AVG(ANNUALLEAVE)
SELECT TEAM, AVG(SALARY), AVG(SICKLEAVE), AVG(ANNUALLEAVE) FROM CHECKS GROUP BY TEAM;
以上是关于3. SQL中的子句的主要内容,如果未能解决你的问题,请参考以下文章
变量作为 Oracle PL/SQL 中 where 子句中的列名