【MySQL】单行子查询
1.子查询编写技巧
(1)从里往外写
(2)从外往里写
比较操作符:=、>、>=、<、<=、<>
2.子查询示例
(1)查询工资大于149号员工工资的员工的信息。
先查出149号员工工资,再比较
SELECT employee_id,last_name,salary
FROM employees
WHERE salary > (
SELECT salary
FROM employees
WHERE employee_id = 149
);
(2)返回job_id与141号员工相同,salary比143号员工多的员工姓名、job_id和工资。
分别查出141号员工的job_id,143号员工的salary,再进行比较
SELECT last_name,job_id,salary
FROM employees
WHERE job_id = (
SELECT job_id
FROM employees
WHERE employee_id = 141
)
AND salary > (
SELECT salary
FROM employees
WHERE employee_id = 143
);
(3)返回公司工资最少的员工的last_name,job_id和salary。
SELECT last_name,job_id,salary
FROM employees
WHERE salary = (
SELECT MIN(salary)
FROM employees
);
(4)查询与141号员工或174号员工的manager_id和department_id相同的其他员工的employee_id,manager_id,department_id。
方式一:不成对比较
先分别查141、174员工的manager_id和department_id,再比较,并排除掉这两个员工
SELECT employee_id,manager_id,department_id
FROM employees
WHERE manager_id IN (
SELECT manager_id
FROM employees
WHERE employee_id IN (141,174)
)
AND department_id IN (
SELECT department_id
FROM employees
WHERE employee_id = (141,174)
)
AND employee_id NOT IN (141,174);
方式二:成对比较
SELECT employee_id,manager_id,department_id
FROM employees
WHERE (manager_id,department_id) IN (
SELECT manager_id,department_id
FROM employees
WHERE employee_id IN (141,174)
)
AND employee_id NOT IN (141,174);
(5)查询最低工资大于50号部门最低工资的部门id和其最低工资
SELECT department_id,MIN(salary)
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id
HAVING MIN(salary) > (
SELECT MIN(salary)
FROM employees
WHERE department_id = 50
);
4.CASE中的子查询
(1)显式员工的employee_id,last_name和location。其中,若员工department_id与location_id为1800的department_id相同,则location为’Canada’,其余则为’USA’。
SELECT employee_id,last_name,
(CASE department_id
WHEN (SELECT department_id
FROM departments
WHERE location_id = 1800)
THEN 'Canada'
ELSE 'USA'
END) AS "location"
FROM
employees
5.子查询中的空值问题
子查询中返回空,则结果也为空
SELECT last_name,job_id
FROM employees
WHERE job_id = (
SELECT job_id
FROM employees
WHERE last_name = '张三'
);
6.非法使用子查询
子查询查出了每个部门的最低工资,为多行数据
SELECT employee_id,last_name
FROM employees
WHERE salary = (
SELECT MIN(salary)
FROM employees
GROUP BY department_id
);