<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 |
| >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> |||||||||||

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


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

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

相关推荐
gavin_gxh5 分钟前
ORACLE 删除archivelog日志
数据库·oracle
一叶飘零_sweeeet8 分钟前
MongoDB 基础与应用
数据库·mongodb
猿小喵24 分钟前
DBA之路,始于足下
数据库·dba
tyler_download33 分钟前
golang 实现比特币内核:实现基于椭圆曲线的数字签名和验证
开发语言·数据库·golang
weixin_449310841 小时前
高效集成:聚水潭采购数据同步到MySQL
android·数据库·mysql
CodingBrother1 小时前
MySQL 和 PostgreSQL 的使用案例
mysql·adb·postgresql
Cachel wood2 小时前
Github配置ssh key原理及操作步骤
运维·开发语言·数据库·windows·postgresql·ssh·github
standxy2 小时前
如何将钉钉新收款单数据高效集成到MySQL
数据库·mysql·钉钉
Narutolxy3 小时前
MySQL 权限困境:从权限丢失到权限重生的完整解决方案20241108
数据库·mysql
Venchill3 小时前
安装和卸载Mysql(压缩版)
数据库·mysql