MySQL 连接查询

在这里插入图片描述

文章目录

  • 1.什么是连接查询
  • 2.连接类型
    • 内连接
    • 交叉连接
    • 左连接
    • 右连接
    • 自然连接
  • 3.连接条件
  • 4.隐式连接
    • 使用逗号连接表
    • 逗号与 JOIN 的优先级
  • 5.全外连接
  • 6.小结
  • 参考文献

1.什么是连接查询

在关系型数据库管理系统(RDBMS)中,连接查询是一项重要的数据库操作,它允许我们从多个表中检索和组合数据,以便进行更复杂的查询和分析。

比如员工的个人信息存储在 employee 表中,部门相关的信息存储在 department 表中,同时 employee 表中存在一个外键字段(dept_id),引用了 department 表的主键字段。

因此,当我们想要查看员工的个人信息以及他/她所在的部门信息,就需要同时查询 employee 和 department 表中的信息。此时,我们需要使用连接查询。连接查询(JOIN)可以基于两个表中的连接字段将数据行拼接到一起,返回两表中的相关数据。

2.连接类型

MySQL 支持 SELECT 语句以及多表 DELETE 和 UPDATE 语句中使用 JOIN。

MySQL 支持多种类型的 JOIN:

  • 内连接(INNER JOIN)
  • 交叉连接(CROSS JOIN)
  • 左连接(LEFT JOIN)
  • 右连接(RIGHT JOIN)
  • 自然连接(NATURAL JOIN)

不管是哪种连接,本质上都是在总的笛卡尔积下进行筛选过滤。

内连接

内连接写作 JOIN 或 INNER JOIN。

内连接返回两个表中满足连接条件的记录。
在这里插入图片描述

SELECT columns
FROM
table1 INNER JOIN table2 ON table1.column = table2.column;

交叉连接

交叉连接写作 CROSS JOIN。

实际上,在 MySQL 中(仅限于 MySQL)CROSS JOIN 与 JOIN 和 INNER JOIN 的表现是一样的,在不指定 ON 条件得到的结果都是笛卡尔积,反之取两个表各自匹配的结果。
在这里插入图片描述

SELECT columns
FROM
table1 CROSS JOIN table2;

因为交叉连接无法使用维恩图进行描述,所以这里不用维恩图(Venn Diagram)表示 CROSS JOIN 的结果。

左连接

左连接写作 LEFT JOIN 或 LEFT OUTER JOIN。

左连接返回左表中所有记录,以及与右表中满足连接条件的记录。如果右表中没有匹配的记录,对应位置将显示为 NULL。
在这里插入图片描述

SELECT columns
FROM
table1 LEFT JOIN table2 ON table1.column = table2.column;

右连接

右连接写作 RIGHT JOIN 或 RIGHT OUTER JOIN。

右连接与左连接类似,但是返回右表中所有记录,以及与左表中满足连接条件的记录。如果左表中没有匹配的记录,对应位置将显示为 NULL。
在这里插入图片描述

SELECT columns
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column;

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

自然连接

使用 NATURAL 关键字与其他类型的 JOIN 组合表示自然连接。

NATURAL [INNER | {LEFT|RIGHT} [OUTER]] JOIN

自然连接相当于不能指定连接条件的连接,MySQL 会使用左右表内相同名字和类型的字段作为连接条件。也就是说 NATURAL JOIN 两个表,与使用 USING 子句指定两个表所有同名列的 JOIN 在语义上等价。

假设 t1 表有 i 和 j 列,t2 表有 k 和 j 列,那么下面两个 JOIN 查询是等价的:

SELECT * FROM t1 NATURAL JOIN t2;
SELECT * FROM t1 JOIN t2 USING (j);

3.连接条件

连接表我们可以用两个关键字 ON 和 USING 指定连接条件。

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

USING(join_column_list) 子句指定两个表中都必须存在的列的列表。

如果表 a 和 b 都包含列 c1、c2 和 c3,则以下连接分别使用 USING 和 ON 指定连接条件是等价的。

