目录
[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 |
| >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> |||||||||||
关键字从左到右,优先级依次从高到低。优先级高的关键字先执行。
阅读指针 -> 《数据库中的索引是什么?》
链接生成中...........