SQL子查询
SELECT VERSION();
#09-章子查询
#需求:谁的工资比abel的高?
#方式一:
SELECT salary
FROM employees
WHERE last_name = 'Abel';
SELECT last_name,salary
FROM employees
WHERE salary > 11000;
# 方式二 ;自连接
SELECT e2.last_name,e2.salary
FROM employees e1,employees e2
WHERE e1.`salary` < e2.`salary`
AND e1.`last_name` = 'Abel';
#方式三: 子查询
SELECT last_name,salary
FROM employees
WHERE salary > (
SELECT salary
FROM employees
WHERE last_name = 'Abel'
);
#2.称谓的规范:外查询(主查询)、内查询(子查询)
#- 子查询要包含在括号内
#- 将子查询放在比较条件的右侧
#- 单行操作符对应单行子查询,多行操作符对应多行子查询
/**
3.子查询的分类:
角度一:从内查询返回的结果的条目数
单行子查询 vs 多行子查询
角度二:
内查询是否被多次执行
相关子查询 vs 不相关子查询
*/
#单行子查询
# 单行子查询的操作符号; = != > >= < <=
#题目: 查询工资打鱼149号员工工资的员工信息
SELECT last_name
FROM employees
WHERE salary > (SELECT salary FROM employees WHERE employee_id = 149);
#题目:返回job_id与141号员工相同,salary比143号员工多的员工姓名,job_id和工资*
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);
#题目: 返回 公司工资最少的last_name,job_id,和salary
SELECT last_name,job_id,salary
FROM employees
WHERE salary = (
SELECT MIN(salary)
FROM employees
);
#**题目:查询与141号或174号员工的manager_id和department_id相同
#的其他员工的employee_id,manager_id,department_id**
SELECT employee_id,manager_id,department_id
FROM employees
WHERE manager_id = (
SELECT manager_id
FROM employees
WHERE employee_id = 141
)
AND department_id = (
SELECT department_id
FROM employees
WHERE employee_id = 141
)
AND employee_id <> 141;
#*题目:查询最低工资大于50号部门最低工资的部门id和其最低工资*
SELECT department_id,MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary) > (SELECT MIN(salary) FROM employees WHERE department_id = 110 );
/*
题目:显式员工的employee_id,last_name和location。
其中,若员工department_id与location_id为1800的department_id相同,
则location为’Canada’,其余则为’USA’
*/
SELECT employee_id,last_name,
(CASE department_id = (SELECT department_id FROM employees WHERE location_id = 1800) THEN 'Canada'
ELSE 'USA' END) "location"
FROM employees;
#子查询中的空值问题 不会报错,只会没有结果
SELECT last_name, job_id
FROM employees
WHERE job_id =
(SELECT job_id
FROM employees
WHERE last_name = 'Haas');
#4.3非法的使用子查询 error:Subquery returns more than 1 row
SELECT employee_id, last_name
FROM employees
WHERE salary =
(SELECT MIN(salary)
FROM employees
GROUP BY department_id);
#多行子查询
#in
SELECT employee_id, last_name
FROM employees
WHERE salary IN
(SELECT MIN(salary)
FROM employees
GROUP BY department_id);
#any/ all;
#题目: 返回其他job_id 比job_id 为“it_prog”部门任意工资低的员工的员工号
#姓名、jbo_id、以及salary
SELECT last_name,jbo_id,salary ,employees
FROM employees
WHERE job_id <>'IT_PROG'
AND salary < ANY(SELECT salary
FROM employees
WHERE job_id = 'IT_PROG');
#查询 平均工资最低的部门id mysql中聚合函数不能嵌套
SELECT MIN(avg_sal)
FROM (SELECT department_id,AVG(salary) AS avg_sal
FROM employees
GROUP BY department_id) t_dept_avg_sql;
#查询平均工资最低的部门id**
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary ) =(
SELECT MIN(avg_sal)
FROM (SELECT department_id,AVG(salary) AS avg_sal
FROM employees
GROUP BY department_id) t_dept_avg_sql
);
#多行子查询的空值问题
#相关子查询的
#1题目:查询员工中工资大于本部门平均
#工资的
#员工的last_name,salary和其department_id**
SELECT last_name,salary,department_id
FROM employees e1
WHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id = e1.`department_id`);
#方拾贰 把查询的结果当为一个表来使用
SELECT e.last_name,e.salary,e.department_id
FROM employees e,(
SELECT department_id,AVG(salary) avg_sal
FROM employees
GROUP BY department_id ) avg_sal_t
WHERE e.`department_id` = avg_sal_t.department_id
AND e.`salary` > avg_sal_t.avg_sal;
#题目:查询员工的id,salary,按照department_name 排序**
SELECT employee_id,salary
FROM employees e
ORDER BY (
SELECT department_name
FROM departments d
WHERE e.`department_id` = d.`department_id`
)ASC;
#结论:
/**
select -------(存在聚合函数)
from (left right) join ---
on ----
where --- (不存在聚合函数的过滤条件)
group by -------排序条件
having-----(含有聚合函数的过滤条件)
order by 排序
limit=------
*/
/*
**题目:若employees表中employee_id
与job_history表中employee_id相同的数目
不小于2,输出这些相同id的员工
的employee_id,last_name和其job_id**
*/
SELECT * FROM job_history;
SELECT employee_id,last_name,job_id
FROM employees e
WHERE 2 < = (
SELECT COUNT(*)
FROM job_history j
WHERE e.`employee_id` = j.`employee_id`
);
#6.2 exists, not exists 关键字的使用
#题目: 查询公司管理者的employee_id,last_name,department_id
#的信息,
#方式一: 自连接
SELECT DISTINCT mgr.employee_id,mgr.last_name,mgr.department_id
FROM employees e1 ,employees mgr
WHERE e1.`employee_id` = mgr.`employee_id`;
#方式二:子查询
SELECT employee_id,last_name,department_id
FROM employees
WHERE employee_id IN(
SELECT DISTINCT manager_id
FROM employees);
#方式三:使用exists
SELECT employee_id,last_name,department_id
FROM employees e1
WHERE EXISTS (
SELECT *
FROM employees e2
WHERE e1.`employee_id` = e2.`employee_id`
);
#**题目:查询departments表中,不存在于employees表中的部门的department_id和department_name**
#方式一:
SELECT d.department_id,d.department_name
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL;
#方式二:
SELECT department_id,department_name
FROM departments d
WHERE NOT EXISTS(
SELECT DISTINCT manager_id FROM employees e
WHERE d.`department_id` = e.`department_id`);
本文来自博客园,作者:wiselee/,转载请注明原文链接:https://www.cnblogs.com/wiseleer/articles/15894404.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!