10_MySQL DQL_子查询(嵌套的select)
#子查询
/*
含义:出现在其他语句中的select语句,称为子查询(内查询)
内部嵌套其他select语句的查询,称为主查询(外查询)
特点:
1、子查询都会放在小括号内
2、单行操作符:>, <, =
3、多行操作符: in, any/some, all
分类:
按子查询出现的位置:
select后面
子查询的结果集只能是一行一列
from后面
支持表子查询
where或having后面(筛选)------ 重点
标量子查询 -- 重点
列子查询 -- 重点
行子查询
exists后面(相关子查询)
表子查询
按结果集的行列数不同:
标量子查询(子查询的结果集只有一行一列)
列子查询(子查询的结果集只有一列多行)
行子查询(子查询的结果集有多行多列,主要为一行多列)
表子查询(子查询的结果集一般为多行多列)
*/
# 实例
SELECT first_name FROM employees
WHERE department_id IN (
SELECT department_id FROM departments
WHERE location_id = 1700
);
#一、where或having后面
# 1. 标量子查询(单行)
# 2、列子查询(多行)
# 3、行子查询(多行多列)
# 1. 标量子查询
# 案例1:谁的工资比abel高?
# 1) 查询Abel的工资
SELECT salary FROM employees
WHERE last_name = 'Abel'
# 2) 查询员工姓名和工资,满足 salary>上一步的结果
SELECT last_name, salary
FROM employees
WHERE
salary > (
SELECT salary FROM employees
WHERE last_name = 'Abel'
);
# 案例2:查询job_id和141号员工相同,salary比143号员工高的员工姓名,job_id,工资
# 1) 查询141号员工的job_id
SELECT job_id
FROM employees
WHERE employee_id = 141;
# 2)查询143号员工的salary
SELECT salary
FROM employees
WHERE employee_id = 143;
# 3)查询员工姓名,job_id, salary,job_id和1相同,salary比2高
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
);
# 案例3: 返回公司工资最少的员工的last_name, job_id, salary
# 1) 查询最小工资
SELECT MIN(salary)
FROM employees;
# 2) 查询工资=1的员工
SELECT last_name,job_id, salary
FROM employees
WHERE salary = (
SELECT MIN(salary)
FROM employees
);
# 案例4: 查询最低工资大于50号部门最低工资的部门id和最低工资
# 1)查询50号部门的最低工资
SELECT MIN(salary)
FROM employees
GROUP BY department_id
HAVING department_id = 50;
# 2) 根据部门分组,查询每个部门的最低工资,然后过滤出比1高的
SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary) > (
SELECT MIN(salary)
FROM employees
GROUP BY department_id
HAVING department_id = 50
);
# 2. where或having后的列子查询
/*
多行操作符:
1)in/not in, 值是子查询结果中的任意一个
2) any|some, 和子查询结果中的某一个比较
3)all, 和子查询结果中的所有值比较
*/
# 案例1:返回location_id是1400或1700的部门中的所有员工姓名
SELECT last_name, d.`location_id`
FROM employees AS e
LEFT JOIN departments AS d
ON e.`department_id` = d.`department_id`
WHERE d.`location_id` IN (1400,1700)
ORDER BY last_name;
# 1) 查询location_id为1400或1700的部门编号
SELECT department_id
FROM departments
WHERE location_id IN (1400,1700);
# 2)查询部门号是1中任意一个的员工的姓名
SELECT last_name
FROM employees
WHERE department_id IN (
SELECT DISTINCT department_id
FROM departments
WHERE location_id IN (1400,1700)
)
ORDER BY last_name;
# 案例2:返回其他部门中比job_id为IT_PROG的部门任一工资低的员工号和姓名
# 1)查询job_id为IT_PROG的部门的工资
SELECT DISTINCT salary
FROM employees
WHERE job_id = 'IT_PROG';
# 2)
SELECT employee_id, last_name
FROM employees
WHERE job_id != 'IT_PROG'
AND salary < ANY (
SELECT DISTINCT salary
FROM employees
WHERE job_id = 'IT_PROG'
);
# 3. where或having后的行子查询(结果集一行多列 或 多行多列)
# 案例:查询员工编号最小,并且工资最高的员工信息
# 1) 查询最大工资
SELECT MAX(salary)
FROM employees;
# 2) 查询最小员工编号
SELECT MIN(employee_id)
FROM employees;
# 3) 查询员工信息
SELECT *
FROM employees
WHERE employee_id = (
SELECT MIN(employee_id)
FROM employees
)
AND salary = (
SELECT MAX(salary)
FROM employees
);
# 三、from后的子查询
# 将子查询的结果集当做临时表
# 案例:查询每个部门的平均工资的工资等级
# 查询每个部门的平均工资
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id;
# 将1的结果集和job_grades连接,添加连接条件
SELECT avg_dept.*, g.`grade_level`
FROM (
SELECT AVG(salary) AS ag,department_id
FROM employees
GROUP BY department_id
) AS avg_dept
INNER JOIN job_grades AS g
ON avg_dept.ag BETWEEN g.`lowest_sal` AND g.`highest_sal`;
10_MySQL DQL_子查询(嵌套的select)的更多相关文章
- sql子查询 嵌套SELECT语句
嵌套SELECT语句也叫子查询,一个 SELECT 语句的查询结果能够作为另一个语句的输入值.子查询不但能够出现在Where子句中,也能够出现在from子句中,作为一个临时表使用,也能够出现在sele ...
- SQL子查询/嵌套查询
sql子查询 嵌套SELECT语句 嵌套SELECT语句也叫子查询,一个 SELECT 语句的查询结果能够作为另一个语句的输入值.子查询不但能够出现在Where子句中,也能够出现在from子句中,作为 ...
- sql中with的用法(CTE公用表表达式):应用子查询嵌套,提高sql性能
一.WITH AS的含义 WITH AS短语,也叫子查询部分(subquery factoring),定义一个SQL片断,该片断会被整个SQL语句所用到. 有时是为了让SQL语句的可读性更高些,也可能 ...
- Oracle 子查询(复杂select语句)
在执行数据操作时,如果某个操作需要依赖于另外一个 select语句的查询结果,那么就可以把 select 语句迁入到该操作语句中,这样就形成了一个子查询.实际应用中,表与表之间相互关联,相互依存,这样 ...
- 子查询四(在select子句中使用子查询)
示例一.查询出每个部门的编号,名称,位置,部门人数,平均工资 SELECT d.deptno,d.dname,d.loc, (SELECT COUNT(empno) FROM emp WHERE em ...
- Oracle子查询(嵌套查询)
概念: 所谓子查询,即一个select语句中嵌套了另外的一个或者多个select语句 需求:查找和Smith同部门的所有员工的id和last_name 目标: 员工id,last_name from: ...
- [SQL SERVER系列]之嵌套子查询和相关子查询
子查询有两种类型,一种是只返回一个单值的子查询,这时它可以用在一个单值可以使用的地方,这时子查询可以看作是一个拥有返回值的函数:另外一种是返回一列值的子查询,这时子查询可以看作是一个在内存中临时存在的 ...
- java数据库编程之嵌套子查询及exists的使用
第四章:高级查询(二) 4.1:exists和not exists子查询 4.1.1:exists子查询 用exists作为子查询的where条件 语法:select,,,,,,from 表名 w ...
- SQL Fundamentals: 子查询 || WHERE,HAVING,FROM,SELECT子句中使用子查询,WITH子句
SQL Fundamentals || Oracle SQL语言 子查询(基础) 1.认识子查询 2.WHERE子句中使用子查询 3.在HAVING子句中使用子查询 4.在FROM子句中使用子查询 5 ...
随机推荐
- 【BZOJ4196】[Noi2015]软件包管理器 树链剖分
[Noi2015]软件包管理器 树链剖分 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从 ...
- 移动端开发--rem和像素如何使用!
刚开始做移动端的开发的时候,大多时候是在使用 像素(PX)来写页面和布局的,但是使用下来,还是有多少不好用! 随之就开始用 rem 来写,rem写的结果是页面放到一些屏幕上,字体过小,如果页面渲染用了 ...
- springMVC 使用注解注入接口实现类
spring常用的注释: @Component:标准一个普通的spring Bean类. @Controller:标注一个控制器组件类. @Service:标注一个业务逻辑组件类. @Reposi ...
- SaltStack配置管理-jinja模板
上一篇:SaltStack配置管理-状态间关系 需求:需要apache配置文件里面监听的端口是每个minion本地的地址 saltstack默认的模板是jinjia模板 参考文档:http://doc ...
- hdu2196 Computer【树形DP】【换根法】
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- 焦作网络赛K-Transport Ship【dp】
There are NN different kinds of transport ships on the port. The i^{th}ith kind of ship can carry th ...
- 自旋锁原理及java自旋锁
一.自旋锁的概念 首先是一种锁,与互斥锁相似,基本作用是用于线程(进程)之间的同步.与普通锁不同的是,一个线程A在获得普通锁后,如果再有线程B试图获取锁,那么这个线程B将会挂起(阻塞):试想下,如果两 ...
- Swap---hdu2819(最大匹配)
题意:通过交换行或者列来实现对角线(左上角到右下角)上都是1, 首先,如果某行全是0或者某列全是0必然不满足情况输出-1,如果能转换的话,那么必然可以通过全由行(列)变换得到: 还有就是对角线上的N个 ...
- mysql 约束条件 auto_increment 自动增长目录
mysql 约束条件 auto_increment 自动增长 mysql 约束条件 auto_increment 自动增长起始值 布长 起始偏移量 mysql 约束条件 auto_increment ...
- LockSupport HotSpot里park/unpark的实现
每个java线程都有一个Parker实例,Parker类是这样定义的: class Parker : public os::PlatformParker { private: volatile int ...