【MySQL】一文带你了解MySQL中的子查询

这篇具有很好参考价值的文章主要介绍了【MySQL】一文带你了解MySQL中的子查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。




【MySQL】一文带你了解MySQL中的子查询

子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入

SQL 中子查询的使用大大增强了 SELECT 查询的能力,因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得出一个数据结果,然后与这个数据结果(可能是某个标量,也可能是某个
集合)进行比较。


1. 需求分析与问题解决


1. 1实际问题


谁的工资比 马云 高

方式1:原始方法

SELECT salary
FROM employees
WHERE last_name = '马云';

返回结果:马云的工资为 11000


那么我们查询出工资比 11000 高的即可。

SELECT last_name,salary
FROM employees
WHERE salary > 11000;

方式2:自连接

SELECT e2.last_name,e2.salary
FROM employees e1,employees e2
WHERE e1.last_name = '马云'
AND e1.`salary` < e2.`salary`

方式3:子查询

SELECT last_name,salary
FROM employees
WHERE salary > (
SELECT salary
FROM employees
WHERE last_name = '马云'
);

1.2 子查询的基本使用

  • 子查询的基本语法结构:
    【MySQL】一文带你了解MySQL中的子查询

  • 子查询(内查询)在主查询之前一次执行完成。

  • 子查询的结果被主查询(外查询)使用 。

  • 注意事项
    - 子查询要包含在括号内
    - 将子查询放在比较条件的右侧
    - 单行操作符对应单行子查询,多行操作符对应多行子查询


1.3 子查询的分类

  • 分类方式1
    我们按内查询的结果返回一条还是多条记录,将子查询分为 单行子查询多行子查询

  • 分类方式2

    我们按内查询是否被执行多次,将子查询划分为 相关(或关联)子查询 和 不相关(或非关联)子查询 。

    子查询从数据表中查询了数据结果,如果这个数据结果只执行一次,然后这个数据结果作为主查询的条件进行执行,那么这样的子查询叫做不相关子查询。

    同样,如果子查询需要执行多次,即采用循环的方式,先从外部查询开始,每次都传入子查询进行查询,然后再将结果反馈给外部,这种嵌套的执行方式就称为相关子查询。


2. 单行子查询


2.1 单行比较操作符

操作符 含义
= 等于
> 大于
>= 大于等于
< 小于
<= 小于等于
!= 不等于

2.2 代码示例

题目:查询工资大于2023号员工工资的员工的信息

SELECT * FROM emp 
WHERE salary > 
	(SELECT salary FROM emp WHERE eid = 2023)

2.3 HAVING 中的子查询

  • 首先执行子查询。
  • 向主查询中的HAVING 子句返回结果。

题目:查询最低工资大于50号部门最低工资的部门id和其最低工资

SELECT department_id, MIN(salary)
FROM emp
GROUP BY department_id
HAVING MIN(salary) >
	(SELECT MIN(salary)
	FROM emp
	WHERE department_id = 50);

2.4 注意的问题

  • 子查询中的空值问题
    SELECT last_name, job_id
    FROM emp
    WHERE job_id =
    	(SELECT job_id
    	FROM emp
    	WHERE last_name = '刘强东');
    
    该子查询不返回任何行,因为子查询返回空

  • 非法使用子查询
    SELECT employee_id, last_name
    FROM emp
    WHERE salary =
    	(SELECT MIN(salary)
    	FROM emp
    	GROUP BY department_id);
    
    多行子查询使用单行比较符

3. 多行子查询

  • 也称为集合比较子查询
  • 内查询返回多行
  • 使用多行比较操作符

3.1 多行比较操作符

【MySQL】一文带你了解MySQL中的子查询
体会 ANY 和 ALL 的区别

3.2 代码示例

题目1:返回其它job_id中比job_id为‘IT_PROG’部门任一工资低的员工的员工号、姓名、job_id 以及salary

【MySQL】一文带你了解MySQL中的子查询

题目2:返回其它job_id中比job_id为‘IT_PROG’部门所有工资都低的员工的员工号、姓名、job_id以及salary

【MySQL】一文带你了解MySQL中的子查询


4. 相关子查询

4.1 相关子查询执行流程

如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为 关联子查询

相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询。
【MySQL】一文带你了解MySQL中的子查询
说明:子查询中使用主查询中的列


4.2 代码示例

题目:查询员工中工资大于本部门平均工资的员工的last_name,salary和其department_id

