6-子查询理解

单行子查询

1.查询工资比200号员工工资高的员工
分析:
比200号员工工资高,首先需要知道的是200号员工的工资,可以通过sql语句
SELECT SALARY FROM HR.EMPLOYEES WHERE EMPLOYEE_ID=200;得到
然后需要的是写一条SQL语句:查询工资大于?的数据
SELECT * FROM HR.EMPLOYEES WHERE SALARY > ?;
一般而言?可以添加一个数字:例如
SELECT * FROM HR.EMPLOYEES WHERE SALARY > 2000;
而现在?需要的是200号部门的员工的工资值.

理解:SELECT语句可以理解为Java中一个有Object返回值的函数,可以自动很多类型,可以为一个值,一个数组,一个集合
例如存在这样一个函数int getSalFromEmployees(int empId);
功能为根据员工ID从员工数据集合内获得某个员工的工资.最终返回的一个工资值
SELECT语句此时就可以理解为一个具有number类型返回值的函数.
?处此时可以理解为调用了一个函数得到了200号员工的数据.
最终这样一条SQL语句产生了,得到了想要的结果:
SELECT * FROM HR.EMPLOYEES WHERE SALARY > 
       (SELECT SALARY FROM HR.EMPLOYEES WHERE EMPLOYEE_ID=200);

多行子查询

2:了解多行子查询前需要知道的内容
> < = >= <= <>的使用:
在Java中,同样存在一些比较的运算符,例如>可以想到 1>2, 2<3, 2=2 此时是可以进行比较的,因为比较的都是数字,同样'a'=='a',
之所以能够互相进行比较是因为运算符两遍的数据类型本质一致('a'==20也可以进行比较,因为比较时字符比较的是其编码,本质上也是一个整数),
而'a' 不能与"a"进行比较,因为一个是char类型一个是String类型,类型不一致;
再看1中的SQL语句:
SALARY > (SELECT SALARY FROM HR.EMPLOYEES WHERE EMPLOYEE_ID=200);
之所以能够进行比较是因为SALARY是number类型,而后面的SELECT语句查询返回得到的结果也是一个number类型的数据;
假如改成了SALARY > (SELECT HIRE_DATE FROM HR.EMPLOYEES WHERE EMPLOYEE_ID=200);
此时sql语句报错,ORA-00932:数据类型不一致: 应为NUMBER,但却获得DATE.>比较时两边的数据不一致.
由此引发出了另外一个问题:
与上面的SELECT语句相比,SELECT语句返回的可能不仅仅是一条记录,例如将上述的SQL语句改为
SELECT * FROM HR.EMPLOYEES WHERE SALARY > (SELECT SALARY FROM HR.EMPLOYEES);
再次执行会报错:ORA-01427: 单行子查询返回多个行.
我们可以这样理解:SALARY是一个number类型的数据,而SELECT SALARY FROM HR.EMPLOYEES返回的查询结果
是一个number[]类型的数据,number类型不能与number[]类型进行比较所以报错.

为此Oracle提供了in,any,all这样的运算符用于单个记录与记录集的比较.

例子:可能有这样一个需求:查询出比John薪水高的员工
分析:要比John薪水高,首先需要知道的是John的薪水,可通过查询得到
SELECT SALARY FROM HR.EMPLOYEES WHERE FIRST_NAME='John';
此时上面的结果返回的是多条记录;
而现在的需求是比John薪水高,而叫John不仅仅是一个人,此时需要进行的比较是将每个员工的工资
与其中一个John的比,只要比某一个叫John的薪水高,那么这个人就符合查询的条件.
这种情况是是一个数据一组数据的比较,在Java中可以举例为:
int a = 10;
int[] arr = {10, 20, 30, 40, 100};需要判断a数字是不是属于arr内的数据,我们需要进行的操作
是将数字a与arr中的每一个数字进行比较,在Java中使用循环进行遍历.
而在Oracle数据库中提供了更为遍历的比较方式:
in:表示某一个数据属于某一个数据集合(等于其中一个)
any,all用于别的运算符的比较,
例如:
=any 表示等于其中一个(等同于in);
>any 表示大于其中一个;等同关系: (a>arr[1] || a>arr[2] || a>arr[3] || ...)
>all 表示大于其中的所有数据;等同关系: (a>arr[1] && a>arr[2] && a>arr[3] && ...)

多列子查询

可以理解为
(单行子查询结果1, 单行子查询结果2, 单行子查询结果3, ...) 
也可是如同单行子查询使用运算符=,如同多行子查询使用运算符 in, any, all
原文地址:https://www.cnblogs.com/superstudy/p/5120066.html