SQL基础理论篇(六):多表的连接方式

文章目录

  • 简介
  • 笛卡尔积
  • 等值连接
  • 非等值连接
  • 外连接
  • 自连接
  • 其他
  • SQL92与SQL99中连接的区别
  • 不同DBMS下使用连接的注意事项
  • 参考文献

简介

SQL92中提供了5类连接方式,分别是笛卡尔积、等值连接、非等值连接、外连接(左连接、右连接、全外连接(full outer join、全连接))和自连接。

SQL99标准中基本一致,分别是交叉连接、自然连接、外连接(左外连接、右外连接和全外连接)和自连接,并补充了on和using这两种操作符来指定我们需要的连接条件。

笛卡尔积

笛卡尔积是一个数学运算。假设有A和B两个集合,则这两个集合的笛卡尔积就是它俩的所有可能组合。

select * from A, B;

假设A表有m行数据,B表有n行数据,那么最终的结果集里就会有m*n行,即所有的组合情况,这就是笛卡尔积。

笛卡尔积在SQL99中又称为交叉连接,即cross join。它的作用是可以把任意表做连接,即使这些表之间并不相关。

select * from A cross join B;

但是事实上直接这样使用笛卡尔积是非常粗暴的,所以我们通常在使用连接的时候还是会加上筛选条件的,即where,这就诞生了下一步要说的等值连接

等值连接

等值连接的话,就需要两张表有关联了,即需要两表有相同或相似的字段,可以用来做连接时的筛选。

select * from A, B where a.team_id = b.team_id;

可以看到,似乎好像就是在笛卡尔积的基础上加入了筛选条件。

等值连接在SQL99中被称为自然连接,即natural join;

那么问题来了,等值连接运行时,会先产生笛卡尔积,然后再用where条件来过滤吗?

是的,等值连接其实是需要先做笛卡尔积,然后再根据where条件,选择出满足条件的记录组合。

非等值连接

多表关联时,如果连接条件是等号,就是等值连接;其他的运算符就是非等值连接。

select * from A, B where A.height between B.height_lowest and B.height_highest;

外连接

外连接的一大特点是,除了可以查询满足条件的记录以外,也可以搭配null值检查来查询不满足条件的记录。

两张表分主表和从表。

SQL92中采用(+)代表从表所在位置,而且92中只有左外连接和右外连接,没有全外连接。

左外连接,左边的表是主表,显示左边的表的全部行,若右表没有匹配,则右表位置为null。

在这里插入图片描述

在这里插入图片描述

92标准下:

select * from A, B where A.team_id = B.team_id(+)

相当于SQL99中:

select * from A left join B on A.team_id=B.team_id;

右外连接,右边的表是主表,显示右边的表的全部行,若左表没有匹配上,则左表位置为null;

在这里插入图片描述

在这里插入图片描述

92标准下:

select * from A, B where A.team_id(+) = B.team_id

相当于SQL99中:

select * from A right join B on A.team_id=B.team_id;

92标准中不存在left join和right join。

全外连接:结合了left join和right join的结果,其实就是两表关联取并集。在99标准中的语法是A full join B或者是A full outer join B

在这里插入图片描述

在这里插入图片描述

这里可以考虑一下两表取并集之后去掉交集,如何使用full join来写

MySQL中未提供full join写法,但oracle提供。

内连接:两表关联取交集

在这里插入图片描述

在这里插入图片描述

自连接

指自己连接自己。查询时用到了自己的字段

select b.player_name from A a, A b where a.player_name='赫韦德斯' and a.height < b.height

查看比赫韦德斯高的球员。

这个用join也能实现:

select b.player_name from A a
join A b
on a.player_name='赫韦德斯' and a.height < b.height

其他

sql99中还提供了一种using连接,在进行连接时,可以用using指定数据表中的同名字段进行等值连接,比如:

SELECT player_id, team_id, player_name, height, team_name 
FROM player 
JOIN team USING(team_id)

相当于:

SELECT player_id, player.team_id, player_name, height, team_name 
FROM player 
JOIN team 
ON player.team_id = team.team_id

按我理解,简化了连接而已。

SQL92与SQL99中连接的区别

SQL92中会把所有需要连接的表都放在from后,而SQL99是采用join的方式连接一张表,可以多次使用join连接不同的表,这样看起来层次性更强,可读性更强。