a LEFT JOIN b USING (c1, c2, c3)
a LEFT JOIN b ON a.c1 = b.c1 AND a.c2 = b.c2 AND a.c3 = b.c3

关于确定哪些行满足连接条件,两个连接在语义上是相同的。

但是关于确定为 SELECT * 显示哪些列,这两个联接在语义上并不相同。 USING 连接选择相应列的合并值,而 ON 连接选择所有表中的所有列。 对于 USING 连接,SELECT * 选择以下值:

COALESCE(a.c1, b.c1), COALESCE(a.c2, b.c2), COALESCE(a.c3, b.c3)

对于 ON 连接,SELECT * 选择以下值:

a.c1, a.c2, a.c3, b.c1, b.c2, b.c3

4.隐式连接

使用逗号连接表

当使用逗号而不是 JOIN 连接表时,为隐式连接。

如果指定条件,相当于 INNER JOIN。如果不指定条件,相当于执行 CROSS JOIN。

以 a 和 b 表为例,测试一下。

SELECT * FROM a;
+------+------+
| id   | col  |
+------+------+
|    1 |   11 |
|    2 |   12 |
+------+------+SELECT * FROM b;
+------+------+
| id   | col  |
+------+------+
|    2 |   22 |
|    3 |   23 |
+------+------+# 隐式连接不指定条件,相当于执行 CROSS JOINSELECT * FROM a, b;
+------+------+------+------+
| id   | col  | id   | col  |
+------+------+------+------+
|    1 |   11 |    2 |   22 |
|    2 |   12 |    2 |   22 |
|    1 |   11 |    3 |   23 |
|    2 |   12 |    3 |   23 |
+------+------+------+------+# 隐式连接指定条件,相当于执行 INNER JOINSELECT * FROM a,b WHERE a.id=b.id;
+------+------+------+------+
| id   | col  | id   | col  |
+------+------+------+------+
|    2 |   12 |    2 |   22 |
+------+------+------+------+# 显示执行 INNER JOINSELECT* FROM a JOIN b ON a.id=b.id;
+------+------+------+------+
| id   | col  | id   | col  |
+------+------+------+------+
|    2 |   12 |    2 |   22 |
+------+------+------+------+

逗号是隐式连接运算符。隐式连接是SQL92中的标准内容,而在SQL99中显式连接才是标准,虽然很多人还在用隐私连接,但是它已经从标准中被移除。推荐使用显示连接,因为可以更清楚地显示多个表之间连接关系和连接依赖的属性。

逗号与 JOIN 的优先级

当逗号与 JOIN 同时使用时,JOIN 的优先级高于逗号运算符 (,)。因此,连接表达式 t1, t2 JOIN t3 被解释为 (t1, (t2 JOIN t3)),而不是 ((t1, t2) JOIN t3)。这会影响 ON 子句,因为该子句只能引用连接表中的列。

CREATE TABLE t1 (i1 INT, j1 INT);
CREATE TABLE t2 (i2 INT, j2 INT);
CREATE TABLE t3 (i3 INT, j3 INT);
INSERT INTO t1 VALUES(1, 1);
INSERT INTO t2 VALUES(1, 1);
INSERT INTO t3 VALUES(1, 1);
SELECT * FROM t1, t2 JOIN t3 ON (t1.i1 = t3.i3);

JOIN 优先于逗号运算符,因此 ON 子句的操作数是 t2 和 t3。 由于 t1.i1 不是任一操作数中的列,因此结果将报错Unknown column 't1.i1' in 'on clause'

如果想使上面的查询正确执行,可以采取下面两个措施:

  1. 使用括号将 t1, t2 显示组合在一起。
SELECT * FROM (t1, t2) JOIN t3 ON (t1.i1 = t3.i3);
  1. 避免使用逗号运算符并使用 JOIN 代替。
SELECT * FROM t1 JOIN t2 JOIN t3 ON (t1.i1 = t3.i3);

5.全外连接

全外连接写作 FULL JOIN 或 FULL OUTER JOIN。

