位置: 编程技术 - 正文

SQL Join的一些总结(实例)(sql中的join)

编辑:rootadmin
1.1.1 摘要 Join是关系型数据库系统的重要操作之一,SQL Server中包含的常用Join:内联接、外联接和交叉联接等。如果我们想在两个或以上的表获取其中从一个表中的行与另一个表中的行匹配的数据,这时我们应该考虑使用Join,因为Join具体联接表或函数进行查询的特性 本文将通过具体例子介绍SQL中的各种常用Join的特性和使用场合: 1.1.2 正文 首先我们在tempdb中分别定义三个表College、Student和Apply,具体SQL代码如下: Inner join 内联接(Inner join)是最常用的联接类型之一,它查询满足联接谓词的数据。 假设我们要查询申请表Apply中申请学校的相关信息,由于Apply表中包含学校名字我们并不能预知,所以我们可以根据cName来内联接(Inner join)表College和Apply,从而找到Apply表中包含学校的信息。 具体SQL代码如下:

图1查询结果 cNamestateenrollmentStanfordCABerkeleyCAMITMACornellNYHarvardMA表1 College表中的数据 如上图1所示,我们把Apply表包含的学校信息查询出来了,由于Harvard并没有被查询出来,所以我们知道暂时还没有学生申请Harvard。 内联接(Inner join)满足交换律:“A inner join B” 和 “B inner join A” 是相等的。 Outer join 假设我们想看到所有学校信息;即使是那些没有申请的学校(如:Harvard),这时我们可以使用外部联接(Outer join)进行查询。由于外部联接保存一个或两个输入表的所有行,即使无法找到匹配联接谓词的行。 具体SQL代码如下:

图3左联接查询结果 如上图3所示:由于在Apply表中并没有学生申请Harvard,但是我们通过左联接(left outer join)把所有学校信息查询出来了。 由于左联接(left outer join)产生表College的完全集,而Apply表中匹配的则有值,而不匹配的则以NULL值取代,所以我们知道Apply表中没有学生申请Harvard。 通过左联接查询我们可以获取College的完全集,假设现在我们既要获取College的完全集又要获取Apply的完全集,那么我们可以考虑使用完整外部联接(full outer join)。使用完整外部联接,我们可以查询所有的学校,不管它们是否匹配联接谓词:

图3 完整外部联接查询结果 现在我们获取了College和Apply的完全数据集,对于表中匹配的则有值,即使没有找到匹配cName的则以NULL值取代。 下表显示每种外部联接(outer join)匹配时保留数据行的情况:

联接类型

保留数据行

A left outer join B

all A rows

A right outer join B

all B rows

A full outer join B

all A and B rows

表2 外部联接保留数据行 完整外部联接(full outer join)满足交换律:“A full outer join B” 和 “B full outer join A” 是相等的。 Cross join 交叉联接(cross join)执行两个表的笛卡尔积(就是把表A和表B的数据进行一个N*M的组合)。也就是说,它匹配一个表与另一个表中的每一行;我们不能通过使用ON子句在交叉联接指定谓词,虽然我们可以使用WHERE子句来实现相同的结果,这是交叉联接基本上是作为一个内部联接了。 交叉联接相对于内部联接使用率较低,而且两个大表不应该进行交叉联接,因为这将导致一个非常昂贵的操作和一个非常大的结果集。 具体SQL代码如下: 我们也可以使用内部联接实现和Cross apply相同的查询功能,具体SQL代码如下:

图6 Cross apply查询 Outer apply 在介绍Cross apply和Outer join之后,现在让我们理解Out apply也就不难了,Outer apply使表可以和表值函数(table-valued functions TVF‘s)结果进行join查询,找到匹配值则有值,没有找到匹配值则以NULL表示。 查询执行时间: CPU 时间= 0 毫秒,占用时间= 毫秒。 Inner join查询执行时间: CPU 时间= 0 毫秒,占用时间= 4 毫秒。

图8 执行计划 如图8所示:Cross apply首先执行TVF(table-valued functions),然后对表Studnet进行全表扫描,接着通过遍历sID查找匹配值。 Inner join对表Student和Apply进行全表扫描,然后通过哈希匹配查找匹配的sID值。 通过以上的SQL执行时间和执行计划,我们能不能说Inner join比Cross apply好呢?答案是否定的,如果表的数据量很大,那么Inner join的全表扫描耗费时间和CPU资源就增加了(可通过数据量大的表进行测试)。 虽然大多数采用Cross apply实现的查询,可以通过Inner join实现,但Cross apply可能产生更好的执行计划和更佳的性能,因为它可以在联接执行之前限制集合加入。 Semi-join和Anti-semi-join Semi-join从一个表中返回的行与另一个表中数据行进行不完全联接查询(查找到匹配的数据行就返回,不再继续查找)。 Anti-semi-join从一个表中返回的行与另一个表中数据行进行不完全联接查询,然后返回不匹配的数据。 不同于其他的联接运算,Semi-join和Anti-semi-join没有明确的语法来实现,但Semi-join和Anti-semi-join在SQL Server中有多种应用场合。我们可以使用EXISTS子来实现Semi-join查询,Not EXISTS来实现Anti-semi-join。现在让我们通过具体的例子说明吧! 假设要求我们找出Apply和Student表中sID匹配的学生信息,这和前面的Inner join查询结果将一样,具体SQL代码如下: 我们发现常用的EXISTS子句,原来是通过Left Semi Join实现的,所以说Semi-join在SQL Server中又许多使用场合。

