单行子查询
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