在SELECT查 询语句里可以嵌入SELECT查询语句,称为嵌套查 询。有些书中将内嵌的SELECT语句称为“子查 询”,子查询形成的结果又称为父查询的条件。 下面是嵌套查询的格式: SELECT 字段列表 FROM 表名 WHERE 操作符 (SELECT select_list FROM table); 3.5.1 简单子查询 【例】查询员工中所有高于员工底雪洋薪水 的员工信息。 SQL 语句如下: SQL>SELECT name,sex,salary FROM EMP WHERE salary>= (SELECT salary FROM EMP WHERE name='底雪洋'); 3.5.2 单行子查询 单行子查询的结果仅返回一行记录。一般使用比较运算符(<、>、<=、 >=、<>)。 【例】阅读下面的SQL 语句,并解释其含义。 SQL>SELECT name,sex,salary FROM EMP WHERE job = (SELECT job FROM EMP WHERE name ='底雪洋') AND salary > (SELECT salary FROM EMP WHERE name='李一岚'); 3.6 集合运算 3.6.1 UNION UNION 是集合的并运算,并运算的结果是参 加运算的集合元素的总和,相当于数学的加 法。如图3-1所示。其中集合A和集合B的交 叉部分为集合C。 集合A 集合B 3.6.2 INTERSECT INTERSECT是集合的交运算。交运算的结果是参加运算的 集合元素的公共元素。 假设:集合A={1,2,3},集合B={2,3,5},那么执行 INTERSECT运算的结果是{2,3}。 数学符号记为:A∩B。 在SQL语言中它返回查询结果中的相同部分。 【例】找出account、research、sales中都存在的工种。 SQL>SELECT job FROM account INTERSECT SELECT job FROM research INTERSECT SELECT job FROM sales; 3.6.3 MINUS MINUS是集合的差运算。差运算的结果是参加运算的集合元素中从第一 个集合中去掉二者相同部分元素后剩余的元素,相当于数学的减法。 假设:集合A={1,2,3},集合B={2,3,5},那么执行MINUS运算的结果是 {1}。 数学符号记为:A-B。 在SQL语言中它返回在第一次查询结果中而不在第二次查询结果中的记 录。 【例】找出在account 中存在而在research中不存在的工种。 SQL>SELECT job FROM account MINUS SELECT job FROM research; 3.7 聚合函数 常用的聚合函数包括如下几种函数:AVG()、 MIN()、MAX()、SUM()、COUNT()。 1.MAX 格式:MAX(x) 返回一个字段的所有值中的最大值。如果x是 VARCHAR2数据类型,返回一个字符串;如果x是 一个DATE数据类型,返回一个日期;如果x是 DATE x number数据类型,返回一个数字。 【例】查询EMP表中的最高工资。 SQL>SELECT max(salary) AS 最高薪水 FROM EMP; 2.MIN 格式:MIN(x) 返回一个字段的所有值中的最小值。如果字段是空的,函数 MIN()返回空值。 【例】查询EMP表中的最低工资。 SQL>SELECT MIN(salary) AS 最少薪水 FROM EMP; 【例】查询公司中工资最高和工资最低的员工。 SQL>SELECT ename,sal FROM EMP HAVING sal=(SELECT MAX(SAL) FROM EMP) AND sal=(SELECT MIN(SAL) FROM EMP); 3.AVG 格式:AVG({x} 返回指定字段中的平均值。注意,函数AVG()只能 对数值型字段使用,即x的数据类型只能是数值型, 如果空值即AVG(''),忽略不计。缺省设置为ALL。 【例】查询软件开发部人员的平均工资。 SQL>SELECT avg(salary) AS 平均工资 FROM EMP WHERE deptname='软件开发部'; 4.COUNT 格式:COUNT(*) 返回查询中行的数目,缺省值是ALL,*表示返回所 有的行。用来统计一个表中有多少条记录,包括有 空值的记录。因此,不需要指定要被计算的特定字 段。 【例】统计EMP表目前有多少条记录。 SQL>SELECT count(*) AS 记录总数 FROM EMP; 5.SUM 格式:SUM(x) 返回选择列表项目x的数值的总和。 【例】求所有部门的工资总和。 SQL>SELECT SUM(salary) AS 薪水总和 FROM EMP; 3.7.2 GROUP BY的应用 聚合函数就是操作那些已经分好组的数据,可以用 GROUP BY给数据分组或者分类。 【例】对于员工表EMP和部门表DEPT,查询各个 部门的职工数。 SQL>SELECT d.deptno,COUNT() FROM EMP e,dept d WHERE e.deptno=d.deptno GROUP BY d.deptno; 3.7.3 HAVING与 WHERE 关键词的 使用 在使用聚合函数时一定要小心,如果在SELECT 查 询语句的条件表达式中出现聚合函数时不要使用 WHERE 条件句,而要使用HAVING条件句。 【例】查询哪些部门的工资总和超过了10000元。 SQL>SELECT deptno,SUM(salary) FROM EMP GROUP BY deptno HAVING AVG(salary) >10000; 3.7.4 ORDER BY的应用 使用ORDER BY 子句可以对查询结果进行排序,其 中包括升序和降序。升序使用ASC关键字(缺省 值),降序使用DESC关键字。 【例】查询EMP表中所有男员工的信息,按照工资 EMP 从大到小进行排序。 SQL>SELECT * FROM EMP WHERE sex='男' ORDER BY salary; 3.8 本章小结 本章介绍了SQL语言的功能和种类,数据类 型、运算符和表达式,还介绍了本章的重 点—SQL语言的数据查询语句SELECT、多 表查询和子查询,最后介绍了集合运算和聚 合函数的应用。注意,聚合函数在SELECT 语句中的使用,即WHERE条件句和 HAVING条件句的区别。