方式1:略

方式2:在 FROM 中使用子查询

SELECT last_name,salary,e1.department_id
FROM employees e1,(SELECT department_id,AVG(salary) dept_avg_sal FROM employees
GROUP BY department_id) e2
WHERE e1.`department_id` = e2.department_id
AND e2.dept_avg_sal < e1.`salary`;

from型的子查询:子查询是作为from的一部分,子查询要用()引起来,并且要给这个子查询取别名,把它当成一张“临时的虚拟的表”来使用。



【MySQL】一文带你了解MySQL中的子查询文章来源地址https://www.toymoban.com/news/detail-473206.html

到了这里,关于【MySQL】一文带你了解MySQL中的子查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一文带你了解MySQL之约束

    在SQL标准中,一共规定了6种不同的约束, 包括非空约束,唯一约束和检查约束等,而在MySQL中是不支持检查约束的,所以这篇文章先对其余5种约束做一个详解和练习。 约束是作用于表中列上的规则,用于限制加入表的数据。 例如,作为主键的列一定是非空的唯一的,否则将

    2024年02月07日
    浏览(48)
  • 【MySQL】一文带你了解检索数据

    🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集! 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长,值得我们全力奔赴更美好的生活✨ ------------------❤️分割线❤️------------------------- —————————

    2024年02月09日
    浏览(37)
  • 【MySQL】一文带你了解SQL

    🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集! 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长,值得我们全力奔赴更美好的生活✨ ------------------❤️分割线❤️------------------------- —————————

    2024年02月08日
    浏览(35)
  • 一文带你了解MySQL之连接原理

    前言 我们搞数据库一个都避不开的概念就是 连接 ( join )。相信很多小伙伴初学连接的时候有些一脸懵,理解了连接的语义之后又可能搞不明白各个表中的记录到底是怎么连起来的,以至于在后期使用数据库的时候常常陷入下边两种误区: 误区一 :业务至上,不管三七二

    2024年02月05日
    浏览(48)
  • 【MySQL】一文带你彻底了解事务机制

    我们设想一个场景,这个场景中我们需要插入多条相关联的数据到数据库,不幸的是,这个过程可能会遇到下面这些问题: 数据库中途突然因为某些原因挂掉了。 客户端突然因为网络原因连接不上数据库了。 并发访问数据库时,多个线程同时写入数据库,覆盖了彼此的更改

    2024年02月09日
    浏览(28)
  • 【MySQL】一文带你了解MySQL的基础知识

    🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集! 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长,值得我们全力奔赴更美好的生活✨ ------------------❤️分割线❤️------------------------- —————————

    2024年02月08日
    浏览(37)
  • 一文带你了解MySQL之redo日志

    前言 本文以及接下来的几篇文章将会频繁的使用到我们前边唠叨的 InnoDB记录行格式 、 页面格式 、 索引原理 、 表空间的组成 等各种基础知识,如果大家对这些东西理解的不透彻,那么阅读下边的文字可能会特别的些费力,为保证您能正常的理解,请确保自己已经掌握了我

    2024年02月08日
    浏览(28)
  • 【MySQL】一文带你了解数据库约束

    作用: 数据库约束是用于限制数据输入或数据更新的规则。数据库约束确保在表中只能插入符合规则的数据,以确保数据的完整性和一致性。 常见的数据库约束包括: 主键约束:用于唯一标识表中的每一行数据,确保数据唯一性和完整性。 外键约束:用于确保表之间数据的

    2024年02月08日
    浏览(50)
  • 一文带你了解MySQL之undo日志

    我们在前边学习事务的时候说过事务需要保证 原子性 ,也就是 事务中的操作要么全做,要么全不做 。但是有的时候事务会出现一些情况,比如: 情况一: 事务执行过程中可能遇到各种错误,比如服务器本身的错误,操作系统错误,甚至是突然断电导致的错误 情况二:程序

    2024年02月07日
    浏览(67)
  • 一文带你迅速了解下Spring中的AOP

    AOP(Aspect Oriented Programming):面向切面编程。 面向切面编程是一种思想,其实就是对某一类事情进行统一的处理。而 SpringAOP就是一种AOP的具体实现的框架。这就好比 IOC 和 DI 一样的关系。 上述就是对登录功能进行了一个统一的处理! 除了上面的判断登录之外,还有: 统一日

    2024年02月13日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包