MySQL 中几种不同的子查询实践

简介: MySQL 中几种不同的子查询实践

子查询:sub query;查询是在某个查询结果之上进行的(即,一条select语句内部包含了另外一条或多条select语句)。

【1】子查询分类

子查询有两种分类方式:按位置分类和按结果分类。

① 按位置分类

子查询(select语句)在外部查询(select语句)出现的位置

  • 1.from子查询:子查询跟在from之后;
  • 2.where子查询:子查询出现在where条件中;
  • 3.exists子查询:子查询出现在exists里面;
  • 4.in子查询:子查询出现在in 里面。

② 按结果分类

根据子查询得到的数据进行分类—理论上任何一个查询得到的结果都可以理解为一个二维表。

  • 1.标量子查询:子查询得到的结果是一行一列;
  • 2.列子查询:子查询得到的结构是一列多行;
  • 3.行子查询:子查询的得到的结果是一行多列(也可以是多行多列);

前三者出现的位置都是在where之后;

  • 4.表子查询:子查询得到的结果是多行多列(位置在from之后)。

【2】子查询实例

① 标量子查询

select * from p_user_2 where id=(select id from p_user where age = 3 );
-- 子查询只能返回一条记录!!

② 列子查询

select * from p_user_2 where id in (select id from p_user);
-- 子查询返回一列数据,但是此时 不能再使用 'id =' !,需要用in

类似的还有 all,some,any。

肯定结果

Any === Some :

select * from p_user_2 where id = some (select id from p_user);
-- '= all'将会为null;

否定结果

select * from p_user_2 where id != some (select id from p_user);
-- id 不等于其中的某个,返回p_user_2全部结果;
select * from p_user_2 where id != any (select id from p_user);
-- id 不等于全部,返回p_user_2全部结果;
select * from p_user_2 where id != all (select id from p_user);
-- id 不等于子集中的每一个,返回id 不在p_user中的p_user_2的记录。等价于 not in

③ 行子查询

需求如下:查询用户表里面生日和薪水最高的;

① 使用两个标量子查询:

select * from s_user where 
user_birthday = (select MAX(user_birthday) from s_user ) and 
user_salary = (select MAX(user_salary) from s_user)

② 使用行子查询:

select * from s_user where 
-- 行元素
(user_birthday,user_salary)
= 
(select MAX(user_birthday), MAX(user_salary) from s_user)
-- 必须用括号,且行子查询不能再 使用表别名 ' as t'...

④ 表子查询

表子查询,返回的是多行多列的二维表,且位置在from之后,返回的结果当作二维表来使用。

如,查询每个班级中身高最高的学生信息:

select * from 
(select * from tb_student order by height desc) as t
group by class;
-- 作为二维表使用的查询结果必须有表别名;

下面sql错误:

select * from tb_student group by class order by height desc;
-- 先进行分组,然后对每组进行排序。这显然是错误的!!!
-- 分组的时候会按照表中顺序默认保存第一条(该条记录很可能不是该组最大值),故再对分组排序毫无意义!!!

⑤ Exists子查询

Exists:用来判断某些条件是否满足(跨表使用),exists是接在where之后,其返回的结果为0和1,等价于false和true。

测试如下:

SELECT   EXISTS(SELECT * from p_user_2 );

20170608153611326.png

SELECT  NOT  EXISTS(SELECT * from p_user_2 );
-- 将返回  0,因为 NOT取反;
SELECT   EXISTS(SELECT * from p_user_2 where id =100 );
-- 将返回  0,因为不存在id=100。

