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. 子句的综合使用

  1. 找出所有 CHECKS 表中对 CASH 和对 GAS 支付的记录并按 REMARKS 进行排序。

    
    SELECT 
    PAYEE,
    REMARKS 
    FROM 
    CHECKS 
    WHERE 
    PAYEE='Cash'
    OR 
    REMARKS 
    LIKE 'Ga%' 
    ORDER BY REMARKS;
    
    注:
    无论在什么情况下进行分组,
    SELECT 语句中出现的字段只能是在
    GROUP BY 中出现过才可以。
    
    
    
  2. 使用 ORGCHART 表找出病候天数少于 25 天的人的工资并按名字进行排序

    
    SELECT 
    NAME,
    SALARY 
    FROM 
    ORGCHART 
    WHERE 
    SICKLEAVE < 25 
    ORDER BY
    NAME;
    
    
    
  3. 使用 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 子句中的列名

控制 spark-sql 和数据帧中的字段可空性

动态sql中的where子句

WITH子句中的PL/SQL

如何转换逗号分隔的 varchar 以用于 pl/sql 中的“IN”子句?

JPA 和 SQL Server 的 ORDER BY 子句中的列无效