• 1. 子查询
  • 2. 目标通过本章学习,您将可以: 描述子查询可以解决的问题 定义子查询。 列句子查询的类型。 书写单行子查询和多行字查询。
  • 3. 使用子查询解决问题谁的工资比 Abel 高?谁的工资比 Abel 高?Main Query:?Abel的工资是多少??Subquery
  • 4. 子查询语法子查询 (内查询) 在主查询之前一次执行完成。 子查询的结果被主查询使用 (外查询)。SELECT select_list FROM table WHERE expr operator (SELECT select_list FROM table);
  • 5. SELECT last_name FROM employees WHERE salary > (SELECT salary FROM employees WHERE last_name = 'Abel');子查询11000
  • 6. 注意事项子查询要包含在括号内。 将子查询放在比较条件的右侧。 除非进行Top-N 分析,否则不要在子查询中使用ORDER BY 子句。 单行操作符对应单行子查询,多行操作符对应多行子查询。
  • 7. 子查询类型主查询子查询返回ST_CLERK多行子查询ST_CLERK SA_MAN主查询子查询返回单行子查询
  • 8. 单行子查询只返回一行。 使用单行比较操作符。操作符 = > >= < <= <>含义 Equal to Greater than Greater than or equal to Less than Less than or equal to Not equal to
  • 9. 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_CLERK2600
  • 10. SELECT last_name, job_id, salary FROM employees WHERE salary = (SELECT MIN(salary) FROM employees);在子查询中使用组函数2500
  • 11. 子查询中的 HAVING 子句首先执行子查询。 向主查询中的HAVING 子句返回结果。 Having and where 不同 :对聚合函数的约束上SELECT department_id, MIN(salary) FROM employees GROUP BY department_id HAVING MIN(salary) > (SELECT MIN(salary) FROM employees WHERE department_id = 50);2500
  • 12. SELECT employee_id, 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 than one row多行子查询使用单行比较符
  • 13. 子查询中的空值问题no rows selectedSELECT last_name, job_id FROM employees WHERE job_id = (SELECT job_id FROM employees WHERE last_name = 'Haas');子查询不返回任何行
  • 14. 多行子查询返回多行。 使用多行比较操作符。操作符 IN ANY ALL含义 等于列表中的任何一个 和子查询返回的任意一个值比较 和子查询返回的所有值比较
  • 15. 在多行子查询中使用 ANY 操作符9000, 6000, 4200SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary < ANY (SELECT salary FROM employees WHERE job_id = 'IT_PROG') AND job_id <> 'IT_PROG';…
  • 16. SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary < ALL (SELECT salary FROM employees WHERE job_id = 'IT_PROG') AND job_id <> 'IT_PROG';在多行子查询中使用 ALL 操作符9000, 6000, 4200
  • 17. 子查询中的空值问题SELECT emp.last_name FROM employees emp WHERE emp.employee_id NOT IN (SELECT mgr.manager_id FROM employees mgr); no rows selected
  • 18. 总结通过本章学习,您已经学会: 在什么时候遇到什么问题应该使用子查询。 在查询是基于未知的值时应使用子查询。SELECT select_list FROM table WHERE expr operator (SELECT select_list FROM table);
  • 19. (本页无文本内容)
  • 20. (本页无文本内容)
  • 21. (本页无文本内容)