MySQL 子查询

news2024/11/24 22:58:21

文章目录

  • 子查询
    • 单行子查询
    • 多行子查询
    • 相关子查询 exists


子查询

在这里插入图片描述

所谓子查询就是 select 查询语句中还有 select 查询语句,里面的称为子查询或内查询,外面的称为主查询或外查询。

根据查询结果记录数量,子查询可以分为两类:

  1. 单行子查询
  2. 多行子查询

根据内外查询的相关性,又可以分为:

  1. 不相关子查询
  2. 相关子查询

使用子查询需要注意以下几点:

  • 子查询要放在小括号对里面;
  • 子查询一般放在条件判断的右侧;
  • 对于单行子查询,常用搭配操作符有:>、<、=、<>、>=、<=等;
  • 对于多行子查询,常用搭配操作符有:in、any、all 等;
  • 不相关子查询,子查询先于主查询,用子查询的结果构造外查询的条件;
  • 相关子查询:以 exists 为代表,是一个内外一一匹配的过程。

单行子查询

只返回一行结果的子查询,称为单行子查询。对于单行子查询的结果我们可以使用单行操作符来构造外查询条件,如 >、<、= 等等。

例如想要知道 city 表中,人口数量超过 Tokyo 的城市有哪些,并显示这些城市的所有信息。

采用子查询形式的 SQL 语句如下:

select * from city
where population >
(select population from city where name='tokyo');

输出结果:

MariaDB [world]> select * from city
    -> where population >
    -> (select population from city where name='tokyo');
+------+-------------------+-------------+------------------+------------+
| ID   | Name              | CountryCode | District         | Population |
+------+-------------------+-------------+------------------+------------+
|  206 | São Paulo         | BRA         | São Paulo        |    9968485 |
|  939 | Jakarta           | IDN         | Jakarta Raya     |    9604900 |
| 1024 | Mumbai (Bombay)   | IND         | Maharashtra      |   10500000 |
| 1890 | Shanghai          | CHN         | Shanghai         |    9696300 |
| 2331 | Seoul             | KOR         | Seoul            |    9981619 |
| 2515 | Ciudad de México  | MEX         | Distrito Federal |    8591309 |
| 2822 | Karachi           | PAK         | Sindh            |    9269265 |
| 3357 | Istanbul          | TUR         | Istanbul         |    8787958 |
| 3580 | Moscow            | RUS         | Moscow (City)    |    8389200 |
| 3793 | New York          | USA         | New York         |    8008278 |
+------+-------------------+-------------+------------------+------------+
10 rows in set (0.004 sec)

这就是单行子查询,其含义是先查询城市 Tokyo 的人口数量,以此结果为算子参与 < 运算作为主查询的过滤条件。

多行子查询

返回多行结果的子查询,称为多行子查询。对于多行子查询的结果我们可以使用多行操作符来进一步构造查询条件,如 in、any、all。

简单说一下这三个多行操作符的含义:

  • in:等于多行子查询返回的结果中的任意一个即可;
  • any:和多行子查询返回的某一个值进行比较即可;
  • all:和多行子查询返回的所有值进行比较;

下面就这三个多行子查询操作运算符进行举例:

1.查询所有和国家 ‘ABW’ 有共同语言的国家。

实现的 SQL 语句如下:

select distinct countrycode
from countrylanguage
where language in (select language from countrylanguage where countrycode='abw');

输出结果:
在这里插入图片描述

结果解析:子查询首先会查出 ABW 这个国家有 4 个语言,然后利用 in 运算符把使用 4 种语言之一的国家编码显示出来,最后利用 distinct 去掉重复行。

2.查询人口数比 TTO 这个国家下任意城市人口数小的城市信息,换句话说,对某一城市 X,只要 TTO 下任一城市人口数比 X 人口数大,那么 X 就进入查询结果。实现的 SQL 语句如下:

select * from city
where population < any (select population from city where countrycode = 'TTO')
and countrycode<> 'TTO';

输出结果:
在这里插入图片描述

结果解析:在 city 表中 TTO 这个国家共有两个城市,人口数量分别是 56601 和 43396,通过子查询先获取到这两个数据。然后利用 any 操作符,只要比这两个数据中任何一个小的城市信息都被查询出来。这里面包含了 TTO 这个国家本身的城市,与题意不合。所以在主查询后面加了个条件,排除 TTO 这个国家的城市。

3.查询人口数量比 TTO 这个国家所有城市人口数量都小的城市信息,换句话说,人口数小于 TTO 下城市最小人口数的城市会进入查询结果。实现的 SQL 语句如下:

select * from city
where population < all (select population from city where countrycode = 'TTO');

输出结果:
在这里插入图片描述

结果解析:使用 all 操作运算符意味着要和子查询所有结果比较(而不是任一),所以结果数据量比使用 any 要少。

not 是对 inbetweenexists 等取反,读者可自行改写上述例子来体验。

