首页 > 数据库 >mysql join语法解析

mysql join语法解析

时间:2024-10-08 21:14:13浏览次数:9  
标签:JOIN mysql t1 语法 tbl table join SELECT LEFT

 


MySQL 支持以下 JOIN 语法用于 SELECT 语句和多表 DELETE 和 UPDATE 语句中的 table_references 部分:

table_references:

查询中涉及的一个或多个表的引用,可以是简单表名或 JOIN 表达式的组合。

escaped_table_reference [, escaped_table_reference] ...

escaped_table_reference:

带有特定语法的表引用,可能包含外部连接(OUTER JOIN)的标记。

{ table_reference | { OJ table_reference } }

table_reference:

{ table_factor | joined_table }

table_factor:

表的基本引用,可以是实际表、子查询或派生表。

{
  tbl_name [PARTITION (partition_names)]
  [[AS] alias] [index_hint_list]
  | [LATERAL] table_subquery [AS] alias [(col_list)]
  | ( table_references )
}

joined_table:

由两个或多个表通过 JOIN 语法组合而成的表。

{
  table_reference {[INNER | CROSS] JOIN | STRAIGHT_JOIN} table_factor [join_specification]
  | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_specification
  | table_reference NATURAL [INNER | {LEFT|RIGHT} [OUTER]] JOIN table_factor
}

join_specification:

指定如何连接表的条件。

ON search_condition | USING (join_column_list)

join_column_list:

column_name[, column_name] ...

index_hint_list:

给优化器的提示,指示使用特定索引来提高查询性能。

index_hint[ index_hint] ...

index_hint:

单个索引提示,包括使用、忽略或强制特定索引。

USE {INDEX|KEY} [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
| {IGNORE|FORCE} {INDEX|KEY} [FOR {JOIN|ORDER BY|GROUP BY}] (index_list)

index_list:

一个或多个索引的名称列表,通常在 index_hint 中使用。

index_name [, index_name] ...

其他说明:

表引用也称为连接表达式。当表引用指向分区表时,可以包含 PARTITION 子句,包括用逗号分隔的分区、子分区或两者。这个选项跟在表名之后,位于任何别名声明之前。这个选项的效果是仅从列出的分区或子分区中选择行。未在列表中命名的分区或子分区将被忽略。

与标准 SQL 相比,MySQL 在 table_factor 的语法上进行了扩展。标准只接受 table_reference,而不接受一对括号内的列表。这种扩展是保守的,如果将 table_reference 项目列表中的每个逗号视为等同于内连接。例如:

SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)

等价于:

SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)
ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)

在 MySQL 中,JOINCROSS JOININNER JOIN 是语法等价的(可以互换使用)。在标准 SQL 中,它们并不等价。INNER JOIN 使用 ON 子句,而 CROSS JOIN 则在其他情况下使用。

通常,在仅包含内连接操作的连接表达式中,可以忽略括号。MySQL 还支持嵌套连接。

可以指定索引提示,以影响 MySQL 优化器如何使用索引。优化器提示和 optimizer_switch 系统变量是影响优化器使用索引的其他方式。

编写连接时需要考虑的常见因素:

可以使用 tbl_name AS alias_nametbl_name alias_name 来为表引用取别名:

SELECT t1.name, t2.salary
FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;

SELECT t1.name, t2.salary
FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;

table_subquery 也称为派生表或 FROM 子句中的子查询。这样的子查询必须包含别名,以为子查询结果提供表名,并可以选择性地在括号中包含列名列表。以下是一个简单示例:

SELECT * FROM (SELECT 1, 2, 3) AS t1;

在单个连接中可以引用的表的最大数量为 61。这包括通过将派生表和视图合并到外部查询块中处理的连接。

在没有连接条件的情况下,INNER JOIN 和逗号(,)在语义上是等价的:两者在指定表之间产生笛卡尔积(即,第一个表中的每一行都与第二个表中的每一行连接)。

然而,逗号运算符的优先级低于 INNER JOINCROSS JOINLEFT JOIN 等。如果在有连接条件的情况下将逗号连接与其他连接类型混合使用,则可能会发生“Unknown column 'col_name' in 'on clause'”错误。

有关处理此问题的信息将在本节后面提供。

注意事项:

ON 中使用的 search_condition 是可以在 WHERE 子句中使用的任何条件表达式。通常,ON 子句用于指定如何连接表的条件,而 WHERE 子句限制包含在结果集中的行。

如果在 LEFT JOIN 中右表没有匹配的行,则使用所有列设置为 NULL 的行作为右表。可以利用这一点找到在一个表中没有对应行的行:

SELECT left_tbl.*
FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id
WHERE right_tbl.id IS NULL;

这个示例找到了所有在 left_tbl 中具有 id 值但在 right_tbl 中不存在的行(即,所有在 left_tbl 中没有对应行的行)。

USING(join_column_list) 子句命名必须存在于两个表中的列的列表。如果表 a 和 b 都包含列 c1、c2 和 c3,以下连接比较两个表中对应的列:

a LEFT JOIN b USING (c1, c2, c3)

两个表的 NATURAL [LEFT] JOIN 定义为在语义上等价于 INNER JOINLEFT JOIN,使用列出所有在两个表中都存在的列的 USING 子句。

RIGHT JOIN 的工作方式与 LEFT JOIN 类似。为了保持代码在不同数据库间的可移植性,建议使用 LEFT JOIN 而不是 RIGHT JOIN

{ OJ ... } 语法在连接语法描述中仅用于与 ODBC 的兼容性。语法中的大括号应写成字面意义;它们不是在语法描述中使用的元语法。