图9 查询结果

推荐整理分享SQL Join的一些总结(实例)(sql中的join),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:sql join的用法是什么,sql各种join用法详解,sql语句join on用法,sql中的join,sql语句join on用法,sql各种join用法详解,sql中的join,sql各种join用法详解,内容如对您有帮助,希望把文章链接给更多的朋友!

SQL Join的一些总结(实例)(sql中的join)

图 执行计划 现在要求我们找出还没有申请学校的学生信息,这时我们立刻反应可以使用NOT EXISTS子句来实现该查询,具体SQL代码如下: 其实,我们常用的NOT EXISTS子句的实现是通过Anti-semi-join,通过执行计划我们发现在查找匹配sID时,SQL使用 Left Anti Semi Join进行查询。

图 查询结果

图 执行计划 1.1.3 总结 本文介绍了SQL中常用了联接查询方式:Inner join、Outer join、Cross join和Cross apply的使用场合和特性。

SQL Transcation的一些总结分享 1.1.1摘要相信大家对于SQLTranscation再熟悉不过,它确保了数据库的数据一致性和安全性,尤其在对数据执行增删时,如果发生异常和错误它就会触发事务

SQL的Join使用图解教程 对于SQL的Join,在学习起来可能是比较乱的。我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点

SQL中JOIN和UNION区别、用法及示例介绍 1.JOIN和UNION区别join是两张表做交连后里面条件相同的部分记录产生一个记录集,union是产生的两个记录集(字段要一样的)并在一起,成为一个新的记录集

标签: sql中的join

本文链接地址:https://www.jiuchutong.com/biancheng/348164.html 转载请保留说明!

上一篇:sqlserver 索引的一些总结(sqlserver索引类型区别)

下一篇:SQL Transcation的一些总结分享

  • 小规模企业需要申报吗
  • 非税收入票据可以手写吗
  • 工资申报是当月申报当月的吗
  • 促销费用计入销售费用哪个科目
  • 建筑劳务如何开三个点的发票
  • 取得交易性金融资产投资收益为什么在借方
  • 出口结汇必须要开票吗
  • 结转成本时是否含税
  • 如何保证企业生存发展
  • 安全生产专项资金绩效目标
  • 知识产权投资是什么意思
  • 总公司委托分公司工程委托书模板
  • 电子发票可以认证几次
  • 专票作废后怎样退税
  • 科技型中小企业享受优惠税收政策2023
  • 城镇土地使用税会计分录怎么做
  • 已开票怎么做坏账处理
  • 公司缴纳社保部分从个人扣除 犯法吗
  • 公司买珠宝会计分录
  • 小规模纳税人需要建账吗
  • 核定应纳税额的具体程序和方法
  • 生产企业出口需要什么手续
  • 公司购买的原材料,原价格销售合理吗
  • 资产预测怎么写
  • 赠送产品如何计入成本
  • 小规模纳税人的专票可以抵税吗
  • windows账户名a
  • qqlogin.exe是什么进程 qqlogin.exe应用程序错误解决办法
  • PHP:oci_fetch_row()的用法_Oracle函数
  • 报销是可以直接拿钱的吧
  • 个人应纳税所得额是要交钱吗
  • 委托加工应税消费品的纳税义务人是受托方
  • 销售旧的固定资产 税法规定
  • 劳务报酬怎么做帐
  • html简单例子
  • 买入返售金融资产和卖出回购金融资产
  • 建筑劳务费发票有进项抵扣吗
  • auto learn
  • 劳动仲裁的调解款要扣税吗
  • 第一章 使用layui的表格和表单
  • linux时间12小时制
  • jquery 兄弟选择器
  • deformable detr代码
  • opencv安装教程vs2019
  • 预付卡销售可以报销吗
  • 无偿划转法律意见
  • 非货币性资产交换和债务重组的区别
  • python3中rindex用法
  • 发票金额大于付款金额怎么做账
  • 技术转让和技术开发区别
  • 我有朋友吗朋友圈说说
  • 一般纳税人预收租金增值税
  • 个体小企业怎么缴纳个人所得税
  • 累计折旧借贷方向表示什么意思
  • 上年期末留底税额怎么算
  • 合同印花税怎么做会计分录
  • 不动产拆除的收入处理
  • 财务费用汇兑损益
  • 行政单位 预算会计
  • 老板想提取销售怎么办
  • 企业会计账簿设计的原则
  • 会计应该怎么做职业规划
  • mysql int(3)与int(11)的区别详解
  • imessage对方看了会显示已读吗
  • win10系统遇到错误
  • win7与xp文件共享
  • 如何用u盘安装win8操作系统
  • win7双声道
  • cocos jsc
  • 根据当前目录下的文件
  • python利用matplotlib将扇形平分成50份
  • Node.js中的全局对象有
  • 事件传播路径
  • unity按钮函数
  • jQuery+ajax+asp.net获取Json值的方法
  • python中tcp
  • python 正则 \s
  • 失业保险金领取成功
  • 南川大观薰衣草花期
  • 二手房个税怎么算
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设