多行子查询返回的也是多行

比较操作符

  • 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 是一个布尔类型,称为是否存在的查询。