相关子查询 exists

首先,我们需明确不相关子查询和相关子查询的概念:

不相关子查询:子查询的查询条件不依赖于父查询的称为不相关子查询。 相关子查询:子查询的查询条件依赖于外层父查询的某个属性值的称为相关子查询,带 EXISTS 的子查询就是相关子查询。

EXISTS 表示存在量词:带有 EXISTS 的子查询不返回任何记录的数据,只返回逻辑值 True 或 False。

相关子查询执行过程:先在外层查询中取第一行记录,用该记录的相关的属性值(在内层 where 子句中给定的)处理内层查询,若外层的 where 子句返回True值,则这条记录放入结果表中。然后再取下一行记录,重复上述过程直到外层表的记录全部遍历一次为止。

已知国家名Netherlands,查询该国所有城市信息:

select * from city c1
where exists
(select * from country c2 where c1.countrycode = c2.code and c2.name='Netherlands');

输出结果:
在这里插入图片描述
显然,该语句可改写为:

select * from city c1
where c1.countrycode=
(select code from country where name='Netherlands');

就这两条语句而言,第二条的性能优于第一条。exits 语句和其他子查询的性能比较,是一个复杂的问题,此处不打算深究,但可以给大家一个简单的规则做参考:子查询结果大(行数多)可用 exists,子查询结果小可用 = 或 in 等子查询。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/608985.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习 | 分类问题

目录 一、K近邻算法 二、决策树 1.一些原理介绍 2.决策树案例与实践 三、距离 一、K近邻算法 我们引入accuracy_score&#xff0c;利用score()的方法评估准确性。k近邻算法中的k是一个超参数&#xff0c;需要事先进行定义。 k值得选取经验做法是一般低于训练样本得平方根…

排书 dfs 迭代加深 IDA* 剪枝 java

&#x1f351; 算法题解专栏 &#x1f351; 排书 给定 n n n 本书&#xff0c;编号为 1 ∼ n 1 \sim n 1∼n。 在初始状态下&#xff0c;书是任意排列的。 在每一次操作中&#xff0c;可以抽取其中连续的一段&#xff0c;再把这段插入到其他某个位置。 我们的目标状态是把…

【云原生-K8s】k8s可视化管理界面安装配置及比较【Kuboard篇】

总览 安装了k8s控制面板&#xff0c;方便日常的问题处理&#xff0c;查看资源状态信息&#xff0c;也可以增加子账号进行开放给其他人员使用&#xff0c;减少命令操作&#xff0c;提升工作效率 前置条件 须有一个正常使用的k8s集群附k8s v1.23版本搭建&#xff1a;https://…

amis框架实现sdk中使用tsx

1.开发过程中&#xff0c;由于自己和同事用的不同方式使用&#xff0c;本人使用react搭建的amis框架&#xff0c;同事用sdk使用方式搭建 2.开发过程中遇到问题&#xff0c;如果需求中出现amis无法满足的组件&#xff0c;需要自己进行自定义组件&#xff0c;而不同使用方式的am…

JVM内存变化分析实战

最近在一次项目压力测试时&#xff0c;监测到JVM内存明显的变化&#xff0c;由于之前开发工作中没有涉及到JVM相关的问题分析&#xff0c;所以特此借这个机会学习和记录。项目使用的JDK版本为 OpenJdk 1.8&#xff0c;虚拟机为 HotSpot。 1. 内存变化情况 在压力测试进行2H48…

Java008——Java关键字和标识符的简单认识

一、Java关键字 围绕以下3点介绍&#xff1a; 1、什么是Java关键字&#xff1f; 2、Java有哪些关键字&#xff1f; 3、Java关键字的作用&#xff1f; 4、Java关键字的使用&#xff1f;后面文章再做介绍 1.1、什么是Java关键字&#xff1f; 定义&#xff1a;被Java语言赋予了…

github开源化课程体系推荐 浙江大学 计算机考研必备408资料汇总 北京大学计算机系资料整理

github漫游指南 github漫游指南 *所有开源课程资料网站整理在文末 什么是GitHub Wiki 百科上是这么说的 GitHub 是一个共享虚拟主机服务&#xff0c;用于存放使用Git版本控制的软件代码和内容项目。它由GitHub公司&#xff08;曾称Logical Awesome&#xff09;的开发者Chr…

【手撕Spring源码】深度理解SpringMVC【下】

文章目录 控制器方法执行流程ControllerAdvice 之 ModelAttribute返回值处理器MessageConverterControllerAdvice 之 ResponseBodyAdviceBeanNameUrlHandlerMapping 与 SimpleControllerHandlerAdapterRouterFunctionMapping 与 HandlerFunctionAdapterSimpleUrlHandlerMapping…

Elasticsearch:节点角色 - node roles