不同DBMS下使用连接的注意事项

  1. 部分DBMS虽然支持SQL99标准,但是并不支持里面的全外连接,比如说MySQL、Access、SQLite、MariaDB等,但是Oracle、DB2、SQL Server 是支持的;
  2. Oracle不支持表别名as,如果要写别名的话,直接写成player p即可;
  3. SQLite只支持左连接,不支持右连接;

另外,鼓励使用自连接而不是子查询。因为在许多 DBMS 的处理过程中,对于自连接的处理速度要比子查询快得多。你可以这样理解:子查询实际上是通过未知表进行查询后的条件判断,而自连接是通过已知的自身数据表进行条件判断,因此在大部分 DBMS 中都对自连接处理进行了优化。

参考文献

  1. 10丨常用的SQL标准有哪些,在SQL92中是如何使用连接的?
  2. 11丨SQL99是如何使用连接的,与SQL92的区别是什么?
  3. sql中的几种join 及 full join问题 写的很好很全面
  4. 一图看懂join、left join、right join、fulljoin间的区别
  5. SQL FULL JOIN 关键字

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot整合Redis使用基于注解的缓存

环境准备 注解 EnableCaching CacheConfig CacheConfig 提供了一种在类级别共享公共缓存相关设置的机制。 | 参数 | 作用 | | | — | — | — | | cacheNames | 使用在类上的默认缓存名称 | | | keyGenerator | 用于类的默认KeyGenerator的bean名称 | | | cacheManager | 自定…

Android——模块级build.gradle配置——applicationId和namespace

官方地址&#xff1a; 配置应用模块-applicationId和namespace了解 build.gradle 中的实用设置。https://developer.android.google.cn/studio/build/configure-app-module?hlzh-cn 产生那些异常场景&#xff1a; Android&#xff1a;Namespace not specified. Please spec…

【编译原理】Chapter1概述

课程主要内容&#xff1a;程序设计语言编译程序构造的基本原理和基本实现技术 文章目录 什么是编译程序为什么要学编译原理计算思维(Computational Thinking)学习意义编译原理和方法的应用 编译过程概述词法分析语法分析中间代码生成优化目标代码产生 编译程序的结构编译程序总…

国内crm解决方案的主要提供商有哪些?对比7家

目前国内CRM服务商1410家&#xff0c;今年1-7月CRM服务商新注册19家。如何从众多服务商中挑选出合适的一家&#xff0c;无疑是一项耗时耗力的大工程。为此&#xff0c;本文将为根据国内外知名机构、媒体、网站发布、百度指数、行业知名度等维度考量&#xff0c;选择出7大CRM系统…

城市网吧视频智能监控方案,实现视频远程集中监控

网吧环境较为复杂&#xff0c;电脑设备众多且人员流动性大&#xff0c;极易发生人员或消防事故&#xff0c;亟需改变&#xff0c;TSINGSEE青犀AI智能网吧视频监管方案可以帮助实现对网吧环境和用户活动的实时监控和管理。 1、视频监控系统 在网吧内部布置高清摄像头&#xff0…

Microsoft发布了一份关于其产品安全修复的 11 月报告。

&#x1f47e; 平均每天有 50 多个漏洞被发现&#xff0c;其中一些会立即被网络犯罪分子利用。我们把那些现在很受网络犯罪分子欢迎&#xff0c;或者根据我们的预测&#xff0c;在不久的将来可能会被大量利用的漏洞称为趋势漏洞。 在攻击者开始利用这些漏洞之前 12 小时&#…

DocCMS keyword SQL注入漏洞复现 [附POC]

文章目录 DocCMS keyword SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 DocCMS keyword SQL注入漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测…

蓝桥杯 map

map 代码示例 #include<iostream> #include<map> using namespace std; int main(){//创建并初始化mapmap<int,string> myMap{{1,"Apple"},{2,"Banana"},{3,"Orange"}} ;//插入元素myMap.insert(make_pair(4,"Grapes&qu…

【云原生-Kurbernetes篇】K8s的存储卷/数据卷+PV与PVC