外连接是求两个集合的并集。从笛卡尔积的角度讲就是从笛卡尔积中挑出 ON 子句条件成立的记录,然后加上左表中剩余的记录,最后加上右表中剩余的记录。
在这里插入图片描述
MySQL 不支持全外连接,但是我们可以对左连接和右连接的结果做 UNION 操作(会去除重复行)来实现。

6.小结

连接查询是MySQL强大而常用的功能,它允许我们从多个表中检索和组合数据,以满足复杂的查询需求。

MySQL支持多种连接类型,包括 INNER JOIN、CROSS JOIN、LEFT JOIN、RIGHT JOIN 和 NATURAL JOIN,每种类型都有其特定的用途和语法。

通过理解连接查询的基本概念和 MySQL 支持的连接类型,你可以更好地利用 MySQL 来处理复杂的数据查询和分析任务,提高数据库应用的灵活性和功能性。


参考文献

MySQL 8.0 Reference Manual :: 13.2.13.2 JOIN Clause

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/127315.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

桉木板材的优缺点

桉木(Eucalyptus)是一种常见的木材品种,具有一些独特的特点和用途。以下是桉木板材的一些优点和缺点: 优点:强度高:桉木具有较高的密度和强度,使其在承重和结构应用中表现出色。它的强度比一些其…

C# 命令行参数分割

CommandLineToArgvW 函数 [DllImport("shell32.dll", SetLastError true)] private static extern IntPtr CommandLineToArgvW([MarshalAs(UnmanagedType.LPWStr)] string lpCmdLine, out int pNumArgs); 参数: [in] lpCmdLine 类型:…

C++学习笔记(堆栈、指针、命名空间、编译步骤)

C 1、堆和栈2、指针2.1、指针的本质2.2、指针的意义2.3、清空指针2.4、C类中的this 3、malloc and new4、命名空间4.1、创建命名空间4.2、使用命名空间 5、编译程序的四个步骤5.1、预处理5.2、编译5.3、汇编5.4、链接 1、堆和栈 堆(heap)和栈&#xff0…

Jenkins Jenkinsfile管理 Pipeline script from SCM

一、Jenkinsfile理解 Jenkins Pipeline 提供了一套可扩展的工具,用于将“简单到复杂”的交付流程实现为“持续交付即代码”。Jenkins Pipeline 的定义通常被写入到一个文本文件(称为 Jenkinsfile )中,该文件可以被放入项目的源代码…

RK开发板的USB连接(Ubuntu)

一、安装连接工具 sudo apt-get install putty 二、启动putty工具 sudo putty 三、连接usb,并查看相关的信息 # 查看接入的是否有usb ls /dev/tty* 显示如下:(含有usb接口: /dev/ttyUSB0) /dev/tty /dev/tty23 /d…

设计模式-01简单工厂模式详解 详细代码对比

目录 ChatGpt问答原生代码简单工厂模式代码 简单工厂模式(Simple Factory Pattern)新增boat 对比两种方法原生代码为什么使用强制转换?简单工厂模式 简单工厂方法总结与原生代码的区别:优点:缺点: 参考 本文将介绍什么…

直接接入电商API接口实现调用封装好的商品详情SKU数据参数及返回

什么是API? API全称为Application Programming Interface,中文是应用程序编程接口。它其实是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工…

Python判断多个文件夹的文件夹名是否包含“分公司”或“营销中心”怎么处理?(方法一)...

点击上方“Python爬虫与数据挖掘”,进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 晓畅军事,试用于昔日。 大家好,我是皮皮。 一、前言 前几天在Python最强王者群【哎呦喂 是豆子~】问了一个Python自…

【日常笔记】使用Server过程中可能遇到的一些问题

使用Server过程中可能遇到的一些问题 1. 如何查找GPU型号与驱动版本之间的关系?2. 如何查看当前Server的内核版本?3. 使用Nvidia过程中可能用到的命令4. 对Jupyter Notebook的一些配置5. TensorFlow的一般操作6. 使用PyTorch的一些操作7. 修改安装源为国…

