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

news2024/12/26 11:36:55

文章目录

  • 简介
  • 笛卡尔积
  • 等值连接
  • 非等值连接
  • 外连接
  • 自连接
  • 其他
  • 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 关键字

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# 图解教程 第5版 —— 第15章 事件

文章目录 15.1 发布者和订阅者15.2 源代码组件概览15.3 声明事件15.4 订阅事件15.5 触发事件15.6 标准事件的用法15.6.1 通过扩展 EventArgs 来传递数据15.6.2 移除事件处理程序 15.7 事件访问器 15.1 发布者和订阅者 ​ 发布者 / 订阅者模式&#xff1a;发布者定义了一系列事…

SSM整合原理和实战

一、SSM整合理解 父工程用pom 我原来没见过&#xff0c;

开源与闭源:数字化时代的辩论与未来走向

在当今的数字化时代&#xff0c;关于开源和闭源软件的辩论一直是技术界的热门话题。 特斯拉CEO马斯克最近也加入了这场辩论&#xff0c;公开表示OpenAI不应该闭源&#xff0c;而他自己的首款聊天机器人将选择开源。 这引发了人们对开源与闭源软件的进一步思考&#xff1a;开源是…

【Java】详解多线程通信

&#x1f33a;个人主页&#xff1a;Dawn黎明开始 &#x1f380;系列专栏&#xff1a;Java ⭐每日一句&#xff1a;什么都不做&#xff0c;才会来不及 &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️ 文章目录 &#x1f510;多…

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…

【电路笔记】-脉冲宽度调制(PWM)与电机转速控制

脉冲宽度调制&#xff08;PWM&#xff09;与电机转速控制 文章目录 脉冲宽度调制&#xff08;PWM&#xff09;与电机转速控制1、概述2、电机转速控制3、PWM产生 有许多不同的方法来控制直流电机的速度&#xff0c;但一种非常简单且容易的方法是使用脉冲宽度调制&#xff08;PWM…

ES Kibana 安装

ES & Kibana 本文基于Docker安装部署使用 Kibana的版本和ElasticSearch的版本&#xff0c;以及IK分词器的版本一一对应 Kibana 安装 安装Kibana # 创建网络 [rootiZ2zeg7mctvft5renx1qvbZ ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway …

数据结构树与二叉树的实现

目录 一、普通树的存储结构 1、双亲表示法 2.孩子表示法 二、二叉树 1.二叉树的顺序存储&#xff08;必须是完全二叉树&#xff0c;否则很浪费空间&#xff09; 1&#xff09;结构体 2.二叉树的链式存储 1&#xff09;结构体 2&#xff09;操作 1.创建一颗二叉树 2.创…

kubernetes--数据存储

目录 一、数据存储引言&#xff1a; 二、基础存储卷&#xff1a; 1. emptyDir存储卷&#xff1a; 2. hostPath存储卷&#xff1a; 3. nfs共享存储卷&#xff1a; 3.1 配置nfs: 3.2 master节点编写yaml文件&#xff1a; 4. 总结&#xff1a; 三、PVC和PV&#xff1a; 1. PV 的…

vivado产生报告阅读分析6-时序报告2

1、复查时序路径详情 单击“ OK ”运行报告命令后 &#xff0c; 将打开一个新窗口。这样您即可复查其中内容。在其中可查看执行选定的每种类型 (min/max/min_max ) 的分析之后所报告的 N 条最差路径。 下图显示的“Report Timing ” &#xff08; 时序报告 &#xff09; 窗口…

【无标题】chapter6卷积

此例以说明全连接层处理图片的时候会遇到参数过多 模型过大的问题 参数比要研究的物体总数还多 卷积&#xff0c;特殊的全联接层 平移不变形&#xff0c;局部性 原本权重为二维&#xff08;输入和输出全联接&#xff0c;想想下表组合&#xff0c;就是个二维的矩阵&#xff09;…

pytorch 安装 2023年

pytorch网址&#xff1a;https://pytorch.org/get-started/locally/ conda install pytorch torchvision torchaudio pytorch-cuda11.8 -c pytorch -c nvidia我在自己电脑上用这个pip命令完全安装不了&#xff0c;只能用conda安装。复制上面提供的命令&#xff0c;在cmd中直接运…

腾讯云服务器新用户优惠政策,腾讯云新人服务器购买入口

腾讯云服务器新用户优惠政策是腾讯云为新用户提供的一种优惠&#xff0c;它可以帮助新用户以更低的价格购买腾讯云服务器&#xff0c;并且还提供一些额外的优惠。腾讯云服务器对于新用户有着非常优惠的政策。无论你是个人用户还是企业用户&#xff0c;只要你是第一次购买腾讯云…

flutter TabBar指示器

第一层tabView import package:jade/configs/PathConfig.dart; import package:jade/customWidget/MyCustomIndicator.dart; importpackage:jade/homePage/promotion/promotionPost/MyPromotionListMainDesc.dart; import package:jade/homePage/promotion/promotionPost/MyPr…

ProtocolBuffers(protobuf)详解

目录 前言特点语法定义关键字JSON与Protocol Buffers互相转换gRPC与Protocol Buffers的关系 前言 Protocol Buffers&#xff08;通常简称为protobuf&#xff09;是Google公司开发的一种数据描述语言&#xff0c;它能够将结构化数据序列化&#xff0c;可用于数据存储、通信协议…

交换排序详讲:冒泡排序+快速排序(多方法+思路+图解+代码)

文章目录 交换排序一.冒泡排序二.快速排序1.挖坑法2.Hoare法 交换排序 根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置将键值较大的记录向序列的尾部移动&#xff0c;键值较小的记录向序列的前部移动。 一.冒泡排序 /*** 冒泡排序* 时间复杂度 n^2* 空间复杂…

用Postman发送xml数据

启动Postman&#xff1a; 点击左上角的“New”&#xff0c;在弹出窗中选择HTTP&#xff1a; 选择POST方法&#xff1a; 点击Body&#xff1a; 选择raw&#xff1a; 在右侧的下拉列表中选择XML&#xff1a; 在下面的输入框中输入或者从其它地方拷贝XML文本&#xff1a;…

cookie机制

目录 为什么会有cookie?? cookie从哪里来的&#xff1f;&#xff1f; cookie到哪里去&#xff1f;&#xff1f; cookie有啥用&#xff1f;&#xff1f; session HttpServletRequest类中的相关方法 简单的实现cookie登录功能 实现登录页面 实现servlet逻辑 实现生成主…

uni-app 蓝牙打印, CPCL指令集使用

先上代码: GitHub - byc233518/uniapp-bluetooth-printer-demo: 使用uniApp 连接蓝牙打印机 Demo, CPCL 指令简单实用示例 (内含 芝珂,佳博,精臣 多个厂家指令集使用文档) 文件结构: ├── App.vue ├── CPCL 指令手册.pdf // 指令集参考手册 ├── LICENSE ├── R…

【JAVA-排列组合】一个套路速解排列组合题

说明 在初遇排列组合题目时&#xff0c;总让人摸不着头脑&#xff0c;但是做多了题目后&#xff0c;发现几乎能用同一个模板做完所有这种类型的题目&#xff0c;大大提高了解题效率。本文简要介绍这种方法。 题目列表 所有题目均从leetcode查找&#xff0c;便于在线验证 46.…