子查询
子查询就是指的在一个完整的查询语句之中,嵌套若干个不同功能的 小查询,从而一起完成复杂查询的一种编写形式,为了让读者更加清楚 子查询的概念。
范例
查询公司之中工资最低的雇员的完整信息
SELECT * FROM emp WHERE sal=( SELECT MIN(sal) FROM emp) ;
子查询返回结果
子查询可以返回的数据类型一共分为四种:
单行单列:返回的是一个具体列的内容,可以理解为一个单值数据;
单行多列:返回一行数据中多个列的内容;
多行单列:返回多行记录之中同一列的内容,相当于给出了一个操作范围;
多行多列:查询返回的结果是一张临时表;
子查询的常见操作
考虑到读者初次接触到子查询的操作,所以下面为了读者学习方便,对于 在何处使用子查询给读者以下几点个人的参考建议:
WHERE子句:此时子查询返回的结果一般都是单行单列、单行多列、多行 单列;
HAVING子句:此时子查询返回的都是单行单列数据,同时为了使用统计函 数操作;
FROM子句:此时子查询返回的结果一般都是多行多列,可以按照一张数据 表(临时表)的形式操作。
一个查询语句内部可以定义多个子查询; 子查询一般在WHERE、FROM、HAVING子句之中出现较多。
单行单列
范例:查询出基本工资比ALLEN低的全部雇员信息
范例:查询基本工资高于公司平均薪金的全部雇员信息
范例:查找出与ALLEN从事同一工作,并且基本工资高于雇员编号为7521的全部雇员信息
单行多列
范例:查询与SCOTT从事同一工作且工资相同的雇员信息
也可以这样操作
范例:查询与ALLEN从事同一工作且在同一年雇佣的全部雇员信息(不包括ALLEN)
多行单列
在使用多行子查询时,主要使用三种操作符:IN、ANY、ALL
IN是包含,不多说了
ANY在使用中有如下三种使用形式:
1、=ANY:表示与子查询中的每个元素进行比较,功能与IN类似(然而<>ANY不等价于NOT IN);
2、 >ANY:比子查询中返回结果的最小的要大(还包含了>=ANY);
3、<ANY:比子查询中返回结果的最大的要小(还包含了<=ANY)。
ALL操作符有以下三种用法:
1、<>ALL:等价于NOT IN(但是=ALL并不等价于IN);
2、>ALL:比子查询中最大的值还要大(还包含了>=ALL);
3、<ALL:比子查询中最小的值还要小(还包含了<=ALL)。
范例:查询出与每个部门中最低工资相同的全部雇员信息
范例:分别用= < > 演示any的作用
分别用!= < > 演示all的作用
多行多列
范例:查询出所有薪金高于公司平均薪金的员工编号、姓名、基本工资、职位、雇佣日期,所在部门名 称、位置,上级领导姓名,公司的工资等级,部门人数、平均工资、平均服务年限。
范例:列出薪金比“ALLEN”或“CLARK”多的所有员工的编号、姓名、基本工资、部门名称、其 领导姓名,部门人数。
范例:列出公司各个部门的经理(假设每个部门只有一个经理,job为 “MANAGER”)的姓名、薪金、部门名称、部门人数、部门平均工资。
空数据判断
在SQL之中提供了一个exists结构用于判断子查询是否有数据返回。 如果子查询中有数据返回,则exists结构返回true,反之返回false。
验证exists结构
SELECT * FROM emp WHERE EXISTS( SELECT * FROM emp WHERE empno=9999) ;
SELECT * FROM emp WHERE EXISTS( SELECT * FROM emp) ;
当括号里是真值时,前面的语句输出,假值就不输出