MySQL之子查询

博客主要介绍数据库子查询相关知识。当查询需求复杂需多次查询时可用子查询,将复杂问题拆分。使用时用括号包裹,且in中的子查询只能含一列。还介绍了关键字exists,其后跟子查询,有结果时外层查询执行,无结果则不执行。

子查询

测试数据
create table emp (id int,name char(10),sex char,age int,dept_id int,job char(10),salary double);

insert into emp values
(1,"刘备","男",26,1,"总监",5800),
(2,"张飞","男",24,1,"员工",3000),
(3,"关羽","男",30,1,"员工",4000),
(4,"孙权","男",25,2,"总监",6000),
(5,"周瑜","男",22,2,"员工",5000),
(6,"小乔","女",31,2,"员工",4000),
(7,"曹操","男",19,3,"总监",10000),
(8,"司马懿","男",24,3,"员工",6000);

create table dept(id int primary key,name char(10));
insert into dept values(1,"市场"),(2,"行政"),(3,"财务");
1. 什么是子查询

​ 当一个查询是另一个查询的条件时,这个查询称之为子查询(内层查询)

​ 什么时候用?

​ 当查询需求比较复杂,一次性查询无法得到结果,需要多次查询时,

​ 例如:给出一个部门名称,需要获得该部门所有的员工信息

​ 分析:

​ 1.需要先确定部门的id

​ 2.然后才能通过id确定员工

​ 解决问题的方式是把一个复杂的问题拆分为若干个简单的问题

2. 如何使用?

首先明确子查询就是一个普通的查询,当一个查询需要作为子查询使用时,用括号包裹即可

3. 需要注意

​ in中的子查询只能包含一个列

​ 例如:查询财务部有哪些人

​ 正确的写法:select name from emp where dept_id in (select id from dept where name = "财务");

​ 错误的写法:select name from emp where dept_id in (select * from dept where name = "财务");

关键字:exists

exists后跟子查询,子查询有结果是为True,没有结果时为False。为True时外层执行,为False外层不执行

如何使用?

select from emp where exists (select from emp where salary > 1000);

前面 exists 后面
如果 后面 查询有结果时,前面 才会执行

转载于:https://www.cnblogs.com/plf-Jack/p/11189897.html

### 关于 MySQL子查询使用 #### 子查询概述 子查询是指一个查询语句嵌套在另一个查询语句内部的查询,这一特性自MySQL 4.1版本起被引入[^2]。通过这种方式,SQL 的 `SELECT` 查询能力得到了极大的增强,因为它允许基于先前计算的数据结果来获取更精确的结果集。 #### 子查询分类及其特点 存在两种主要类型的子查询:非相关子查询和相关子查询。前者指的是那些可以独立运行而不依赖外部查询上下文的子查询;后者则是指那些需要依据外部查询提供的特定行来进行处理的情况,在这种情况下,每当处理外部查询的新一行时,相关子查询也会相应地重新评估并执行一次[^3]。 #### 使用场景举例说明 ##### 非相关子查询实例 当希望找出工资高于公司平均薪资水平的所有员工姓名时: ```sql SELECT emp_name FROM employees WHERE salary > (SELECT AVG(salary) FROM employees); ``` 这段代码首先会计算整个公司的平均薪水作为内层查询的一部分,之后再利用该值去过滤出符合条件的具体人员名单。 ##### 相关子查询实例 假设有一个需求是要找到每个部门中工资最高的雇员名字,则可以通过如下方式实现: ```sql SELECT d.dept_name, e.emp_name, e.salary FROM departments AS d JOIN employees AS e ON d.dept_id = e.dept_id WHERE e.salary = ( SELECT MAX(e2.salary) FROM employees AS e2 WHERE e2.dept_id = d.dept_id -- 这里体现了关联条件的存在 ); ``` 这里的关键在于内层查询部分包含了对外部查询变量(`d.dept_id`)的应用,从而实现了针对每一个具体部门分别寻找最高薪者的目的[^1]。 #### 更新操作中的子查询应用 除了用于检索数据之外,子查询同样可以在修改现有记录的过程中发挥作用。比如要更新某些满足特定条件的商品价格至最新市场价,就可以这样写: ```sql UPDATE products p SET price = ( SELECT market_price FROM latest_prices lp WHERE lp.product_code = p.code ) WHERE EXISTS( SELECT * FROM latest_prices lpp WHERE lpp.product_code = p.code AND lpp.market_price IS NOT NULL ); ``` 上述例子展示了如何结合`EXISTS`关键字以及带有匹配逻辑的子查询完成复杂的业务变更任务[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值