你可能已经知道 Elasticsearch 集群由一个或多个节点组成。 每个节点将数据存储在分片上&#xff0c;每个分片存储在一个节点上。 到目前为止&#xff0c;你看到的每个节点都至少存储了一个分片&#xff0c;但值得注意的是&#xff0c;节点并不总是必须存储分片。 这是因为每个…

【Unity3D】运动模糊特效

1 运动模糊原理 开启混合&#xff08;Blend&#xff09;后&#xff0c;通过 Alpha 通道控制当前屏幕纹理与历史屏幕纹理进行混合&#xff0c;当有物体运动时&#xff0c;就会将当前位置的物体影像与历史位置的物体影像进行混合&#xff0c;从而实现运动模糊效果&#xff0c;即模…

javascript基础二十二:举例说明你对尾递归的理解,有哪些应用场景

一、递归 递归&#xff08;英语&#xff1a;Recursion&#xff09; 在数学与计算机科学中&#xff0c;是指在函数的定义中使用函数自身的方法 在函数内部&#xff0c;可以调用其他函数。如果一个函数在内部调用自身本身&#xff0c;这个函数就是递归函数 其核心思想是把一个大型…

Redis高级数据结构之GEO

GEO的介绍 Redis3.2版本提供了GEO地址位置信息定位的功能。支持存储地理位置信息来实现诸如摇一摇&#xff0c;附近位置这类地理位置信息的功能。 Redis也是使用业界比较通用的地理位置距离排序算法GeoHash算法。将二维的经纬度坐标数据映射到一维的整数&#xff0c;将所有元素…

1.项目环境部署操作

第一步 将资料中提供虚拟机压缩包, 解压到一个没有中文没有空格, 以及磁盘空间相对充足的磁盘中(大于100GB) 第二步 修改VMware的网卡设置: 统一修改为 88网段, 网关为192.168.88.2 vm虚拟机 windows系统 第三步 将两台项目虚拟机挂载到VMware上

Kubernetes学习笔记-开发应用的最佳实践(2)20230604

三、确保所有的客户端请求都得到了妥善处理 如何在pod启动的时候&#xff0c;确保所有的连接都被妥善处理了 1、在pod启动时避免客户端连接断开 当个pod启动的时候&#xff0c;他以服务端点的方式提供给所有的服务&#xff0c;这些服务的标签选择器和pod的标签匹配。pod需要…

【简单实用框架】【读Excel表】【可移植】

☀️博客主页&#xff1a;CSDN博客主页 &#x1f4a8;本文由 我是小狼君 原创&#xff0c;首发于 CSDN&#x1f4a2; &#x1f525;学习专栏推荐&#xff1a;面试汇总 ❗️游戏框架专栏推荐&#xff1a;游戏实用框架专栏 ⛅️点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd;&…

【算法思维】-- 贪心算法

OJ须知&#xff1a; 一般而言&#xff0c;OJ在1s内能接受的算法时间复杂度&#xff1a;10e8 ~ 10e9之间&#xff08;中值5*10e8&#xff09;。在竞赛中&#xff0c;一般认为计算机1秒能执行 5*10e8 次计算。 时间复杂度取值范围o(log2n)大的离谱O(n)10e8O(nlog(n))10e6O(nsqrt(…

LinuxC编程——标准IO

目录 标准I/O一、概念二、特点⭐⭐⭐三、缓冲区⭐⭐⭐3.1 全缓冲3.1 行缓冲3.3 不缓冲 四、函数接口⭐⭐⭐⭐4.1 打开4.1.1 fopen4.1.2 freopen4.1.2 容错机制perror 4.2 关闭4.2.1 fclose4.3 读写操作4.3.1 字符I/O4.3.2 行I/O4.3.3 块I/O 4.4 定位操作4.5 文件结束和错误 脑图…

Redis高级数据结构之HyperLogLog

HyperLogLog的介绍 这并不是一种全新的数据结构、实际类型是一种字符串类型。通过一种基数&#xff08;不重复的元素数量就是基数&#xff09;算法&#xff0c;便可以使用很小的内存空间完成独立总数的统计。数据集可以是IP、Email、ID等官方给出的统计误差是0.81%&#xff0c…

python文本注释数学表达式设置|python绘图中的数学表达式设置

本篇文章将介绍如何在Matplotlib中设置文本、注释和数学表达式&#xff0c;以便更好地呈现数据&#xff0c;提高可视化效果。 文章目录 一、Matplotlib中的文本设置1.1 纯文本设置1.2 含箭头的文本设置 二、Matplotlib中的数学表达式设置三、Matplotlib中的字体设置 一、Matplo…

Vue项目中通过插件pxtorem实现大屏响应式

一、原理 rem单位代表的是根节点的font-size大小&#xff0c;所以当我们在页面上使用rem去替代px的时候&#xff0c;就可以通过修改根节点font-size的值&#xff0c;动态地让页面上的元素根据不同浏览器宽高下去实现变化。 二、工具 1.postcss-pxtorem 作用&#xff1a;在编…