六、 子查询
1 子查询介绍
1.1 什么是子查询
子查询是一个 SELECT 语句,它是嵌在另一个 SELECT 语句中的子句。
可以用组合两个查询的方法解决这个问题,放置一个查询到另一个查询中。内查询或子查询返回一个值给外查询或主查询。使用一个子查询相当于执行两个连续查询并且用第一个查询的结果作为第二个查询的搜索值。
1.2 子查询语法

• 子查询 (内查询) 在主查询之前执行一次
• 子查询的结果被用于主查询 (外查询)
可以将子查询放在许多的 SQL 子句中,包括:
• WHERE 子句
• HAVING 子句
• FROM 子句
2 使用子查询
2.1 使用子查询的原则
• 子查询放在圆括号中。
• 将子查询放在比较条件的右边。
• 在单行子查询中用单行运算符,在多行子查询中用多行运算符。
2.1.1 示例
谁的薪水比Abel高。用内连接实现:

select em.last_name,em.salary from employees abel,employees em
where abel.last_name = 'Abel' and em.salary > abel.salary;

用子查询实现:

select em.last_name,em.salary from employees em where em.salary >(
select m.salary from employees m where m.last_name ='Abel');

3 子查询的类型
• 单行子查询:子查询语句只返回一行的查询
• 多行子查询:子查询语句返回多行的查询

3.1 单行子查询
• 仅返回一行
• 使用单行比较符
主查询对子查询结果的单行比较运算符:
3.1.1 示例一
显示那些 job ID 与雇员 141 相同的雇员的名字与 job ID。

select em.last_name,em.job_id from employees em where em.job_id = (
select job_id from employees e where e.employee_id = 141);

3.1.2 示例二
显示 job ID 与雇员 141 相同,并且薪水 高于雇员 143 的那些雇员。

select e.last_name,e.job_id,e.salary from employees e where e.job_id = (
select em.job_id from employees em where em.employee_id = 141) and e.salary > (
select emp.salary from employees emp where emp.employee_id = 143);

3.2 在子查询中使用组函数
在子查询中也可使用组函数。
3.2.1 示例
显示所有其薪水等于最低薪水的雇员的 last name、job ID 和 salary。


select em.last_name,em.job_id,em.salary from employees em
where em.salary =(select min(salary) from employees);

3.3 带子查询的 HAVING 子句
可以在 WHERE 子句中使用子查询,也可以在 HAVING 子句中使用子查询。
3.3.1 示例
显示所有其最低薪水大于 部门 50 的最低薪水的部门号和最低薪水。

select em.department_id,min(em.salary) from employees em group by em.department_id having min(em.salary) > (
select min(e.salary) from employees e where e.department_id = 50);

3.4 什么是子查询错误?

子查询错误:使用子查询的一个常见的错误是单行子查询返回了多行。
3.5 多行子查询
• 返回多于一行
• 使用多行比较符
主查询对子查询的多行比较运算符

操作 含义
in 等于列表中的任何成员
any 比较子查询返回的每一个值
all 比较子查询返回的全部值

在条件中也可使用 NOT 取反。
3.6 在多行子查询中使用 IN 运算符
3.6.1 示例
查找各部门收入为部门最低的那些雇员。显示他们的名字,薪水以及部门 ID。

select e.last_name,e.department_id,e.salary  from employees e where e.salary in(
select min(em.salary) from employees em group by em.department_id);

3.7 在多行子查询中使用 ANY 运算符

< ANY 意思是小于最大值。 >ANY 意思是大于最小值。

3.7.1 示例
显示工作岗位不是 IT_PROG 的雇员,并且这些雇员的的薪水少于 IT_PROG 工作岗位的雇员的 ID、名字、工作岗位和薪水。

select e.employee_id,e.last_name,e.job_id,e.salary from employees e where e.job_id <> 'IT_PROG' and e.salary < any (
select em.salary from employees em where em.job_id = 'IT_PROG') ;

3.8 在多行子查询中使用 ALL 运算符

<ALL 意思是小于最小值。>ALL 意思是大于最大值。

ANY 与 ALL 的区别:

ANY: >ANY 表示至少大于一个值,即大于最小值。
ALL: >ALL 表示大于每一个值,既大于最大值。

3.8.1 示例
显示那些薪水低于工作岗位 IT_PROG 的最低薪水,并且工作岗位不是 IT_PROG 的所有雇员。

select e.employee_id,e.last_name,e.job_id,e.salary from employees e where e.job_id <> 'IT_PROG' and e.salary < all (
select em.salary from employees em where em.job_id = 'IT_PROG') ;

4 子查询小结练习
4.1 写一个查询显示与 Zlotkey 在同一部门的雇员的 last name
和 hire date,结果中不包括 Zlotkey。

select em.last_name,em.hire_date from employees em where em.department_id = (
select e.department_id from employees e where e.last_name = 'Zlotkey');

4.2 创建一个查询显示所有其薪水高于平均薪水的雇员的雇员号和名字。按薪水的升序排序。

select em.employee_id,em.last_name from employees em where em.salary > (
select avg(salary) from employees) order by em.salary;

4.3 写一个查询显示所有工作在有任一雇员的名字中包含一个 u的部门的雇员的雇员号和名字。

select e.employee_id,e.last_name from employees e where e.department_id in(
select em.department_id from employees em where em.last_name like '%u%');

4.4 显示所有部门地点号 (department location ID ) 是 1700的雇员的 last name、department number 和 job ID。