Yolov8-pose关键点检测:模型轻量化创新 | ​BiLevelRoutingAttention 动态稀疏注意力 | CVPR2023 BiFormer

💡💡💡本文解决什么问题:BiLevelRoutingAttention ,通过双层路由(bi-level routing)提出了一种新颖的动态稀疏注意力(dynamic sparse attention ) ​BiLevelRoutingAttention | GFLOPs从9.6降低至8.5,参数量从6482kb降低至6134kb, mAP50从0.921提升至0.926 Yolov8…

二蛋赠书一期:《快捷学习Spring》

文章目录 前言活动规则参与方式本期赠书《快捷学习Spring》关于本书作者介绍内容简介读者对象 结语 前言 大家好!我是二蛋,一个热爱技术、乐于分享的工程师。在过去的几年里,我一直通过各种渠道与大家分享技术知识和经验。我深知&#xff0c…

自然语言处理 微调ChatGLM-6B大模型

自然语言处理 微调ChatGLM-6B大模型 1、GLM设计原理2、大模型微调原理1、P-tuning v2方案2、LORA方案 1、GLM设计原理 bert的主要任务是随机的去除掉某个单词,使用上下文将其预测出来(相当于完形填空任务); GPT的主要任务是根据前…

二、环境配置,项目运行 —— TinyWebServer

环境配置,项目运行 —— TinyWebServer 一、前言 上一期已经介绍过这个项目的基本结构,不懂得可以点开主页查找。 写代码前。一般的步骤就是,先把别人的代码下载下来运行。一、一方面看看最终效果是否是自己想要的,二、掌握项目…

工程可以编译通过,但是Vscode依然有波浪线提示

前言 (1)我们在使用Vscode进行开发的时候,命名文件成功编译通过了,但是Vscode还是有波浪线的提示。 (2)其实成功编译通过就行,但是肯定还会存在一些强迫症患者,硬要消除这个报错。接…

基本数据类型和包装类型 使用规范

使用规范 1 概念1.1 基本数据类型1.2 包装类型1.3 对应关系1.4 自动装箱/拆箱 2 变量类型2.1 全局变量2.1.1 常量(Constants)2.1.2 类变量(Class Variables)2.1.3 实例变量(Instance Variables) 2.2 局部变…

ShopXO商城系统文件上传0Day代审历程

Git仓库: https://github.com/gongfuxiang/shopxo简介: 两天攻防中,某政局内网横向发现多网段服务器,该服务器搭建了ShopXO商城系统(后来发现是开发临时搭建的,准备做二开用的)。结果花了30来秒审了个垃圾Day拿下该服…

百度文心一言GPT免费入口也来了!!!

文心一言入口地址:文心一言能力全面开放 文心一言是百度全新一代知识增强大语言模型,文心大模型家族的新成员,能够与人对话互动,回答问题,协助创作,高效便捷地帮助人们获取信息、知识和灵感。 文心一言的技…

光源控制器光源亮度调节操作说明

光源控制器光源亮度调节操作说明 光源亮度的调节在许多应用中都扮演着至关重要的角色,不仅影响图像质量,还能改善工作环境。下面是关于光源控制器光源亮度调节的详细操作步骤,帮助您轻松实现亮度的合适调整。 步骤一:登录系统 …

【C++】常用拷贝和替换算法

0.前言 1.copy #include <iostream> using namespace std;// 常用拷贝算法 copy #include<vector> #include<algorithm>void myPrint(int val) {cout << val << " "; }void test01() {vector<int>v;for (int i 0; i < 10; i…

企业架构LNMP学习笔记32

企业架构LB-服务器的负载均衡之LVS实现&#xff1a; 学习目标和内容 1&#xff09;能够了解LVS的工作方式&#xff1b; 2&#xff09;能够安装和配置LVS负载均衡&#xff1b; 3&#xff09;能够了解LVS-NAT的配置方式&#xff1b; 4&#xff09;能够了解LVS-DR的配置方式&…