SELECT left_tbl.*
FROM { OJ left_tbl LEFT OUTER JOIN right_tbl ON left_tbl.id = right_tbl.id }
WHERE right_tbl.id IS NULL;

可以在 { OJ ... } 中使用其他类型的连接,如 INNER JOINRIGHT OUTER JOIN。这有助于与某些第三方应用程序的兼容性,但不是官方的 ODBC 语法。

STRAIGHT_JOINJOIN 类似,但左表始终在右表之前读取。这可以用于少数(很少)情况下,连接优化器以次优顺序处理表。

连接示例:

SELECT * FROM table1, table2;

SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;

SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id;

SELECT * FROM table1 LEFT JOIN table2 USING (id);

SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
LEFT JOIN table3 ON table2.id = table3.id;

自然连接和使用 USING 的连接,包括外连接变体,根据 SQL:2003 标准进行处理:

NATURAL 连接的冗余列不会出现。考虑以下一组语句:

CREATE TABLE t1 (i INT, j INT);
CREATE TABLE t2 (k INT, j INT);
INSERT INTO t1 VALUES(1, 1);
INSERT INTO t2 VALUES(1, 1);
SELECT * FROM t1 NATURAL JOIN t2;
SELECT * FROM t1 JOIN t2 USING (j);

在第一个 SELECT 语句中,列 j 在两个表中都出现,因此成为连接列,因此根据标准 SQL,它应该只出现一次,而不是两次。类似地,在第二个 SELECT 语句中,列 j 在 USING 子句中命名,应该只出现一次,而

不是两次。

因此,语句产生的输出为:

+------+------+------+
| j    | i    | k    |
+------+------+------+
|    1 |    1 |    1 |
+------+------+------+

冗余列的消除和列的排序按照...

标签:JOIN,mysql,t1,语法,tbl,table,join,SELECT,LEFT
From: https://www.cnblogs.com/arnozhang/p/18452553

相关文章

  • MySQL【一】
    数据库基础知识基础概念介绍数据库:数据库(DataBase简称DB)就是信息的集合或者说数据库是由数据库管理系统管理的数据的集合。 数据库管理系统: 数据库管理系统(DatabaseManagementSystem简称DBMS)是一种操纵和管理数据库的大型软件,通常用于建立、使用和维护数据库......
  • 通过sysbench工具实现MySQL数据库的性能测试
    1.背景 sysbench是一款压力测试工具,可以测试系统的硬件性能,也可以用来对数据库进行基准测试。sysbench支持的测试有CPU运算性能测试、内存分配及传输速度测试、磁盘IO性能测试、POSIX线程性能测试、互斥性测试测试、数据库性能测试(OLTP基准测试)。目前支持的数据库主要是My......
  • 【MYSQL】MYSQL约束-----非空约束(not null)和唯一约束(unique)
    1、概念MYSQL非空约束(notnull),指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库就会报错。注意:非空约束一张表中可以有多个。2、语法方式1:在创建表时指定(常用)<字段名><数据类型>not null例如:create table  t_user(i......
  • 免费送源码:Java+spring boot+MySQL springboot社区快递代取服务系统 计算机毕业设计原
    摘 要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对社区快递代取服务系统等问题,对社区快递代取服务系统进行研究分析,然后开发设计出社区快递代......
  • MySQL慢查询优化&缩容实践
    索引调整在一个数据量较大的订单表中,发现某些查询因为缺少合适的索引而变慢。添加了必要的索引后,查询效率明显提升。查询条件调整在一个sql中需要根据时间条件查询,但是等号左边的字段使用了函数操作(将时间戳转换成了年月日),导致索引失效进行了全表扫描。解决:将等号右边的条件反......
  • MySQL的基本语法(增,删,改,查)
    MySQL的基本语法(增,删,改,查)MySQL中的(增)操作创建数据库CREATEDATABASE库名;例如:CREATEDATABASEdb;创建一个名为db的数据库。创建列表use数据库名;CREATETABLE表名(字段名1数据类型1,字段名2数据类型2);例如:usedb;CREATETABLEplayers(uidBI......
  • Prometheus + Grafana 监控 MySQL 数据库
    文章目录1、前置介绍2、搭建流程2.1、安装Docker2.2、安装MySQL2.3、安装MySQLExporter2.4、安装Prometheus2.5、安装Grafana1、前置介绍本次监控平台搭建,我使用2台阿里云服务器来完成本次的搭建部署操作,配置如下:阿里云ECS1:2核2G,Ubuntu22.02,内网ip:172.16.0......
  • MySQL数据库备份与恢复
    MySQL数据库的备份与恢复是数据库管理中至关重要的一部分。无论是在Windows还是Linux系统上,掌握这些技能都能有效保护数据,防止数据丢失。本文将详细介绍MySQL数据库的备份与恢复方法,包括常用工具和步骤。一、备份MySQL数据库1.使用 mysqldump 工具mysqldump是......
  • linux中mysql5.7安装
    系统要求:CentOS7.664位卸载系统自带mariadb-lib1、rpm-qa|grepmariadb2、rpm-emariadb-libs-5.5.68-1.el7.x86_64 --nodeps 解压tar包:tar-xvfmysql*.tar以下加粗rpm包需要安装:mysql-community-common-5.7.23-1.el7.x86_64.rpmmysql-community-libs-co......
  • MySQL与RESTfulAPI
    MySQL与RESTfulAPI 2024-01-2566阅读7分钟 1.背景介绍MySQL与RESTfulAPI是一个非常重要的技术主题,它们在现代互联网应用中扮演着关键角色。在这篇文章中,我们将深入探讨这两个技术的核心概念、算法原理、最佳实践以及实际应用场景。1.背景介绍MySQL是一种流行的关......