子查询select,from,exists

本文详细介绍了SQL中子查询的使用,包括在select语句中、from子句后以及exists关键字后的应用。通过实例解析,帮助读者掌握如何在实际操作中运用这些子查询技术进行数据查询和分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

子查询select,from,exists

select

#
#案例 查询每个部门的员工个数
SELECT d.department_id,
	(
	SELECT COUNT(*)
	FROM employees e
	WHERE e.department_id=d.`department_id`
	) 个数
	
FROM departments d;

# 案例 查询员工号=102的部门名
SELECT department_name,employee_id
FROM departments d
JOIN employees e
ON e.`department_id`=d.`department_id`
WHERE employee_id=102;

SELECT (
	SELECT department_name
	FROM departments d
	INNER JOIN employees e
	ON e.`department_id`=d.`department_id`
	WHERE e.employee_id=102
) 部门名;
# select 后的子查询仅仅支持标量子查询,不支持多行子查询

from 后

#from后面子查询
#from后面跟的是 表,所以 from后面的子查询结果当做一个表
# 案例: 查询每个部门的平均工资的工资等级
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id;


SELECT j.`grade_level`,ag.*
FROM (SELECT AVG(salary) 工资,department_id
	FROM employees
	GROUP BY department_id) ag 
JOIN job_grades j
ON ag.工资 BETWEEN`lowest_sal`AND`highest_sal`;
#要求:from 子查询结果,当做一个表来使用,必须起别名

exists 后

#放在exists后面(相关子查询) EXISTS (是否存在)
/*
 语法
 exists (完整的查询语句)
 结果:  0或1
 类似java Boolean类型

*/

SELECT EXISTS (SELECT employee_id FROM employees);

#案例  查询有员工的部门名

SELECT department_name
FROM departments d
WHERE EXISTS 
	(SELECT employee_id
	FROM employees e
	WHERE d.`department_id`=e.`department_id`
	);

SELECT department_name
FROM departments d
JOIN employees e
ON e.`department_id`=d.`department_id`
GROUP BY department_name;

SELECT department_name
FROM departments d
WHERE d.`department_id` 
	IN (SELECT department_id
		FROM employees
	);
#案例  查询没有女朋友的男神信息

# in
SELECT bo.*
FROM boys bo
WHERE bo.id NOT IN 
(SELECT boyfriend_id
	FROM beauty)
;

#exists
SELECT bo.*
 FROM boys bo
 WHERE NOT EXISTS(
	SELECT boyfriend_id
	FROM beauty b
	WHERE bo.id=b.`boyfriend_id`
);

练习

#练习
#1.查询和Zlotkey相同部门的员工姓名和工资
SELECT last_name,salary
FROM employees
WHERE department_id=
	(SELECT department_id
	FROM employees
	WHERE last_name = 'Zlotkey'
	);

#2.查询工资比公司平均工资高的员工的员工号,姓名和工资。
SELECT employee_id,last_name,salary
FROM employees
WHERE salary > 
	(SELECT AVG(salary)
	FROM employees
	);
	
#3.查询各部门中工资比本部门平均工资高的员工的员工号,姓名和工资
SELECT employee_id,last_name,salary,e.department_id
FROM employees e
JOIN (SELECT AVG(salary) g , department_id
	FROM employees
	GROUP BY department_id
	) av
ON e.`department_id`=av.department_id
WHERE salary > av.g;

#4.耷询和姓名中包含字母u的员工在相同部门的员工的员工号和姓名
SELECT  DISTINCT department_id
FROM employees
WHERE last_name LIKE '%u%'
GROUP BY department_id;

SELECT employee_id,last_name
FROM employees e
JOIN (SELECT  DISTINCT department_id
	FROM employees
	WHERE last_name LIKE '%u%') dep
ON e.`department_id`=dep.department_id;
#-----------
SELECT employee_id,last_name
FROM employees 
WHERE department_id IN (SELECT  DISTINCT department_id
	FROM employees
	WHERE last_name LIKE '%u%');
#5.查询在部门的location id为1700的部门工作的员工的员工号
SELECT department_id
FROM  departments
WHERE location_id = 1700;
#-----------------
SELECT employee_id,e.department_id
FROM employees e
JOIN (SELECT department_id
	FROM  departments
	WHERE location_id = 1700) dep
ON e.`department_id`=dep.department_id;
#--------------
SELECT employee_id,e.department_id
FROM employees e
WHERE department_id IN (SELECT department_id
	FROM  departments
	WHERE location_id = 1700) ;
#----------
SELECT employee_id,e.department_id
FROM employees e
WHERE department_id =ANY (SELECT department_id
	FROM  departments
	WHERE location_id = 1700) ;	
	
#6.查询管理者是King的员工姓名和工资
 
SELECT last_name,employee_id
FROM employees
WHERE last_name = 'k_ing';

SELECT  last_name,salary
FROM employees
WHERE manager_id IN 
	(SELECT employee_id
	FROM employees
	WHERE last_name = 'k_ing');
	
#7. 查询工资最高的员 工的姓名,要求first_ name和last_ name显示为一列,列名为姓.名
SELECT  CONCAT(first_name,last_name) '姓.名'
FROM employees
WHERE salary=
	(SELECT MAX(salary)
	FROM employees);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值