<MySQL> 查询数据进阶操作 -- 联合查询

目录

一、什么是笛卡尔积?

二、什么是联合查询?

三、内连接

[3.1 简介](#3.1 简介)

[3.2 语法](#3.2 语法)

[3.3 更多的表](#3.3 更多的表)

[3.4 操作演示](#3.4 操作演示)

四、外连接

[4.1 简介](#4.1 简介)

[4.2 语法](#4.2 语法)

[4.3 操作演示](#4.3 操作演示)

五、自连接

[5.1 简介](#5.1 简介)

[5.2 自连接非必要不使用](#5.2 自连接非必要不使用)

六、子查询(嵌套查询)

[6.1 简介](#6.1 简介)

[6.2 in 和 exists 关键字](#6.2 in 和 exists 关键字)

[6.3 子查询可能让简单的语句变复杂](#6.3 子查询可能让简单的语句变复杂)

七、合并查询

[7.1 简介](#7.1 简介)

[7.2 合并查询可能让简单的语句变复杂](#7.2 合并查询可能让简单的语句变复杂)

[八、MySQL 中各个关键字的执行顺序](#八、MySQL 中各个关键字的执行顺序)


一、什么是笛卡尔积?

笛卡尔积(Cartesian product)是一种数学概念,用于描述两个或多个集合之间的组合。它表示为两个或多个集合的乘积,其中每个元素都来自不同的集合。

在编程中,笛卡尔积通常用于描述两个或多个数据集合之间的组合。

++编程中使用笛卡尔积,需要注意以下两点:++

|-------------------------------------------------------|
| 实际开发中,使用笛卡尔积需要慎重,需要预估笛卡尔积后的结果集的规模,避免规模过大。 |
| **通常表与表之间存在关联关系,才可以进行笛卡尔积。**没有关联关系的数据得出的笛卡尔积,通常也没有意义。 |


二、什么是联合查询?

在MySQL中,联合查询是一种查询多个表的多个列的查询,通过取笛卡尔积,这些表和列被组合成一个结果集。联合查询通常用于查询多个表之间的关联数据。

++联合查询的常见方式包括:++ 内连接、外连接、自连接、子查询(嵌套查询)、合并查询


三、内连接

3.1 简介

内连接是查询两个表或多个表之间的关联数据,返回两个表之间的交集数据。内连接是默认的连接类型,如果不指定连接类型,那么 查询默认为内连接

3.2 语法

|-------|------------------------------------------|
| 基本语法: | select * from 表1 join 表2 on 关联条件; |
| 基本语法: | select * from 表1,表2 where 关联条件; |
| 释义: | 根据关联条件,全列查询指定表的笛卡尔积。 以上两种写法效果一致。 可以指定别名。 |

以上语法只进行了基本的查询,后续往往需要根据需要根据需求对表的内容进行精简

++查询和精简步骤:++

|----------------------------------|
| 1、进行笛卡尔积 |
| 2、指定表之间的关联条件 |
| 3、指定结果集的筛选条件 |
| 4、指定需要打印的列(对需要打印的列进行精简或聚合运算) |

|---------------------|---------------------------------------------------------------|
| join on 语法: | select 需要打印的列名... from 表1 join 表2 on 关联条件 and 结果集的其他筛选条件; |
| where语法: | select 需要打印的列名... from 表1,表2 where 关联条件 and 结果集的其他筛选条件; |

3.3 更多的表

在超过两个表做笛卡尔积时,两种语法分别是怎样添加对应语句的?

++假设此时有三个表做笛卡尔积:++

|-----------------|---------------------------------------------------------------------------------------|
| join on 语法: | select 需要打印的列名... from 表1 join 表2 on 关联条件 join 表3 on 关联条件 and 结果集的其他筛选条件; |
| where 语法: | select 需要打印的列名... from 表1,表2,表3 where 关联条件,关联条件 and 结果集的其他筛选条件; |

第一种写法清晰地表达了表之间是什么关联条件;而第二种写法则更为简洁,但表之间的关联条件却写成一团;两种写法各有各的优点。

3.4 操作演示


四、外连接

4.1 简介

外连接也是查询两个表之间的关联数据,但有所不同的是,内连接查询的是两个表的交集,而外连接则会以一侧的表为主,显示所有列

4.2 语法

**外连接需要使用 left join 或 right join 子句指定连接方向。**使用 left join 表示完全显示左侧表,称为左外连接;使用 right join 表示完全显示右侧表,称为右外连接。

|---------|--------------------------------------------------------------------------------|
| 语法: | select 需要打印的列名... from 表1 left join 表2 on 关联条件 and 结果集的其他筛选条件; |
| 释义: | 根据关联条件和结果集的其他筛选条件,以指定的左侧表为主,查询指定表中指定的列数据。 |

4.3 操作演示


五、自连接

5.1 简介

自连接是指一个表和自己进行笛卡尔积 ,这种查询方式应用场景不多,在需要将行关系转化成列关系时可以使用

|---------|-----------------------------------------------------------|
| 语法: | select * from 表名 as 别名1,表名 as 别名2; |
| 释义: | 指定一个表和自己进行笛卡尔积,并打印结果集。 由于在同一个语句中表名相同,因此自连接需要使用别名。 |

++没有使用别名将报错:++

5.2 自连接非必要不使用

++假设有以下场景:++

从上图可知,除了行列关系不同,使用其他方法可以和自连接获得一样的数据,但是自连接还需要对数据进行笛卡尔积,查询开销大。 因此,自连接的查询方式并不常用。如果出现一定要使用自连接进行查询才能获得正确数据的情况,此时则应考虑表的设计是否存在缺陷。


六、子查询(嵌套查询)

6.1 简介

子查询是嵌套在主查询内部的SQL查询,它返回一个结果集,然后被用作主查询的条件。子查询需要使用where子句,并将其放在主查询的括号内。

|---------|----------------------------------|
| 语法: | 主查询语句 where 包含(子查询语句)的条件表达式; |
| 释义: | 使用子查询语句返回的结果集作为主查询语句的条件。 |

6.2 in 和 exists 关键字

子查询语句可以配合 in 和 exists 关键字使用。

|---------------------|--------------------|
| 关键字 | 释义 |
| in / exists | 包含在(子查询语句返回的结果集中) |
| not in / not exists | 不包含在(子查询语句返回的结果集中) |

6.3 子查询可能让简单的语句变复杂


七、合并查询

7.1 简介

合并查询用于查询多个表的多个列的查询,这些表和列将被组合成一个结果集。在前后查询的结果集中,列的类型和数量需要一致,列名则不需要一致。

合并查询需要使用 union 或 union all 关键字。

|---------------|--------------------|
| 关键字 | 说明 |
| union | 取得两个结果集的并集,去重 |
| union all | 取得两个结果集的并集,不去重 |

|---------|------------------------|
| 语法: | 查询语句1 union 查询语句2; |
| 释义: | 将两个查询的结果集合并,去重,打印。 |

7.2 合并查询可能让简单的语句变复杂


八、MySQL 中各个关键字的执行顺序

|------|----|------|-------|----------|------|--------|--------|----------|----------|-------|
| from | on | join | where | group by | with | having | select | distinct | order by | limit |
| >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> |||||||||||

关键字从左到右,优先级依次从高到低。优先级高的关键字先执行。


阅读指针 -> 《数据库中的索引是什么?》

链接生成中...........

相关推荐
ThisIsClark2 分钟前
【后端面试总结】MySQL索引
mysql·面试·职场和发展
LightOfNight1 小时前
Redis设计与实现第14章 -- 服务器 总结(命令执行器 serverCron函数 初始化)
服务器·数据库·redis·分布式·后端·缓存·中间件
代码中の快捷键1 小时前
MySQL数据库存储引擎的数据结构
数据结构·数据库·mysql
Adolf_19931 小时前
Django 路由层
数据库
好记忆不如烂笔头abc1 小时前
logminer挖掘日志归档查找问题
数据库·sql·mysql
java_heartLake9 小时前
PostgreSQL数据库参数调优实践
数据库·postgresql·调优
xnuscd10 小时前
Milvus概念
数据库·学习·mysql
代码欢乐豆11 小时前
软件工程第13章小测
服务器·前端·数据库·软件工程
小gpt&12 小时前
实现qt拖拽显示或者播放
数据库·qt·音视频
云边的快乐猫12 小时前
navicat远程连接虚拟机centos系统的mysql
linux·mysql·centos·虚拟机·navicat