MySQL数据库:第九章:子查询
2023-06-13 09:13:26 时间
回退至Mysql数据库理论与实战 #子查询
概念:出现在其他语句内部的select语句,称为子查询或内查询 其他语法:可以是select语句,也可以是create、insert、update等。只是select语句出现的较多 外面如果是select语句,称为主查询或外查询 位置: 子查询可以放在select语句中的select后面、from后面、where或having后面、exists后面 分类:(放在where或having后面) 单行子查询:子查询的结果只有一行 多行子查询:子查询的结果可以有多行 特点: ①子查询一般需要使用小括号括起来,为了提高阅读性 ②子查询一般放在条件的右侧 ③子查询优先于主查询执行,主查询使用到了子查询的结果 ④单行子查询一般搭配单行操作符使用 单行操作符:> < = <> >= <= 多行子查询一般搭配多行操作符使用 多行操作符:in/not in、any、all
#一、单行子查询
注意: 单行子查询的结果肯定是一行一列,不能是多行,也不能是空值
#案例1:谁的工资比 Abel 高?
#①查询Abel的工资
SELECT salary
FROM employees
WHERE last_name = 'Abel'
#②查询哪个员工的工资>①
SELECT last_name,salary
FROM employees
WHERE salary>(
SELECT salary
FROM employees
WHERE last_name = 'Abel'
);
#案例2:返回job_id与141号员工相同,salary比143号员工多的员工姓名,job_id 和工资
#①查询141号员工的job_id
SELECT job_id
FROM employees
WHERE employee_id = 141
#②查询143号员工的salary
SELECT salary
FROM employees
WHERE employee_id = 143
#③查询job_id = ① 并且salary>②的员工姓名,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
);
#案例3:返回公司工资最少的员工的last_name,job_id和salary
#①查询最低工资
SELECT MIN(salary)
FROM employees
#②查询last_name,job_id,salary,要求salary= ①
SELECT last_name,job_id,salary
FROM employees
WHERE salary = (
SELECT MIN(salary)
FROM employees
);
SELECT * FROM employees;
#案例4:查询最低工资大于50号部门最低工资的部门id和其最低工资
#①查询50号部门的最低工资
SELECT MIN(salary)
FROM employees
WHERE department_id = 50
#②查询每个部门的最低工资,筛选条件:哪个部门最低工资>①
SELECT MIN(salary) 最低工资,department_id
FROM employees
GROUP BY department_id
HAVING 最低工资>(
SELECT MIN(salary)
FROM employees
WHERE department_id = 50
);
#二、多行子查询
in/not in:判断某个字段是否属于子查询结果的某个值 any/some:一般搭配条件运算符使用 【用的较少】 where sal>any(1,2,3,4) 0.5 all: 一般搭配条件运算符使用 【用的较少】 where sal > all(1,2,3,4) 4.5
#题目:返回location_id是1400或1700的部门中的所有员工姓名
#①查询location_id是1400或1700的部门
SELECT DISTINCT department_id
FROM departments
WHERE location_id IN (1400,1700)
#②查询员工姓名,要求:department_id 属于①列表
SELECT last_name
FROM employees
WHERE department_id IN(
SELECT DISTINCT department_id
FROM departments
WHERE location_id IN (1400,1700)
);
#题目:返回其它部门中比job_id为‘IT_PROG’部门任一工资低的员工的员工号、姓名、job_id 以及salary
#①查询job_id为‘IT_PROG’部门的工资
SELECT DISTINCT salary
FROM employees
WHERE job_id = 'IT_PROG'
#②查询其它部门中salary<any(①)
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary<ANY(
SELECT DISTINCT salary
FROM employees
WHERE job_id = 'IT_PROG'
) AND job_id<>'IT_PROG';
#题目:返回其它部门中比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';
#等价于
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';
#1. 查询和 Zlotkey 相同部门的员工姓名和工资
#①查询Zlotkey的部门
SELECT department_id
FROM employees
WHERE last_name = 'Zlotkey'
#②查询姓名和工资,要求部门号 = ①
SELECT last_name,salary
FROM employees
WHERE department_id = (
SELECT department_id
FROM employees
WHERE last_name = 'Zlotkey'
);
#2. 查询工资比公司平均工资高的员工的员工号,姓名和工资。
#①公司平均工资
SELECT AVG(salary)
FROM employees
#②查询salary>①的员工号,姓名和工资。
SELECT employee_id,last_name,salary
FROM employees
WHERE salary>(
SELECT AVG(salary)
FROM employees
);
#3. 查询各部门中工资比本部门平均工资高的员工的员工号, 姓名和工资
#①查询各部门的平均工资
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id
#②将①结果集和employees表进行连接查询,关联条件为老个表的department_id一致
SELECT employee_id,last_name,salary,e.department_id
FROM employees e
JOIN (
SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id
) ag_dep
ON e.department_id = ag_dep.department_id
WHERE e.salary > ag_dep.ag;
#6. 查询管理者是 King 的员工姓名和工资
#①查询king的员工号
SELECT 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'
);
相关文章
- MySQL考试:检验你的数据库知识(mysql试题)
- 实现多表查询MySQL单表查询实现跨表联查(mysql单表查询)
- MySQL搜索引擎:快速、高效的查询体验(mysql搜索引擎)
- 数据MySQL查询:探究最近一周数据(mysql查询最近一周)
- 表联查MySQL 数据库的两表联查实现(mysql两个)
- 连接MySQL数据库解锁IP连接之道(mysql数据库ip)
- MySQL 5.6 安装指南(mysql下载5.6)
- MySQL 配置表主键:简易操作指南(mysql设置表主键)
- 快速高效,轻松搞定!教你如何进行MySQL批量替换(mysql批量替换)
- MySQL数据库中的列拆分技术简介(mysql列拆分)
- MySQL分区:实现高效数据存储(mysql分区的作用)
- MySQL跨数据库融合:实现迅速而轻松的数据同步(mysql 跨数据库同步)
- 如何快速安全地删除MySQL数据库(删除 mysql 数据库)
- 妙用MySQL:快速优化数据库性能(优化mysql数据库方法)
- MySQL新发现:开启数据库创新之旅(mysql本周)
- MySQL数据库如何存储图片详解MySQL存储图片的方法(mysql中储存图片)
- MySQL的位索引技术研究(bit 索引 mysql)
- Bat工具轻松打开MySQL数据库(bat手动打开mysql)
- 安装宝塔,一键Apt安装MySQL服务器(apt安装宝塔mysql)
- 用CMD管理MySQL数据库(cmd怎么弄mysql)
- MySQL安装在哪里25字MySQL安装目录(mysql一般安装位置)
- 了解MySQL的不唯一索引使用(mysql 不唯一索引)
- MySQL计算两条数据之差(mysql 两条数据差值)
- MYSQL无法保存表情符号(mysql 不能保存表情)