20170612093222631.png


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
安全 关系型数据库 MySQL
PHP与MySQL交互:从入门到实践
【9月更文挑战第20天】在数字时代的浪潮中,掌握PHP与MySQL的互动成为了开发动态网站和应用程序的关键。本文将通过简明的语言和实例,引导你理解PHP如何与MySQL数据库进行对话,开启你的编程之旅。我们将从连接数据库开始,逐步深入到执行查询、处理结果,以及应对常见的挑战。无论你是初学者还是希望提升技能的开发者,这篇文章都将为你提供实用的知识和技巧。让我们一起探索PHP与MySQL交互的世界,解锁数据的力量!
|
SQL 关系型数据库 MySQL
在 MySQL 中使用子查询
【8月更文挑战第12天】
838 0
在 MySQL 中使用子查询
|
Ubuntu 关系型数据库 MySQL
容器技术实践:在Ubuntu上使用Docker安装MySQL的步骤。
通过以上的操作,你已经步入了Docker和MySQL的世界,享受了容器技术给你带来的便利。这个旅程中你可能会遇到各种挑战,但是只要你沿着我们划定的路线行进,你就一定可以达到目的地。这就是Ubuntu、Docker和MySQL的灵魂所在,它们为你开辟了一条通往新探索的道路,带你亲身感受到了技术的力量。欢迎在Ubuntu的广阔大海中探索,用Docker技术引领你的航行,随时准备感受新技术带来的震撼和乐趣。
596 16
|
SQL 关系型数据库 MySQL
PHP与MySQL的高效交互:从基础到实践####
本文深入探讨了PHP与MySQL数据库之间的高效交互技术,涵盖了从基础连接到高级查询优化的全过程。不同于传统的摘要概述,这里我们直接以一段精简代码示例作为引子,展示如何在PHP中实现与MySQL的快速连接与简单查询,随后文章将围绕这一核心,逐步展开详细讲解,旨在为读者提供一个从入门到精通的实战指南。 ```php <?php // 数据库配置信息 $servername = "localhost"; $username = "root"; $password = "password"; $dbname = "test_db"; // 创建连接 $conn = new mysqli($se
501 31
|
存储 关系型数据库 MySQL
10个案例告诉你mysql不使用子查询的原因
大家好,我是V哥。上周与朋友讨论数据库子查询问题,深受启发。为此,我整理了10个案例,详细说明如何通过优化子查询提升MySQL性能。主要问题包括性能瓶颈、索引失效、查询优化器复杂度及数据传输开销等。解决方案涵盖使用EXISTS、JOIN、IN操作符、窗口函数、临时表及索引优化等。希望通过这些案例,帮助大家在实际开发中选择更高效的查询方式,提升系统性能。关注V哥,一起探讨技术,欢迎点赞支持!
760 5
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
904 5
|
存储 关系型数据库 MySQL
PHP与MySQL动态网站开发:从基础到实践####
本文将深入探讨PHP与MySQL的结合使用,展示如何构建一个动态网站。通过一系列实例和代码片段,我们将逐步了解数据库连接、数据操作、用户输入处理及安全防护等关键技术点。无论您是初学者还是有经验的开发者,都能从中获益匪浅。 ####
|
SQL 缓存 关系型数据库
MySQL高级篇——关联查询和子查询优化
左外连接:优先右表创建索引,连接字段类型要一致、内连接:驱动表由数据量和索引决定、 join语句原理、子查询优化:拆开查询或优化成连接查询
MySQL高级篇——关联查询和子查询优化
|
关系型数据库 MySQL Java
MySQL索引优化与Java应用实践
【11月更文挑战第25天】在大数据量和高并发的业务场景下,MySQL数据库的索引优化是提升查询性能的关键。本文将深入探讨MySQL索引的多种类型、优化策略及其在Java应用中的实践,通过历史背景、业务场景、底层原理的介绍,并结合Java示例代码,帮助Java架构师更好地理解并应用这些技术。
540 2
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:百万级数据统计优化实践
【10月更文挑战第21天】 在处理大规模数据集时,传统的单体数据库解决方案往往力不从心。MySQL和Redis的组合提供了一种高效的解决方案,通过将数据库操作与高速缓存相结合,可以显著提升数据处理的性能。本文将分享一次实际的优化案例,探讨如何利用MySQL和Redis共同实现百万级数据统计的优化。
984 9

推荐镜像

更多