概念:出现在其他语句内部的SELECT 语句,可以理解为嵌套在一个查询语句中的另外一个SELECT的查询语句。
外部查询语句称为主查询或者外查询。
分类:按照子查询出现的位置:select 后面,FROM 后面支持表子查询。
WHERE 或HAVING 后面 支持标量子查询,列子查询和行子查询。
按照结果集的行列数不同:
标量子查询,结果集只有一行一列 列子查询;结果集只有一列多行
行子查询:结果集有一行多列 表子查询:结果集一般为多行多列。
特点:1.子查询放在小括号内。子查询一般放在条件右侧 。标量子查询,一般搭配着单行操作符使用。
列子查询搭配多行操作符使用。、
标量子查询案例
case 1 谁的工资比 Abel 高
#1.首先查abel的工资
SELECT salary
FROM employees
WHERE last_name = "Abel"
#思考查询一个部门当中工资大于某个数比如11000的员工信息
SELECT *
FROM employees
WHERE salary > 11000
#将11000替换为查询的abel的工资数就是子查询,放在括号里面
SELECT *
FROM employees
WHERE salary > (SELECT salary
FROM employees
WHERE last_name = "Abel")
case 2 插叙一个公司里面部门编号与323相同,工资薪水大于编号122的所有员工信息
#思考,分为三步走,先查询与323相同的部门编号,在查询122员工工资,然后再做筛选
#1。it部门员工信息
SELECT job_id
FROM departments
WHERE job_id = 323;
#2.查询122员工的工资
SELECT salary
FROM departments
WHERE employee_id = 122;
#3.将前面两个进行合并到这里
SELECT *
FROM departments
WHERE job_id = (
SELECT job_id
FROM departments
WHERE job_id = 323
)AND salary > (
SELECT salary
FROM departments
WHERE employee_id = 122
);
3.,查询公司工资最少员工的姓名,工作编号和薪水
#1.查询公司里面的最少工资
SELECT MIN(salary) FROM employees;
#2.y要求工资等于1
SELECT last_name,job_id,salary
FROM employees
WHERE salary = (
SELECT MIN(salary) FROM employees
);
#注意一个完整的查询语句只会出现一个分号
case 4 查询最低工资大于50号部门最低工资的部门id和其最低工资
#1.思考,查询50号部门的最低工资
SELECT MIN(salary)
FROM employees
WHERE department_id = 50;
#2.前面加上的是限定条件,现在需要加的是查询每个部门id和最低工资
SELECT MIN(salary)
FROM employeers
GROUP BY department_id;
#接着在查询的信息后面加上你想要加的限定条件
SELECT MIN(salary)
FROM employeers
GROUP BY department_id
HAVING min(salary)> (SELECT MIN(salary)
FROM employeers
GROUP BY department_id);
可以理解为子查询就是查询出一个限定条件,我们暂时不知道的或者我们懒得查询就直接用子查询限定一下数据就可以,比如在某一个区间的值,但是这个区间值我们自己去找很难找出来,就可以用两个标量子查询去限定。