SQL子查询介绍

# 子查询介绍

```
**什么是子查询**

​		**在一个查询中还包含另一个嵌套查询,称为子查询,子查询可以出现在任意的位置,包括 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
```

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值