select em.last_name,em.department_id,em.job_id from employees em where em.department_id in(
select d.department_id from departments d where d.location_id = 1700);

4.5 显示每个向 King 报告的雇员的名字和薪水。

select e.last_name,e.salary from employees e where e.manager_id in(
select em.employee_id from employees em where em.last_name = 'King');

4.6 显 示 在 Executive 部 门 的 每 个 雇 员 的 department number、last name 和 job ID。

select em.department_id,em.last_name,em.job_id from employees em where em.department_id = (
select d.department_id from departments d where d.department_name ='Executive');

4.7 查询显示所有收入高于平均薪水并且工作在有任一雇员的名字中带有一个 u 的部门的雇员的 employee numbers、last、names 和 salaries。

select emp.employee_id,emp.last_name,emp.salary from employees emp where emp.salary > (
select avg(salary) from employees) and emp.department_id in(
select em.department_id from employees em where em.last_name like '%u%');

SQL学习之子查询,基于Oracle下的HR用户(四)相关推荐

  1. SQL学习之数据操作,基于Oracle下的HR用户(五)

    操纵数据(DML) 数据操纵语言:当添加.更新或者删除数据库中的数据时需要使用 DML 语句.DML依据的一个集合构成了一个被称为事务的逻辑单元. 当完成下面操作时,DML 语句被执行: – 添加新行 ...

  2. SQL语言之子查询(Oracle)

    子查询(内查询) 一个select语句嵌套在另一个select语句中的子句: 例 可以用组合两个查询的方法解决这个问题,放置一个查询到另一个查询中.内查询或子查询返回一个值给外查询或主查询.使用一个子 ...

  3. SQL进阶,子查询与窗口函数

    本节给大家讲解SQL在实际过程中用途比较多的子查询与窗口函数,下面一起学习. 示例工具:MySQL8.0.Navicat Premium 12 本文讲解内容:子查询与窗口函数 适用范围:SQL进阶应用 ...

  4. 【赵强老师】SQL中的子查询

    ​先看视频,视频全长73分钟,相信对大家有帮助. [赵强老师]SQL中的子查询 这里主要向大家介绍了Oracle数据库之Oracle子查询之简单子查询,通过具体的内容向大家展现,希望对大家学习Orac ...

  5. mysql学习day05—子查询 / CASH语句 / 连接查询

    子查询 单行子查询:返回单行单列 多列子查询:返回单行多列(使用成对比较) 多行子查询:返回多行单列 相关子查询:子查询使用了外部SQL的某些表或列(但是外部SQL不可使用子查询中的表和列) 嵌套子查 ...

  6. SQL之EXISTS子查询和IF条件查询

    不积跬步,无以至千里. " 今天给大家分享的是SQL的EXISTS子查询和IF条件查询语句. EXISTS EXISTS子查询 EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际 ...

  7. sql 执行顺序-子查询

    如何正确理解SQL关联子查询 一.基本逻辑 对于外部查询返回的每一行数据,内部查询都要执行一次.在关联子查询中是信息流是双向的.外部查询的每行数据传递一个值给子查询,然后子查询为每一行数据执行一次并返 ...

  8. oracle下导出某用户表的方法

    scott/tiger是用户名和密码,handson是导出的实例名 ²按用户方式导出数据(owner当中写的是用户名) expscott/tiger@handsonfile=scott_backown ...

  9. Oracle学习:子查询 (sql 嵌套 sql)

    查询比 SCOTT 工资高的员工信息 (1)查找 SCOTT 的工资 select sal from emp where ename='SCOTT'; // 结果:3000 (2)将上一步得到的结果作 ...

最新文章

  1. 巧用WINDOWS脚本语言删除临时文件
  2. 学习AI可能不需要那么多数学知识:20小时进阶计划
  3. 可视化Linux性能监控
  4. 天啊,为什么我的 Redis 变慢了。。
  5. 如何用javascript获取文本框,下拉框,单选框的对应值或者将值赋给它们?雪原虎 发布于:2007-10-22 00:32
  6. 【NLP】BERT蒸馏完全指南|原理/技巧/代码
  7. matlab保存并关闭excel文件夹,[转载]Matlab批量操作目标文件夹下的Excel文件
  8. Makefile学习(一)[第二版]
  9. 软件测试人员的三重境界
  10. JavaScript前端俄罗斯方块小游戏
  11. 求救数据库高手~~急急。。。
  12. 【转】Request.Form.Get() Request.Form Request[]区别
  13. 【推荐系统】16篇最新推荐系统论文送你
  14. js实现动态数字时钟
  15. JS红宝书学习记录(一)
  16. 开源无线管理软件_开源无线电系统向育空地区及其他地区提供紧急警报和音乐
  17. HTC Vive Unity 教程
  18. ONF完成业界首个基于SDN的无线传输PoC
  19. cdr轮廓字怎么把轮廓拆出来_用corelDraw怎么把文字做成轮廓?
  20. Latex学习笔记(五)——Latex模板学习总结

热门文章

  1. winSCP安装教程
  2. 象棋人工智能算法的C++实现(一)
  3. nginx nginx.conf 介绍
  4. 乌镇现场 | 微软沈向洋:机器可以有情感和情商 都可以写诗了
  5. c语言之printf函数输出字符数据
  6. RESTful风格-走进RESTful
  7. linux 16.04系统下载,Ubuntu下载 Ubuntu 16.04 LTS 官方正式版 64位 下载-脚本之家
  8. 人是变聪明了,还是变笨了
  9. 高加水箱液位控制系统+MATLAB仿真
  10. ButterKnife黄油刀