这是一个目录标题 一、Kurbernetes中的存储卷1.1 为什么需要存储卷&#xff1f;1.2 存储卷概述1.2.1 简介1.2.2 volume字段 1.3 常用的存储卷类型1.3.1 emptyDir&#xff08;临时存储卷&#xff09;1.3.2 hostPath&#xff08;节点存储卷&#xff09;1.3.3 nfs1.3.4 cephfs 二、…

大功率电源芯片WD5030L

电源管理芯片作为现代电子设备中最关键的元件之一&#xff0c;直接影响着设备的性能和效率。而大功率电源芯片作为电源管理芯片中的一种&#xff0c;其性能和应用领域更加广泛。本文将介绍一款具有宽VIN输入范围、高效率和多种优良性能的大功率电源芯片WD5030L&#xff0c;并探…

SpringCloud-Gateway修改Response响应体,并解决大数据量返回不全等问题

官网相关案例&#xff1a; Spring Cloud Gatewayhttps://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-modifyresponsebody-gatewayfilter-factory ModifyRequestBodyGatewayFilterFactory类: https://github.com/spring-cloud/spring-cloud-gate…

五分钟k8s实战-Istio 网关

istio-03.png 在上一期 k8s-服务网格实战-配置 Mesh 中讲解了如何配置集群内的 Mesh 请求&#xff0c;Istio 同样也可以处理集群外部流量&#xff0c;也就是我们常见的网关。 其实和之前讲到的k8s入门到实战-使用Ingress Ingress 作用类似&#xff0c;都是将内部服务暴露出去的…

kafka分布式安装部署

1.集群规划 2.集群部署 官方下载地址&#xff1a;http://kafka.apache.org/downloads.html &#xff08;1&#xff09;上传并解压安装包 [zhangflink9wmwtivvjuibcd2e package]$ tar -zxvf kafka_2.12-3.3.1.tgz -C ../software/&#xff08;2&#xff09;修改解压后的文件…

qt笔记之qml和C++的交互系列(一):初记

code review! —— 杭州 2023-11-16 夜 文章目录 一.qt笔记之qml和C的交互&#xff1a;官方文档阅读理解0.《Overview - QML and C Integration》中给出五种QML与C集成的方法1.Q_PROPERTY&#xff1a;将C类的成员变量暴露给QML2.Q_INVOKABLE()或public slots&#xff1a;将C类…

网络编程TCP/UDP通信

1 网络通信概述 1.1 IP 和端口 所有的数据传输&#xff0c;都有三个要素 &#xff1a;源、目的、长度。 怎么表示源或者目的呢&#xff1f;请看图 所以&#xff0c;在网络传输中需要使用“IP 和端口”来表示源或目的。 1.2 网络传输中的 2 个对象&#xff1a;server 和 cl…

Linux操作系统 - 进程控制

目录 进程创建 进程退出 进程等待 进程替换 进程创建 在操作系统中&#xff0c;除了系统启动之后的第一个进程(根进程&#xff0c;1号进程)由系统来创建外&#xff0c;其余进程都必须由已存在的进程来创建。其中&#xff0c;这个新创建的进程叫做子进程&#xff0c;而创建…

Nginx(四) absolute_redirect、server_name_in_redirect、port_in_redirect 请求重定向指令组合测试

本篇文章主要用来测试absolute_redirect、server_name_in_redirect和port_in_redirect三个指令对Nginx请求重定向的影响&#xff0c;Nginx配置详解请参考另一篇文章 Nginx(三) 配置文件详解 接下来&#xff0c;在Chrome无痕模式下进行测试。 测试1&#xff1a;absolute_redi…

微软Surface/Surface pro笔记本电脑进入bios界面

微软Surface笔记本电脑进入bios界面 方法一推薦這種方法&#xff1a;Surface laptop 进BIOS步骤 开机后&#xff0c;不停按音量键进bios界面。 方法二&#xff1a;Surface Book、Surface Pro进bios步骤 1、关闭Surface&#xff0c;然后等待大约10秒钟以确保其处于关闭状态。…

百度智能小程序源码系统:打造极致用户体验的关键 带完整搭建教程

大家好啊&#xff0c;今天罗峰来给大家分享一款百度智能小程序系统源码。一起来看看吧。 百度智能小程序源码系统是百度从做智能小程序的第一天开始就致力于打造真正开源开放的生态的产物。作为目前业内唯一真正开源的平台&#xff0c;百度智能小程序将开放性放在重要位置&…