【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 = '张三'
);

image

6.非法使用子查询

子查询查出了每个部门的最低工资,为多行数据

SELECT employee_id,last_name
FROM employees
WHERE salary = (
	SELECT MIN(salary)
	FROM employees
	GROUP BY department_id
);
posted @ 2022-08-19 09:09  植树chen  阅读(125)  评论(0编辑  收藏  举报