百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

MySQL 多表连接查询详解_mysql如何进行多表连接查询

bigegpt 2025-02-18 10:37 8 浏览

连接:就是将多个表连城一个表输出的过程叫连接(关联)。

连接类型:交叉连接、内连接、外连接(左外连接、右外连接)、全连接、等值连接、非等值连接、自然连接

1.交叉连接:

A={1,2} B={a,b,c} C={X,Y}

A*B={(1,a),(1,b),(1,c),(2,a),(2,b),(2,c)}

A*B*C={(1,a,X),(1,b,X),(1,c,X),(2,a,X),(2,b,X),(2,c,X),(1,a,Y),(1,b,Y),(1,c,Y),(2,a,Y),(2,b,Y),(2,c,Y)}

交叉连接:用左表的每一行数据和右表的每一行数据两两相连,形成的新表就是交叉连接,交叉连接又叫笛卡尔积。我们把每个表看做是一个集合,表里每行数据看做是集合的一个元素,笛卡尔积就好比上边两个集合的乘积。现有a、b、c三张表如下。

语法:

select * from a cross join b; #结果如图1

以上语法也可以这样写:select * from a,b;

select * from a cross join b cross join c; #结果如图2、3

以上语法也可以这样写:select * from a,b,c;

2.内连接

内连接:在交叉连接的基础上,加上了连接条件(左表的某一列=右表某一列),从交叉连接的结果集里取出满足连接条件的行就是内连接。

语法:

select * from a inner join b on a2=b2; #结果如图3
select * from a inner join b on a2=b2 inner join c on b2=c2; #结果如图4
select * from a inner join (b inner join c on b2=c2) on a2=b2; #该语法和第二条语法等价,结果如图4

注意事项:

1)n个表进行内连接时,至少要n-1个连接条件。

2)两个表之间连接的列名如果一样,则必须要在列名前边加表名作为前缀。如果给表起了别名,则只能以别名作为列名的前缀。

3)一般情况下两个表之间连接条件,多取的是两个表相同的列名,或者意思相同的列名。

3.等值连接

等值连接:和内连接本质上是一样的都是在交叉连接的基础上加了连接条件,从交叉连接的结果集里边取出满足连接条件的行。连接的效率、连接结果和内连接都是一样的,区别就是语法不一样。

语法:

select * from a,b where a2=b2; #结果如图3
select * from a,b,c where a2=b2 and b2=c2; #结果如图4

4.自然连接

自然连接:如果两个表有相同的列名,则以相同的列名作为连接条件进行内连接,且查询结果中会自动把重复的列去掉,如果两个表没有相同列名就进行交叉连接。

语法:

select * from a NATURAL join b;
select * from a NATURAL join b NATURAL join c;

5.外连接

● 外连接:分为左外连接和右外连接。

● 左外连接:在内连接的基础上,额外返回左表在内连接中没有出现过的行,右侧用null代替,左外连接会保证左表的每一行数据至少出现一次。

● 右外连接:在内连接的基础上,额外返回右表在内连接中没有出现过的行,左侧用null代替,右外连接会保证右表的每一行数据至少出现一次。

注意事项:如果多个表进行外连接,要用左外连接,就一直用左外连接,不能前两个表左外连接后边的表又用右外连接或者内连接。且要想把某个表的所有行数据都显示出来则,应该把其作为最左边的表。右外连接类似。

左外连接语法:

select * from a left join b on a2=b2; #结果如图5
select * from a left join b on a2=b2 left join c on b2=c2; #结果如图6

右外连接语法:

select * from a right join b on a2=b2 ;
select * from a right join b on a2=b2 right join c on b2=c2;

6.全连接(满连接)

全连接:在内连接的基础上,额外返回左表在内连接中没出现的行,右侧用null代替,以及右表在内连接中没出现的行,左侧用null代替。注意mysql数据库中并没有直接的全连接语法,需要使用UNION关键字,将左外连接的结果和右外连接的结果取其并集,取两个查询结果集并集时需要注意列的个数,列的数据类型要一致。

语法:

select * from a left join b on a2=b2
UNION
select * from a right join b on a2=b2; #结果如图9

oracle 数据库有直接语法:select * from a full join b on a2=b2;

7.非等值连接

非等值连接:多个表直接没有连接条件,只有过滤条件的连接。(这里可先对各个表的行过滤,过滤后在进行交叉连接,也可以是先两个表交叉连接,连接之后在用过滤条件过滤)。

非等值连接没有具体的语法,举例如下:

select * from a,b where a2 in(2,3); #结果如图10
select * from a,b where a2=2 and b2 in(2,3); #结果如图11

多表连接时书写的思路:

1)先判断用什么连接方式。

2)接着分析需要用到哪些表,有时两个表直接没有直接的连接关系时,就要考虑用某个中间表来将这两个表连接起来。

3)确定表和表之间的连接条件,也就是列名,一般多是两个表相同的列名,或者意思相同的列名。

4)套连接语法。

5)把select * 中的*换成具体的列名,尽量不要使用*。

