# 子查询介绍
```
**什么是子查询**
**在一个查询中还包含另一个嵌套查询,称为子查询,子查询可以出现在任意的位置,包括 select ,from where 等**
```
## **语法**
- ```
**SELECT [DISTINCT] * [列1 别名1...],子查询**
**FROM 表明1 别名1...,子查询**
**[WHERE 条件**
**SELECT [DISTINCT] * [列1 别名1...],子查询**
**FROM 表明1 别名1...,子查询**
**[WHERE 条件]**
**[GROUP BY 分组的条件[HAVING 条件]]**
**[ORDER BY 排序字段1[ASC|DESC],排序字段2[ASC|DESC]]**
**]**
**[GROUP BY 分组的条件[HAVING 条件]]**
**[ORDER BY 排序字段1[ASC|DESC],排序字段2[ASC|DESC]]**
```
## 例子
- ```
- **--取出7521的工资**
**select sal from emp where empno=7521;**
**--根据以上的结果,查出相关内容**
**select * from emp where**
**sal=(select sal from emp where empno=7521);**
**--要求查出工资比7654高,和7788从事同一个工作的员工的信息**
**--select sal from emp where empno=7654;**
**select * from emp where sal>(select sal from emp where empno=7654) AND JOB= (select job from emp where empno=7788);**
**--要求查询出工资最低的员工的姓名,工资,工作**
**select min(sal) from emp;**
**select ename,sal,job from emp where sal=(select min(sal) from emp);**
```
**--要求查询出部门中的员工数量高于各部门的平均人数的部门编号和员工数量**
```
**--各部门人数**
**select count(*) from emp group by deptno
--平均人数
select avg(count(deptno)) from emp group by deptno;
--语句总和
select count(*),deptno from emp group by deptno having**
**count(*)>(select avg(count(*)) from emp group by deptno);**
```
```
**--要求查询出部门编号,名称,员工数量,平均工资**
**select deptno,dname from dept;**
**select deptno,count(*) from emp group by deptno;**
**select avg(sal) from emp;**
**select deptno,count(*),avg(sal)**
**from emp group by deptno;**
**语句总和**
**SELECT D.DEPTNO, D.DNAME, ED.C, ED.A**
**FROM DEPT D,**
**(SELECT DEPTNO, COUNT(EMPNO) C, AVG(SAL) A FROM EMP GROUP BY DEPTNO) ED**
**WHERE D.DEPTNO = ED.DEPTNO;**
```
# 多行子查询
```
单行子查询是返回一条记录,如果使用单行操作符,而子查询返回的记录是多条就会报错(单行子查询返回多个行) 所以如果遇到多行信息进行联合的时候必须使用关键字 IN在 ANY任何 ALL全部
```
```
IN 操作符:在一个指定的范围内取值.
select * from emp where empno IN (select mgr from emp)
例子:
--求出内个部门的最低员工的信息
select avg(sal) from emp group by deptno;
select * from emp where sal in(select min(sal) from emp group by deptno);
```
```
ANY:操作符(区间内操作符)
ANY操作符要与查询结果中的每一个内容进行匹配,使用的时候有三种形式
.=ANY:与IN使用相同
select * from emp where sal =ANY(select min(sal) from emp group by deptno);
.>ANY:比子查询结果中返回的任意的一个结果大即可,及大于返回结果的最小值
select * from emp where sal >ANY(select min(sal) from emp group by deptno);
.<ANY:比子查询结果中返回的任意一个结果小,及小于返回结果的最大值
select * from emp where sal <ANY(select min(sal) from emp group by deptno);
```
```
ALL:操作符(区间外操作符)
.<ALL:比子查询返回的所有的结果都小,及小于返回结果的最小值
select * from emp where sal <all(select min(sal) from emp group by deptno);
.>ALL:比子查询返回的所有的结果都大,及大于返回结果的最大值
select * from emp where sal >all(select min(sal) from emp group by deptno);
```
```
总结:子查询在开发或者面试的时候用的是最多的,子查询可以出现在任意位置
子查询可以分为:单行和多行
子查询提供了三种操作符号:IN ANY ALL
```
SQL子查询介绍
最新推荐文章于 2024-06-12 10:49:09 发布
本文介绍了SQL中的子查询概念,包括其语法结构,如嵌套在不同查询部分的用法,并通过实例展示单行和多行子查询,以及IN、ANY和ALL操作符的应用。
摘要由CSDN通过智能技术生成