* 含义:**出现在其他语句中的select语句,称为子查询或内查询;外部的查询语句,称为主查询或外查询**
* 嵌套在其他语句内部的select语句成为子查询或内查询
* 外面的语句可以是insert、update、delete、select等,一般select作为外面语句较多
* 外面如果为select语句,则此语句称为外查询或主查询
* 分类:
* 按子查询出现的位置:
* select后面:仅仅支持标量子查询
* from后面:支持表子查询
* where或having后面:支持标量子查询,列子查询,行子查询(较少)
* exists后面(相关子查询):支持表子查询
* 按功能、结果集的行列数不同:
* 标量子查询(结果集只有一行一列)
* 列子查询(结果集只有一列多行)
* 行子查询(结果集有一行多列)
* 表子查询(结果集一般为多行多列)
#### where或having后面
* 标量子查询(单行子查询)
* 列子查询(多行子查询)
* 行子查询(多列多行)
* 特点:
* 子查询放在小括号内
* 子查询一般放在条件的右侧,where,having
* 标量子查询,一般搭配着单行操作符使用(> = )
* 列子查询,一般搭配着多行操作符使用(IN、ANY/SOME、ALL)
* 子查询的执行优选与主查询执行,主查询的条件用到了子查询的结果
##### 标量子查询
* 案例1:查询Ernst的工资
```sql
SELECT salary from gin_employees
WHERE last_name = 'Ernst';
```
<br>
* 案例2:查询大于Ernst的工资的员工信息
```sql
SELECT * FROM gin_employees
WHERE salary > (
select salary from gin_employees
WHERE last_name = 'Ernst'
);
```
<br>
* 案例3:
```sql
--查询140号员工的job_id
SELECT job_id
from gin_employees
WHERE employee_id = 140;
-- 查询171号员工的salary
SELECT salary from gin_employees
WHERE employee_id = 171;
-- 查询员工的姓名,job_id 和工资 要求job_id = 案例1 并且 salary>案例2
SELECT last_name,job_id,salary
from gin_employees
WHERE job_id = (
SELECT job_id
from gin_employees
WHERE employee_id = 140
) and salary > (
SELECT salary from gin_employees
WHERE employee_id = 171
);
```
<br>
* 案例4:返回公司工资最少的last_name,job_id,和salary
```sql
-- ① 查询公司最低工资
SELECT min(salary) from gin_employees;
-- ② 查询last_name,job_id,salary 要求salary = ①
SELECT last_name,job_id,salary
from gin_employees
WHERE salary = (
SELECT
min( salary )
FROM
gin_employees
);
```