ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL-sql99-子查询-列子查询、行子查询

2022-05-23 13:31:07  阅读:188  来源: 互联网

标签:salary employees 查询 job sql99 行子 id SELECT


列子查询(多行子查询)

image

案例:返回location_id是1400或1700的部门中所有员工姓名

# ①查询location_id是1400或1700的部门编号
SELECT `department_id`
FROM `departments`
WHERE `location_id` IN(1400,1700);

image

是1列多行

满足列子查询

# ②查询员工姓名,要求部门号是①列表中的某一个
SELECT `last_name`
FROM `employees`
WHERE `department_id` IN (
	SELECT `department_id`
	FROM `departments`
	WHERE `location_id` IN(1400,1700)
);

image

案例:返回其他工种中比job_id为'IT_PROG'工种任一工资低的员工的员工号、姓名、job_id以及salary

# ①查询job_id为'IT_PROG'部门任一工资
SELECT DISTINCT `salary`
FROM `employees`
WHERE `job_id`='IT_PROG';

# ②查询员工号、姓名、job_id以及salary salary<any(①)
SELECT `last_name`,`employee_id`,`job_id`,`salary`
FROM `employees`
WHERE `salary`<ANY(
	SELECT DISTINCT `salary`
	FROM `employees`
	WHERE `job_id`='IT_PROG')
AND job_id<>'IT_PROG';

image

也可以用max()来代替any()

# ①查询job_id为'IT_PROG'部门任一工资
SELECT DISTINCT `salary`
FROM `employees`
WHERE `job_id`='IT_PROG';

# ②查询员工号、姓名、job_id以及salary salary<any(①)
SELECT `last_name`,`employee_id`,`job_id`,`salary`
FROM `employees`
WHERE `salary`<(
	SELECT MAX(`salary`)
	FROM `employees`
	WHERE `job_id`='IT_PROG')
AND job_id<>'IT_PROG';

image

结果还是一样的

返回其它部门中比job_id为'IT_PROG'部门所有工资部低的员工的员工号、姓名、job_id 以及salary

#返回其它部门中比job_id为'IT_PROG'部门所有工资部低的员工的员工号、姓名、job_id 以及salary
#① 先查询job_id为'IT_PROG'部门的所有工资
SELECT DISTINCT `salary`
FROM `employees`
WHERE `job_id`='IT_PROG';

#② 查询员工的员工号、姓名、job_id 以及salary,并且工资比①中都低
SELECT `employee_id`,`last_name`,`job_id`,`salary`
FROM `employees`
WHERE salary <ALL(
	SELECT DISTINCT `salary`
	FROM `employees`
	WHERE `job_id`='IT_PROG'
) AND `job_id`<>'IT_PROG';


image

或者换成min(salary)

#① 先查询job_id为'IT_PROG'部门的所有工资
SELECT DISTINCT `salary`
FROM `employees`
WHERE `job_id`='IT_PROG';

#② 查询员工的员工号、姓名、job_id 以及salary,并且工资比①中都低
SELECT `employee_id`,`last_name`,`job_id`,`salary`
FROM `employees`
WHERE salary <(
	SELECT MIN(`salary`)
	FROM `employees`
	WHERE `job_id`='IT_PROG'
) AND `job_id`<>'IT_PROG';

同样的效果

其中第一个案例

案例:返回location_id是1400或1700的部门中所有员工姓名

# 案例:返回location_id是1400或1700的部门中所有员工姓名
SELECT `last_name`
FROM `employees`
WHERE `department_id` in (
	SELECT `department_id`
	FROM `departments`
	WHERE `location_id` IN(1400,1700)
);

代码是上面的 也可以用any代替in

# 案例:返回location_id是1400或1700的部门中所有员工姓名
SELECT `last_name`
FROM `employees`
WHERE `department_id` =ANY (
	SELECT `department_id`
	FROM `departments`
	WHERE `location_id` IN(1400,1700)
);

image

效果是一样的

行子查询(结果集一行多列或多行多列)

引入

案例:查询员工编号最小并且工资最高的员工信息

#①查询最小的员工编号
SELECT MIN(`employee_id`)
FROM `employees`;

#查询最高工资
SELECT MAX(`salary`)
FROM `employees`;

#查询员工信息
SELECT *
FROM `employees`
WHERE `employee_id`=(
	SELECT MIN(`employee_id`)
	FROM `employees`
)
AND `salary`=(
	SELECT MAX(`salary`)
	FROM `employees`
)

image

行子查询是有条件的 当筛选条件全部都是等于的情况时候 用行子查询

select *
from `employees`
where (`employee_id`,`salary`)=
(
select min(`employee_id`),max(`salary`)
from `employees`
);

image

标签:salary,employees,查询,job,sql99,行子,id,SELECT
来源: https://www.cnblogs.com/jgg54335/p/14964049.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有