mysql加强(6)~子查询简单介绍、子查询分类

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: mysql加强(6)~子查询简单介绍、子查询分类

一、子查询简单介绍

1、什么是子查询?

一个查询之中嵌套了其他的若干查询。

  • 在使用select 语句查询时,有时候where的查询条件中的限制条件不是一个确定的值,而是一个来自于另一个查询的结果。
  • 子查询一般出现在fromwhere 子句中。


2、子查询语法:

select <select_list>

from 表名

where 条件(s) 操作符

(select <select_list> from 表名);

  • 子查询在主查询前执行,然后主查询再使用子查询的结果。


3、子查询例子:

# 查询大于公司平均工资的员工姓名
select ename, sal from emp where sal > (select avg(sal) from emp);


4、子查询经典案例---Oracle的分页查询、


35.png


5、子查询的使用注意事项:

  • 子查询需要用括号括起来
  • 将子查询放在比较运算符的右边【增强可读性】
  • 对单行子查询使用单行运算符
  • 对多行子查询使用多行运算符


二、子查询的分类

1、子查询的分类【根据子查询的结果集来划分】

(1)单行单列子查询:子查询返回一行一列记录,好比就是一个值

  • 返回一条记录---比较运算符(针对一个值的运算符): = > < >= < !=
# 查询大于公司平均工资的员工姓名
select ename, sal from emp where sal > (select avg(sal) from emp);


36.png


(2) 多行单列子查询:子查询返回单列多行记录,好比是多个值

  • 返回多条记录---比较运算符(多个值的运算符): in any all
  • in 相当于 = any
  • any:与子查询返回的任意一个值做比较; all:与子查询返回的每一个值做比较
# 查询工资等于部门经理的员工信息
select * from emp where sal in (select sal from emp where job = 'manager');
select * from emp where sal = any (select sal from emp where job = 'manager');
# 查询工资大于任意部门经理的员工信息
select * from emp where sal > any (select sal from emp where job = 'manager');
# 查询工资小于任意部门经理的员工信息
select * from emp where sal < any (select sal from emp where job = 'manager');


37.png


(3)多行多列子查询:子查询返回多列一行/多行记录,好比是一张表 【其实就是多表连接查询

  • 一般把查询结果含多个列的当做临时表必须给临时表起个别名】,接着在临时表上继续查询或者连接查询;
# 查询出每个部门的编号、名称、部门人数、平均工资
select t.deptno, d.dname, t.count_empno, t.avg_sal
from dept d  left join
(select e.deptno, count(e.empno) count_empno, avg(e.sal) avg_sal from emp e group by deptno) t
 on d.deptno = t.deptno;


2、union/union all

  • join 是横向连接,union/union all 是纵向连接(一般用于作为临时表)
  • 注意:
  • union 内部的select 语句必须是拥有相同数量的列
  • 列也必须拥有兼容的数据类型
  • 每条select语句中的列的顺序必须相同
  • union 结果集的列名总是等于union中第一个select语句的列名
  • union操作符选去不同的值,若允许值重复-使用union all 性能更高


  • 语法:
    select <select_list> from 表名1
    union | union all
    select <select_list> from 表名2


  • 全连接--mysql不止全连接,不过可以使用左右连接+union实现
#全连接查询员工的编号、名称、部门名称
select e.deptno,e.ename,d.dname from emp e left join dept d on e.deptno = d.deptno
union
select e.deptno,e.ename,d.dname from emp e right join dept d on e.deptno = d.deptno;
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
9月前
|
存储 SQL 关系型数据库
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log、原理、写入过程;binlog与redolog区别、update语句的执行流程、两阶段提交、主从复制、三种日志的使用场景;查询日志、慢查询日志、错误日志等其他几类日志
749 35
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
|
SQL 关系型数据库 MySQL
在 MySQL 中使用子查询
【8月更文挑战第12天】
642 0
在 MySQL 中使用子查询
|
SQL 关系型数据库 MySQL
MySQL数据库基础第一篇(SQL通用语法与分类)
MySQL数据库基础第一篇(SQL通用语法与分类)
|
SQL 关系型数据库 MySQL
MySQL数据库子查询练习——EXISTS(存在)
MySQL数据库子查询练习——EXISTS(存在)
205 1
|
SQL 关系型数据库 MySQL
MySQL数据库子查询——in多个数据查询的示例
MySQL数据库子查询——in多个数据查询的示例
134 1
|
11月前
|
存储 关系型数据库 MySQL
10个案例告诉你mysql不使用子查询的原因
大家好,我是V哥。上周与朋友讨论数据库子查询问题,深受启发。为此,我整理了10个案例,详细说明如何通过优化子查询提升MySQL性能。主要问题包括性能瓶颈、索引失效、查询优化器复杂度及数据传输开销等。解决方案涵盖使用EXISTS、JOIN、IN操作符、窗口函数、临时表及索引优化等。希望通过这些案例,帮助大家在实际开发中选择更高效的查询方式,提升系统性能。关注V哥,一起探讨技术,欢迎点赞支持!
547 5
|
SQL 缓存 关系型数据库
MySQL高级篇——关联查询和子查询优化
左外连接:优先右表创建索引,连接字段类型要一致、内连接:驱动表由数据量和索引决定、 join语句原理、子查询优化:拆开查询或优化成连接查询
MySQL高级篇——关联查询和子查询优化
|
关系型数据库 MySQL 数据库
MYSQL索引的分类与创建语法详解
理解并合理应用这些索引类型,能够有效提高MySQL数据库的性能和查询效率。每种索引类型都有其特定的优势,适当地使用它们可以为数据库操作带来显著的性能提升。
546 3
|
存储 SQL 关系型数据库
(四)MySQL之索引初识篇:索引机制、索引分类、索引使用与管理综述
本篇中就对MySQL的索引机制有了全面认知,从索引的由来,到索引概述、索引管理、索引分类、唯一/全文/联合/空间索引的创建与使用等内容,进行了全面概述。
599 0
|
关系型数据库 MySQL 数据库
MySQL—子查询
MySQL—子查询
119 1

推荐镜像

更多