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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 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;
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
在 MySQL 中使用子查询
【8月更文挑战第12天】
119 0
在 MySQL 中使用子查询
|
4月前
|
SQL 关系型数据库 MySQL
MySQL数据库基础第一篇(SQL通用语法与分类)
MySQL数据库基础第一篇(SQL通用语法与分类)
|
4月前
|
SQL 关系型数据库 MySQL
MySQL数据库子查询练习——EXISTS(存在)
MySQL数据库子查询练习——EXISTS(存在)
33 1
|
4月前
|
SQL 关系型数据库 MySQL
MySQL数据库子查询——in多个数据查询的示例
MySQL数据库子查询——in多个数据查询的示例
30 1
|
19天前
|
SQL 缓存 关系型数据库
MySQL高级篇——关联查询和子查询优化
左外连接:优先右表创建索引,连接字段类型要一致、内连接:驱动表由数据量和索引决定、 join语句原理、子查询优化:拆开查询或优化成连接查询
MySQL高级篇——关联查询和子查询优化
|
12天前
|
关系型数据库 MySQL 数据库
MYSQL索引的分类与创建语法详解
理解并合理应用这些索引类型,能够有效提高MySQL数据库的性能和查询效率。每种索引类型都有其特定的优势,适当地使用它们可以为数据库操作带来显著的性能提升。
33 3
|
5月前
|
SQL 存储 关系型数据库
RDS for MySQL的SQL分类与数据类型
小明需在MySQL中管理商品信息,使用SQL完成业务操作。SQL分为DQL(查询)、DML(增删改)、DDL(定义)、DCL(权限控制)和TCL(事务)五大类。DDL用于创建、修改和删除数据库结构,DML处理数据,DCL控制权限,TCL管理事务,DQL则用于查询数据。MySQL有多种数据类型,如数值型(整数、小数)、日期型和字符串型等,选择合适的数据类型是高效开发的关键。
54 0
|
3月前
|
存储 SQL 关系型数据库
(四)MySQL之索引初识篇:索引机制、索引分类、索引使用与管理综述
本篇中就对MySQL的索引机制有了全面认知,从索引的由来,到索引概述、索引管理、索引分类、唯一/全文/联合/空间索引的创建与使用等内容,进行了全面概述。
|
3月前
|
关系型数据库 MySQL 数据库
MySQL—子查询
MySQL—子查询
|
3月前
|
SQL Java 数据库
MySQL设计规约问题之为什么应尽量避免使用子查询,而可以考虑将其优化为join操作
MySQL设计规约问题之为什么应尽量避免使用子查询,而可以考虑将其优化为join操作
下一篇
无影云桌面