06_mysql多表查询的方式_92和99语法差别_99语法新特性

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 多表查询,内连接、外连接、union all、92语法与99语法的差别,以及99语法的新特性自然连接、USING连接

笛卡尔积(交叉连接)

# 笛卡尔积的错误使用方式,缺少了多表的连接条件
SELECT A表字段,B表字段
FROM A表,B表;

# 等同于下面这种方式
SELECT A表字段,B表字段
FROM A表 CROSS JOIN B表;

# 两个表的数据都交叉匹配了一遍。

# 正确方式:需要有连接条件
SELECT A表字段,B表字段
FROM A表,B表
#两个表的连接条件
WHERE A表.xxx_id = B表.yyy_id;

等值连接 vs 非等值连接

自连接 vs 非自连接

内连接 vs 外连接

内连接:inner join / join,可以省略 inner,查询结果和交叉连接类似

外连接:outer join,outer可以省略,具体看往下看

# 7.1 等值连接  vs  非等值连接

#非等值连接的例子:
SELECT A表字段,B表字段
FROM A表,B表
#where A表.xxx between B表.xxx and B表.xxx;
WHERE A表.xxx >= B表.xxx AND A表.xxx <= B表.xxx;

#7.2 自连接  vs  非自连接

#自连接的例子:
SELECT A表字段1, A表字段2
FROM A表 m ,A表 n
WHERE m.xxx = n.xxx;

#7.3 内连接  vs  外连接

# 内连接:查询两个表匹配上的字段
SELECT A表字段,B表字段
FROM A表,B表
WHERE A表.xxx_id = B表.yyy_id;

# 外连接:左外连接、右外连接、满外连接(mysql不支持FULL OUTER JOIN)

# 左外连接(LEFT OUTER JOIN/LEFT JOIN,OUTER可以省略):左表全部数据 + 两表匹配上的数据。
# 右外连接(RIGHT OUTER JOIN/RIGHT JOIN,OUTER可以省略):右表全部数据 + 两表匹配上的数据。

以上是SQL92语法,连接条件写在where中,SQL99语法连接写在on中:

# SQL99语法的连接join...on...
SELECT A表字段,B表字段,C表字段
FROM A表 a JOIN B表 b
ON a.xxx = b.xxx
JOIN C表 c
ON b.xxx = c.xxx;

UNION 和 UNION ALL的使用

UNION:会执行去重操作

UNION ALL:不会执行去重操作

结论:如果明确知道合并数据后的结果数据不存在重复数据,或者不需要去除重复的数据,则尽量使用UNION ALL语句,以提高数据查询的效率。

7种SQL JOINS的实现

41.png

左中图

#实现A - A∩B
select 字段列表
from A表 left join B表
on 关联条件
where 从表关联字段 is null and 等其他子句;

右中图

#实现B - A∩B
select 字段列表
from A表 right join B表
on 关联条件
where 从表关联字段 is null and 等其他子句;

左下图

#实现查询结果是A∪B
#用左外的A,union 右外的B
select 字段列表
from A表 left join B表
on 关联条件
where 等其他子句
union
select 字段列表
from A表 right join B表
on 关联条件
where 等其他子句;

右下图

#实现A∪B - A∩B 或 (A - A∩B) ∪ (B - A∩B)
#使用左外的 (A - A∩B) union 右外的(B - A∩B)
select 字段列表
from A表 left join B表
on 关联条件
where 从表关联字段 is null and 等其他子句
union
select 字段列表
from A表 right join B表
on 关联条件
where 从表关联字段 is null and 等其他子句

SQL99语法新特性(不够灵活,不推荐使用)

自然连接

SQL99 在 SQL92 的基础上提供了一些特殊语法,比如 NATURAL JOIN 用来表示自然连接。我们可以把自然连接理解为 SQL92 中的等值连接。它会帮你自动查询两张连接表中 所有相同的字段 ,然后进行 等值连接 。

在SQL92标准中:

SELECT 字段列表
FROM A表 a JOIN B表 b
ON a.key1 = b.key1
AND a.key2 = b.key2;

在 SQL99 中你可以写成:

SELECT 字段列表
FROM A表 NATURAL JOIN B表;

USING连接

当我们进行连接的时候,SQL99还支持使用 USING 指定数据表里的 同名字段 进行等值连接。但是只能配合JOIN一起使用。比如:

SELECT 字段列表
FROM A表 JOIN B表
USING (key);

你能看出与自然连接 NATURAL JOIN 不同的是,USING 指定了具体的相同的字段名称,你需要在 USING的括号 () 中填入要指定的同名字段。同时使用 JOIN...USING 可以简化 JOIN ON 的等值连接。它与下面的 SQL 查询结果是相同的:

SELECT 字段列表
FROM A表 a ,B表 b
WHERE a.key = b.key;

多表连接注意事项

我们要 控制连接表的数量 。多表连接就相当于嵌套 for 循环一样,非常消耗资源,会让 SQL 查询性能下降得很严重,因此不要连接不必要的表。在许多 DBMS 中,也都会有最大连接表的限制。

【强制】超过三个表禁止 join。需要 join 的字段,数据类型保持绝对一致;多表关联查询时, 保证被关联的字段需要有索引。
说明:即使双表 join 也要注意表索引、SQL 性能。
来源:阿里巴巴《Java开发手册》
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
SQL 自然语言处理 关系型数据库
MySQL的match匹配多个字符串的语法
【8月更文挑战第27天】MySQL的match匹配多个字符串的语法
205 67
|
2月前
|
JSON 关系型数据库 MySQL
MySQL 8.0 新特性
MySQL 8.0 新特性
131 10
MySQL 8.0 新特性
|
2月前
|
存储 Oracle 关系型数据库
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
从基本特性、技术选型、字段类型、事务提交方式、SQL语句、分页方法等方面对比Oracle和MySQL的区别。
416 18
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
|
30天前
|
SQL 安全 关系型数据库
MySQL8.2有哪些新特性?
【10月更文挑战第3天】MySQL8.2有哪些新特性?
34 2
|
1月前
|
关系型数据库 MySQL 数据库
MySQL的语法涵盖了数据定义、数据操作、数据查询和数据控制等多个方面
MySQL的语法涵盖了数据定义、数据操作、数据查询和数据控制等多个方面
58 5
|
1月前
|
关系型数据库 MySQL 数据库
MySQL的语法知识
MySQL的语法知识
17 4
|
1月前
|
SQL 关系型数据库 MySQL
MySQL语法
MySQL语法
63 3
|
22天前
|
SQL 存储 关系型数据库
mysql SQL必知语法
本文详细介绍了MySQLSQL的基本语法,包括SELECT、FROM、WHERE、GROUPBY、HAVING、ORDERBY等关键字的使用,以及数据库操作如创建、删除表,数据类型,插入、查询、过滤、排序、连接和汇总数据的方法。通过学习这些内容,读者将能更好地管理和操
11 0
|
2月前
|
关系型数据库 MySQL 数据库
MYSQL索引的分类与创建语法详解
理解并合理应用这些索引类型,能够有效提高MySQL数据库的性能和查询效率。每种索引类型都有其特定的优势,适当地使用它们可以为数据库操作带来显著的性能提升。
77 3
|
30天前
|
SQL 关系型数据库 MySQL
Mysql(2)—SQL语法详解
SQL(Structured Query Language,结构化查询语言)是一种用于管理关系型数据库的标准编程语言。它主要用于数据的查询、插入、更新和删除等操作。SQL最初在1970年代由IBM的研究人员开发,旨在处理关系数据模型。
25 0