《oracle子查询.ppt》由会员分享,可在线阅读,更多相关《oracle子查询.ppt(26页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、子查询,目标,通过本章学习,您将可以: 描述子查询可以解决的问题 定义子查询。 列句子查询的类型。 书写单行子查询和多行字查询。,使用子查询解决问题,谁的工资比 Abel 高?,谁的工资比 Abel 高?,Main Query:,?,Abel的工资是多少?,?,Subquery,子查询语法,子查询 (内查询) 在主查询之前一次执行完成。 子查询的结果被主查询使用 (外查询)。,SELECTselect_list FROMtable WHEREexpr operator (SELECTselect_list FROMtable);,SELECT last_name FROM employees
2、WHERE salary (SELECT salary FROM employees WHERE last_name = Abel);,子查询,11000,注意事项,子查询要包含在括号内。 将子查询放在比较条件的右侧。 除非进行Top-N 分析,否则不要在子查询中使用ORDER BY 子句。 单行操作符对应单行子查询,多行操作符对应多行子查询。,子查询类型,ST_CLERK,多行子查询,ST_CLERK SA_MAN,单行子查询,单行子查询,只返回一行。 使用单行比较操作符。,Operator = = ,Meaning Equal to Greater than Greater than or
3、 equal to Less than Less than or equal to Not equal to,SELECT last_name, job_id, salary FROM employees WHERE job_id = (SELECT job_id FROM employees WHERE employee_id = 141) AND salary (SELECT salary FROM employees WHERE employee_id = 143);,执行单行子查询,ST_CLERK,2600,SELECT last_name, job_id, salary FROM
4、employees WHERE salary = (SELECT MIN(salary) FROM employees);,在子查询中使用组函数,2500,子查询中的 HAVING 子句,首先执行子查询。 向主查询中的HAVING 子句返回结果。,SELECT department_id, MIN(salary) FROM employees GROUP BY department_id HAVING MIN(salary) (SELECT MIN(salary) FROM employees WHERE department_id = 50);,2500,SELECT employee_id
5、, last_name FROM employees WHERE salary = (SELECT MIN(salary) FROM employees GROUP BY department_id);,非法使用子查询,ERROR at line 4: ORA-01427: single-row subquery returns more thanone row,Single-row operator with multiple-row subquery,子查询中的空值问题,no rows selected,SELECT last_name, job_id FROM employees WHE
6、RE job_id = (SELECT job_id FROM employees WHERE last_name = Haas);,Subquery returns no values,多行子查询,返回多行。 使用多行比较操作符。,Operator IN ANY ALL,Meaning Equal to any member in the list Compare value to each value returned by the subquery Compare value to every value returned by the subquery,在多行子查询中使用 ANY 操作
7、符,9000, 6000, 4200,SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary IT_PROG;,SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary IT_PROG;,在多行子查询中使用 ALL 操作符,9000, 6000, 4200,子查询中的空值问题,SELECT emp.last_name FROM employees emp WHERE emp.employee_id NOT IN (
8、SELECT mgr.manager_id FROM employees mgr); no rows selected,SELECT a.last_name, a.salary, a.department_id, b.salavg FROM employees a, (SELECT department_id, AVG(salary) salavg FROM employees GROUP BY department_id) b WHERE a.department_id = b.department_id AND a.salary b.salavg;,在 FROM 子句中使用子查询,EXIS
9、TS 操作符,EXISTS 操作符检查在子查询中是否存在满足条件的行 如果在子查询中存在满足条件的行: 不在子查询中继续查找 条件返回 TRUE 如果在子查询中不存在满足条件的行: 条件返回 FALSE 继续在子查询中查找,SELECT employee_id, last_name, job_id, department_id FROM employees outer WHERE EXISTS ( SELECT X FROM employees WHERE manager_id = outer.employee_id);,EXISTS 操作符应用举例,SELECT department_id,
10、 department_name FROM departments d WHERE NOT EXISTS (SELECT X FROM employees WHERE department_id = d.department_id);,NOT EXISTS 操作符应用举例,相关更新,使用相关子查询依据一个表中的数据更新另一个表的数据,UPDATE table1 alias1 SET column = (SELECT expression FROM table2 alias2 WHERE alias1.column = alias2.column);,DELETE FROM table1 ali
11、as1 WHERE column operator (SELECT expression FROM table2 alias2 WHERE alias1.column = alias2.column);,相关删除,使用相关子查询依据一个表中的数据删除另一个表的数据,DELETE FROM employees E WHERE employee_id = (SELECT employee_id FROM emp_history WHERE employee_id = E.employee_id);,相关删除应用举例,总结,通过本章学习,您已经学会: 在什么时候遇到什么问题应该使用子查询。 在查询是基于未知的值时应使用子查询。,SELECTselect_list FROMtable WHEREexpr operator (SELECT select_list FROM table);,总结,通过本章学习,您已经可以: 使用多列子查询 单列子查询 EXISTS 和 NOT EXISTS操作符 相关更新和相关删除,
限制150内