多行子查询返回的也是多行
比较操作符
- IN/NOT IN 等于列表的任意一个
- ANY/SOME 和子查询返回的某一个值比较
- ALL 和子查询返回的所有值比较
体会any和ALL的区别
case1 列子查询,查询location_id 是1200和1400的部门中的所有员工姓名
#拿到题目先思考限定条件,我们需要查询的限定条件是location_id的区域。
#1.查询location_id 在1200-1400的部门id信息
SELECT DISTICT department_id
FROM departments
WHERE location_id IN(1200,1400);
#2.查询员工姓名。要求部门号是1列表的某一个
SELECT last_name
FROM employeers
WHERE department_id IN(
SELECT DISTICT department_id
FROM departments
WHERE location_id IN(1200,1400)
);
case 2 返回其他部门中比job_id为‘IT-PROG’部门任一工资低的员工的员工号、姓名、job_id以及salary
#1.思考限定条件为 job_id 为‘it -prog’部门员工工资
SELECT DISTICT salary
FROM employeers
WHERE job_id = ÍT-PROG;
#2.上面返回的是一个一列多行的列子查询,所以需要我们加上自己的内容。
SELECT employeer_id,last_name,job_id,salary
FROM employeers
WHERE salary < ANY(
SELECT salary
FROM employeers
WHERE job_id = ÍT-PROG;
) AND job_id <> 'IT-PROG';
3.行子查询
case 1 查询员工编号最小并且工资最高的员工信息
这个不是独有的查询方法,平时用的会比较少一点,一般都可以用列子查询替代,先看下列子查询怎么做这题
#1.先查询员工编号最小的员工编号是什么
SELECT MIN(job_id)
FROM employees;
#2.在查询工资最高的工资是多少
SELECT max(salary)
FROM employees;
#3.将这两个限定条件放在一起
SELECT *
FROM employeers
WHERE job_id =(
SELECT MIN(job_id)
FROM employees
) AND salary = (
SELECT max(salary)
FROM employees
):
其实也逻辑 也是十分清楚的,然后,用行查询就多一个特定的语句
#就直接将两个进行整合
SELECT *
FROM employees
WHERE (employee_id.salary) = (
SELECT miN(employee_id),MAX(job_id)
FROM employees
);
#在条件匹配的时候,要一一对应。
# 子查询还可以放在select后面
#查询每个部门的员工个数
#以前的做法是
SELECT department_id 部门,count(*) 员工个数
FROM employees e
INNER JOIN departments d
WHERE e.department_id = d.department_id
ORDER BY department_id ASC;
#现在的话,可以用select后面加的标量子查询进行查询,标量子查询返回的是一行一列的内容
SELECT d.*,(
SELECT count(*)
FROM employees e
WHERE e.department_id = d.department_id
);
#子查询还可以放在from 后面,作为一个子集查询
case 查询每个部门的平均工资的等级,相当于自己设计一个新的表作为一个子表与另外一个表进行比对,类似于非等值查询。
#思考,首先查询一下每个部门的平均工资
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id;
#查找一个关于等级的表,跟成绩分级差不多
假设其中有高工资和低工资的区分进行排等级。
SELECT ag_dep.*,j.grade_level
FROM (
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id
) ag_dep
INNER JOIN job_grades g
ON ag_dep.ag between lowest_sal AND highest_sal;
将子查询的结果充当成一个表,要求必须加别名
还可以放在EXISTS 后面
SELECT EXISTS(SELECT employees_id FROM employees WHERE salary = 120000)
EXIETS 是一个布尔类型,称为是否存在的查询。