MySQL_子查询

子查询的介绍

在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句称之为子查询语句,外部那个select语句则称为主查询.

主查询可子查询的关系:

1.子查询是嵌入到主查询中
2.子查询是辅助主查询的,要么充当条件,要么充当数据
3.子查询是可以独立存在的语句,是一条完整的select语句

子查询的使用

例1.查询大于平均年龄的学生

select * from student where age > (select avg(age) from students);

例2.查询学生所在班的所有班级名字

select name from classes where id in (select cls_id from students where cls_id is not null);

例3.查找年龄最大,身高最高的学生

select * from student where (age,height) = (select max(age),max(height) from students);

-----------小结-------------

子查询是一个完整的SQL语句,子查询被嵌入到一对小括号里面

### 关于 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、付费专栏及课程。

余额充值