Mysql 子查询 (查询语句中带查询语句)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Mysql 子查询 (查询语句中带查询语句)

  • 子查询:指一个“正常查询语句”中的某个部分(比如select部分,from 部分,where 部分)又出现了查询的一种查询形式,比如:
select * from 表名 where age > (一个子查询语句);
select * from 表名 where age > (select avg(age) from 表名);
可以根据需求不断的嵌套子查询
select * from 表名 where 字段名 > (select avg(字段名) from 表名 where 字段名 < (select ...));
  • 测试数据
mysql> select * from test;
+----+--------+------+------+
| id | name   | sex  | age  |
+----+--------+------+------+
|  1 | name1  | 女   |   15 |
|  2 | name1  | 女   |   15 |
|  4 | name2  | 男   |   30 |
|  5 | name50 | 男   |   12 |
+----+--------+------+------+
查询出大于平均年龄的用户数据
mysql> select * from test where age > (select avg(age) from test);
+----+-------+------+------+
| id | name  | sex  | age  |
+----+-------+------+------+
|  4 | name2 | 男   |   30 |
+----+-------+------+------+

  • 标量子查询

含义: |
标量子查询就是指子查询的结果是“单个值”(一行一列)的查询。
使用:
标量子查询通常用在where子句中,作为主查询的一个条件判断的数据。
本质上,标量子查询的结果,就可以直接当做“一个值”来使用。
取出的平均值除去标题栏,就是一行一列,查询结果可以直接当做值来使用
mysql> select avg(age) from test;
+----------+
| avg(age) |
+----------+
|  18.0000 |
+----------+
类似于这样的查询也是一行一列,可以当做值来使用
mysql> select 18 as age;
+-----+
| age |
+-----+
|  18 |
+-----+
上面的两种写法都可以代替这个 18 数字,区别就是一个是固定写死的,一个是通过查询计算之后得到的值,非固定值。
mysql> select * from test where age > 18;
+----+-------+------+------+
| id | name  | sex  | age  |
+----+-------+------+------+
|  4 | name2 | 男   |   30 |
+----+-------+------+------+
查询结果都是一样的
mysql> select * from test where age > (select 18);
+----+-------+------+------+
| id | name  | sex  | age  |
+----+-------+------+------+
|  4 | name2 | 男   |   30 |
+----+-------+------+------+
查询结果都是一样的
mysql> select * from test where age > (select avg(age) from test);
+----+-------+------+------+
| id | name  | sex  | age  |
+----+-------+------+------+
|  4 | name2 | 男   |   30 |
+----+-------+------+------+

  • 列子查询

含义:
列子查询查出的结果为“一列数据”,类似这样:
mysql> select name from user;
+-------+
| name  |
+-------+
| name1 |
| name2 |
| name3 |
| name4 |
+-------+
使用;
列子查询通常用在 where 子句的 in 运算符中,代替 in 运算符中的“字面值”列表数据。
比如:
select * from product where chandi in ('北京', '深圳', '天津')
如果 in 中的数据并不方便一个一个列出,但可以通过一个查询得到,就可以使用查询来实现:
select * from product where chandi in (select chandi from product);
相当于就是 in 中的数据无法固定写死,需要通过动态的去查询出来一个列表放到 in 中去动态使用。

  • 行子查询

含义:
行子查询查出的结果通常是一行,类似这样:
mysql> select name,age from user where age > 15;
+-------+------+
| name  | age  |
+-------+------+
| name1 |   18 |
| name3 |   20 |
| name4 |   30 |
+-------+------+
使用:
行子查询的结果通常跟“行构造符”一起,在 where 条件子句中做为条件数据,类似这样:
select * from 表名 where (字段 1, 字段2) = (行子查询)
或这样,含义跟上一行是一样的, 即 row 可以省略
select * from 表名 where row(字段1, 字段2) = (行子查询)
使用场景举例:找出指定省市的所有用户,这样就可以这么写查询了
select * from 表名 where row(省字段名, 市字段名) = ('上海', '徐汇区');

  • 表子查询

含义:
当一个子查询查出的结果是“多行多列”的时候,就是表子查询。
表子查询的结果相当于一个表,可以直接当做一个表来使用。
使用:
表子查询通常用在主查询的 from 子句中,作为一个“数据源”。
通常我们查询表是这样:
select * from 表名 where 字段名 > 0;
但是现在这个表就不固定了,需要我们通过查询语句来得到并使用,这个查询的表必须要起别名:
select * from (select * from 表名 where 字段名 > 0) as table1;
注意:
此时需要给该子查询设置一个别名,必须要加别名!!!,类似这样:
select * from (select... 子查询) as table1;
查询出年龄 age > 12 的用户
mysql> select * from (select * from test where age > 12) as table1;
+----+-------+------+------+
| id | name  | sex  | age  |
+----+-------+------+------+
|  1 | name1 | 女   |   15 |
|  2 | name1 | 女   |   15 |
|  4 | name2 | 男   |   30 |
+----+-------+------+------+
查询出年龄 age > 12 的用户总人数与平均年龄
mysql> select count(*) as 总人数, avg(age) as 平均年龄 from (select * from test where age > 12) as table1;
+-----------+--------------+
| 总人数    | 平均年龄     |
+-----------+--------------+
|         3 |      20.0000 |
+-----------+--------------+

  • 子查询的特定关键字


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8天前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
|
16天前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
46 9
|
18天前
|
缓存 监控 关系型数据库
如何优化MySQL查询速度?
如何优化MySQL查询速度?【10月更文挑战第31天】
45 3
|
23天前
|
SQL NoSQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(5)作者——LJS[含MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页等详解步骤及常见报错问题所对应的解决方法]
MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页、INSERT INTO SELECT / FROM查询结合精例等详解步骤及常见报错问题所对应的解决方法
|
22天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
108 1
|
28天前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
|
24天前
|
SQL 关系型数据库 MySQL
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
43 1
|
23天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
53 0
|
1月前
|
存储 SQL 关系型数据库
MySQL 给查询结果增列并自定义列数据
MySQL 给查询结果增列并自定义列数据
487 2
|
25天前
|
SQL 关系型数据库 MySQL
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
31 0
下一篇
无影云桌面