6)然后再看是否还需要进一步对连接后的数据进行过滤。如果要过滤,如果当前语句里有where,则加and过滤条件,如果没有where,则加where 过滤条件。

怎么判一个题目是用外连接还是内连接?

1)如果题目是查询一个表所有的...... 或者每一个.....有类似表的的多用外连接。

2)如果题目是查询满足...... 特定条件的数据,一般多用内连接。

3)只要是想显示某个表所有行数据,且还涉及到其他表的,一般多用外连接。

相关推荐

Linux 系统启动完整流程

一、启动系统流程简介如上图,简述系统启动的大概流程:1:硬件引导UEFi或BIOS初始化,运行POST开机自检2:grub2引导阶段系统固件会从MBR中读取启动加载器,然后将控制权交给启动加载器GRU...

超专业解析!10分钟带你搞懂Linux中直接I/O原理

我们先看一张图:这张图大体上描述了Linux系统上,应用程序对磁盘上的文件进行读写时,从上到下经历了哪些事情。这篇文章就以这张图为基础,介绍Linux在I/O上做了哪些事情。文件系统什么是...

linux入门系列12--磁盘管理之分区、格式化与挂载

前面系列文章讲解了VI编辑器、常用命令、防火墙及网络服务管理,本篇将讲解磁盘管理相关知识。本文将会介绍大量的Linux命令,其中有一部分在“linux入门系列5--新手必会的linux命令”一文中已经...

Linux环境下如何设置多个交叉编译工具链?

常见的Linux操作系统都可以通过包管理器安装交叉编译工具链,比如Ubuntu环境下使用如下命令安装gcc交叉编译器:sudoapt-getinstallgcc-arm-linux-gnueab...

可算是有文章,把Linux零拷贝技术讲透彻了

阅读本文大概需要6.0分钟。作者:卡巴拉的树链接:https://dwz.cn/BaQWWtmh本文探讨Linux中主要的几种零拷贝技术以及零拷贝技术适用的场景。为了迅速建立起零拷贝的概念...

linux软链接的创建、删除和更新

大家都知道,有的时候,我们为了省下空间,都会使用链接的方式来进行引用操作。同样的,在系统级别也有。在Windows系列中,我们称其为快捷方式,在Linux中我们称其为链接(基本上都差不多了,其中可能...

Linux 中最容易被黑客动手脚的关键目录

在Linux系统中,黑客攻击后常会针对关键目录和文件进行修改以实现持久化、提权或隐藏恶意活动。本文介绍下黑客最常修改的目录及其手法。一、/etc目录关键文件有:/etc/passwd和/et...

linux之间传文件命令之Rsync傻瓜式教程

1.前言linux之间传文件命令用什么命令?本文介绍一种最常用,也是功能强大的文件同步和传输工具Rsync,本文提供详细傻瓜式教程。在本教程中,我们将通过实际使用案例和最常见的rsync选项的详细说...

Linux下删除目录符号链接的方法

技术背景在Linux系统中,符号链接(symlink)是一种特殊的文件,它指向另一个文件或目录。有时候,我们可能需要删除符号链接,但保留其指向的目标目录。然而,在删除符号链接时可能会遇到一些问题,例如...

阿里云国际站注册教程:aa云服务器怎么远程链接?

在全球化的今天,互联网带给我们无以计数的便利,而云服务器则是其中的重要基础设施之一。这篇文章将围绕阿里云国际站注册、aa云服务器如何远程链接,以及服务器安全防护如Ddos防火墙、网站应用防护waf防火...

Linux 5.16 网络子系统大范围升级 多个新适配器驱动加入

Linux在数据中心中占主导地位,因此每个内核升级周期的网络子系统变化仍然相当活跃。Linux5.16也不例外,周一最新与网络相关的更新加入了大量的驱动和新规范的支持。一个较新硬件的驱动是Realt...

搭建局域网文件共享服务(Samba),手机电脑都能看喜欢的影视剧

作为一名影视爱好者,为了方便地观看自己喜欢的影视作品,在家里搞一个专门用来存放电影的服务器是有必要的。蚁哥选则用一台Ubuntu系统的电脑做为服务器,共享影音文件,其他同一个局域网内的电脑或手机可以...

分享一个实用脚本—centos7系统巡检

概述这周闲得慌,就根据需求写了差不多20个脚本(部分是之前分享过的做了一些改进),今天主要分享一个给平时运维人员用的centos7系统巡检的脚本,或者排查问题检查系统情况也可以用..实用脚本#!/bi...

Linux 中创建符号链接的方法

技术背景在Linux系统里,符号链接(SymbolicLink),也被叫做软链接(SoftLink),是一种特殊的文件,它指向另一个文件或者目录。符号链接为文件和目录的管理带来了极大的便利,比...

一文掌握 Linux 符号链接

符号链接(SymbolicLink),通常被称为“软链接”,是Linux文件系统中一种强大而灵活的工具。它允许用户创建指向文件或目录的“快捷方式”,不仅简化了文件管理,还在系统配置、软件开发和日...