SQL多表查询连接方式解析:内连接、外连接与交叉联接全解析

创始人
2024-12-24 09:44:58
0 次浏览
0 评论

SQL多表查询的几种连接方式


WHERE条件:在带有ON条件的SELECT语句中,是过滤中间表的约束条件。
在没有ON的单表查询中,这是一个约束,限制物理表返回的记录或中间查询的结果。
在两个表或多表的联接中,约束限制联接的返回结果以形成最终的中间表。
从这里可以看出,将WHERE条件移到ON之后是不合适的。
推荐的做法是:ON只执行join操作,WHERE只过滤中间表中的记录。
2、联接查询联接运算符是进行多表联合查询的重要方式,主要分为内联接、外联接和交叉联接三种类型。
2.1INNERJOIN内连接(INNERJOIN)有显式和隐式两种,返回链接表中满足连接条件和查询条件的数据行。
(所谓链接表就是数据库执行查询时形成的中间表)。
语句1:隐式内连接,没有INNERJOIN,形成的中间表是两个表的笛卡尔积。
SELECTO.ID,O.ORDER_NUMBER,C.ID,C.NAMEFROMCUSTOMERSC,ORDERSOWHEREC.ID=O.CUSTOMER_ID语句2:显示的内连接,通常称为内连接,有一个INNERJOIN和两个表组成的中间表;是ON状态滤波后的笛卡尔积。
SELECTO.ID,O.ORDER_NUMBER,C.ID,C.NAMEFROMCUSTOMERSCINNERJOINORDERSOONC.ID=O.CUSTOMER_ID语句3和4的查询结果。
使用比较运算符(包括=、>、<、<>、>=、<=进行联接、!>和!<)来执行表之间的比较操作并查询符合连接条件的数据。
根据所采用的比较方法的不同,深度嫁接分为等值嫁接、自然嫁接和自嫁接三种。
Equijoin是使用“=”关系来连接表的查询。
查询结果列出了连接表中的所有列,包括重复列。
SELECTPM_ACT_JOB_RLS.*,PM_ACT_RLS.*FROMPM_ACT_JOB_RLSINNERJOINPM_ACT_RLSONPM_ACT_JOB_RLS.RlsPK=PM_ACT_RLS.RlsPK是自然联接,它从等效联接中删除重复列以形成联接。
说实话,这种类型的连接查询没有任何价值,因为它是在SQL2标准中定义的,我们举个例子。
自然联接不需要联接列规范SQL会检查两个表中是否存在同名列,假设在联接条件中使用了该列,并且联接条件中只包含一个联接列。
不允许ON语句,不允许指定显示列显示列只能用*表示(在ORACLE环境下测试)。
对于每种连接类型(交叉连接除外),可以指定NATURAL。
SELECTPM_ACT_JOB_RLS.JobPK,PM_ACT_RLS.RlsPK,RlsNameFROMPM_ACT_JOB_RLSNnaturalINNERJOINPM_ACT_RLSONPM_ACT_JOB_RLS.RlsPK=PM_ACT_RLS.RlsPK语句1:SELECT*USTNERSCONINCLIN;CT*来自订单自然左外部加入客户;语句3:SELECT*FROMORDERSONATURALIGHTOUTERJOINCUSTOMERSC语句4:SELECT*FROMORDERSONATURAFULLOUTERJOINCUSTOMERSC如果在同一个连接查询中,则称为同一查询。
--c1和c2逻辑上是两个表,物理上是一个表SELECTc1.CategoryID,c1.CategoryNameFROM[dbo].[Category]c1INNERJOIN[dbo].[Category]c2ONc1.[CategoryID]=c2.[ParentID]外连接完整(FULLOUTERJOIN)注意:MySQL不支持全外连接这里给出的写方法适用于Oracle和DB2。
但可以得到全外连接查询结果通过找到左外和右外的组合。
SELECTO.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROMORDERSOFULLOUTERJOINCUSTOMERSCONC.ID=O.CUSTOMER_ID;外左和外右集合的实际查询结果与上面的完整外连接语句相同:SELECTO.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROMORDEROracle和MySQL都不支持。
它的功能是查找完全外连接和内连接之间不同的所有行。
这通常用于解决数据分析中的问题。
您还可以使用数据库集合操作来实现此功能。
语句1:联合(UNIONJOIN)查询语句示例,未找到可执行的SQL环境。
SELECT1O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROMORDERSOUNIONJOINCUSTOMERSCONC.ID=O.CUSTOMER_ID语句2:与DB2下语句11的等效实现。
我还是不知道DB2是否支持语句11!SELECTO.ID、O.ORDER_NUMBER、O.CUSTOMER_ID、C.ID、C.NAMEFROMORDERSOFULLOUTERJOINCUSTOMERSCONC.ID=O.CUSTOMER_IDEXCEPTSELECTO.ID、O.ORDER_NUMBER、O.CUSTOMER_ID、C.ID、C.NAMEFROMORDERSOINNERJOINCUSTOMERSCONC.ID=O.CUSTOMER_ID语句3:在Oracle下相当于语句1的实现。
SELECTO.ID、O.ORDER_NUMBER、O.CUSTOMER_ID、C.ID、C.NAMEFROMORDERSOFULLOUTERJOINCUSTOMERSCONC.ID=O.CUSTOMER_IDMINUSSELECTO.ID、O.ORDER_NUMBER、O.CUSTOMER_ID、C.ID、C.NAMEFROMORDERSOINNERJOINCUSTOMERSCONC.ID=O.CUSTOMER_ID;2.2外连接只返回满足连接条件的数据行Outer不仅列出了符合联接条件的行,还列出了左表、右表(联接时)、右表(联接右外联接时)或两表(当连接完全外连接时)。
外连接分为三种类型:左外连接、右外连接和全外连接。
1)LEFTJOIN或LEFTOUTERJOIN左外连接的结果集包括LEFTOUTER子句中指定的左表的所有行,而不仅仅是与连接列匹配的行。
如果左表中的行在右表中没有对应的行,则右表中的所有选项列表列在对应的结果集行中都将具有NULL值。
2)RIGHTJOIN或RIGHTOUTERJOIN右外连接是左外连接的反向连接。
将返回右表中的所有行。
果右表中的某行在左表中没有对应的行,则左表返回NULL。
3)FULLJOIN或FULLOUTERJOIN全外连接返回左表和右表中的所有行。
当某行在另一个表中没有对应行时,另一个表的选择列表列包含空值。
如果表之间存在匹配行,则结果集的所有行都包含来自基表的数据值。
语句1:左外连接(LEFTOUTERJOIN)SELECTO.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROMORDERSOLEFTOUTERJOINCUSTOMERSCONC.ID=O.CUSTOMER_ID语句2:右外连接(RIGHTOUTERJOIN)SELECTO.ID,O。
ORDER_NUMBER、O.CUSTOMER_ID、C.ID、C.NAMEFROMORDERSORIGHTOUTERJOINCUSTOMERSCONC.ID=O.CUSTOMER_ID注意:如果WHERE条件放在ON后面,查询结果会不同。
例如:语句3:WHERE条件是独立的。
SELECTO.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROMORDERSOLEFTOUTERJOINCUSTOMERSCONC.ID=O.CUSTOMER_IDWHEREO.ORDER_NUMBER<>‘MIKE_ORDER001’;SELECTO.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROMORDERSOLEFTOUTERJOINCUSTOMERSCONC.ID=O.CUSTOMER_IDANDO.ORDER_NUMBER<>'MIKE_ORDER001'从语句3和语句4的查询结果来看,明显不同。
,语句8所示的结果很难理解。
因此,建议在编写连接查询时,应将ON设置为后面只跟一个连接条件,所有限制中间表的条件都应该写在WHERE子句中。
2.3交叉连接交叉连接(CROSSJOIN):有两种类型,书面的和隐式的。
如果没有ON子句,则返回两个表的乘积,也称为笛卡尔积。
语句1:隐式交叉连接,无CROSSJOIN。
SELECTO.ID,O.ORDER_NUMBER,C.ID,C.NAMEFROMORDERSO,CUSTOMERSCWHEREO.ID=1;语句2:显式交叉联接,使用CROSSJOIN。
SELECTO.ID、O.ORDER_NUMBER、C.ID、C.NAMEFROMORDERSOCROSSJOINCUSTOMERSCWHEREO.ID=1;语句1和语句2结果相同1.4示例表b表idnameidjobparent_id1张312312李四23423王武33441)内连接selecta.*,b.*fromainnerjoinbona.id=b.parent_id结果为1312312李四23422)左连接selecta.*,b.*fromaleftjoinbona.i结果d=b.parent_id为1张图片312312李四23423王武null3)右连接selecta.*,b.*fromarightjoinbona.id=b.parent_id结果为1张图片312312李四2342null33444)完全连接selecta。
ta.*,b.*fromafulljoinbona.id=b.parent_id结果为1图312312李四2342null33443王武null2.存储过程、函数等更高级的方法3.总结Join查询是SQL查询的核心。
连接查询连接类型的选择根据实际需要而定。
如果选择不正确,不但不会提高查询的效率,反而会导致一些逻辑错误或者性能低下。
下面总结了两个表之间的连接查询选择方法的依据:1、使用内连接来检查两个相关表的列是否相同。
2.当Col_L是Col_R的子集时,使用右外连接。
3.Col_R是子集_L时ColUse左外连接。
4.当Col_R和Col_L有交集但互不子集时,使用foreignsum方法。
5.执行差异运算时使用联合查询。
当查询多个表时,这些不同的连接类型可以写在一起。
例如:SELECTT1.C1,T2.CX,T3.CYFROMTAB1T1INNERJOINTAB2T2ON(T1.C1=T2.C2)INNERJOINTAB3T3ON(T1.C1=T2.C3)LEFTOUTERJOINTAB4ON(T2.C2=T3.C3);WHERET1.X>T3.Y;上面的SQL查询是多表连接的演示。
参考文章【SQL】-多表查询的一些连接方法SQL语句数据查询(二)多表查询-----------------数据查询的要点与难点内部sql连接、外连接、自然连接以及其他各种连接SQL多表查询的一些连接方法:bsplanDifferencestrrightOuterJoinwww.parententeranother

如何sql三张表关联查询

三表链接查询用例:有三个表A\B\C现在我们要显示表A和C中的某些字段。
但表A和表C没有相同的字段,无法匹配。
此时有B,该表正好有两个字段,一个字段与A表中的字段相同,一个字段与C表中的字段相同。
我们将表B称为“中间表”。
所以表A和表C在表B中是相关的。
SELECTA1,A2,C1,C2--SELECTA表中的字段A1\A2和表C中的C1\C2FROMB--中间表INNERJOINAONA.A1=B.B1--之间表A和表BINNERJOINCONC.C1=B.B1--表C中相同的字段与表B中相同的字段---可以根据自己的需要添加条件,如果没有条件就不要写where。

sql语句查询数据,三张表关联怎么写?

用于查询数据的关系表是数据库操作的常见需求。
例如,学生查询课程和成绩表中的学生表现数据需要通过关联这些表来完成这些表。
数据集成主要分为两种类型:垂直连接和使用UNION和JOIN操作的水平连接。
UNION用于将多个结果合并到一个结果集中,UNIONALL保留所有结果以删除重复项。
JOIN水平表连接的主要模式有InnerJOIN、左连接和右连接。
INNERJOIN仅从两个表中选择匹配的记录。
LEFTJOIN使用左表作为父表,匹配项显示在右表中。
数据分割完成后,您可以通过ORDERBY函数对结果进行排序,以升序或降序排列。
对于自定义排序,使用DESC单独指定必填字段。

一张图带你搞懂SQL四种关联查询

理解关系型SQL查询对于初学者来说是一个挑战,但是借助图表,我们可以清楚地理解这四个基本操作。
当我们合并两个表时,新表会合并左表和右表的字段内容,这就是join操作的基本原理。
首先我们遇到了INNERJOIN,它只存储两个表中满足连接条件的数据,比如求两个集合的交集。
如果表与其自身连接,则称为自连接,用于查找表内的相关关系。
另一种是LEFTJOIN(左外连接),其特点是结果集中包含左表的所有数据。
如果左表中的某行在右表中没有匹配,则右表中相应的字段值将显示为NULL。
相反的是RIGHTJOIN(右外连接),它将包含右表中的所有数据。
如果右表中的某行与左表中没有匹配,则左表中相应的字段值将变为NULL。
最后,FULLOUTERJOIN看起来很强大,但是在MySQL中不支持。
它的作用是连接LEFTJOIN和RIGHTJOIN结果,即它包含所有可能的匹配和NULL值。
通过这些简单的解释和图解,你应该对SQL中的四个相关查询有更直观的了解。
精通它们将帮助您更有效地执行数据操作和分析。
文章标签:
SQL 连接查询
热门文章
1
SQL2000数据库备份压缩技巧:优化空... 怎么将SQL2000中的较大的备份数据库压缩变小更改数据库属性-选项-恢复模型很...

2
高效掌握:CMD命令轻松启动、关闭及登录... 如何用cmd命令快速启动和关闭mysql数据库服务开发中经常使用MySQL数据库...

3
SQL字符串处理技巧:单引号使用与转义标... SQL语句中,字符串类型的值均使用什么符号标明?单引号如果字符串内有单引号,请小...

4
Windows环境下Redis安装指南与... redis安装windowsredis基本简介与安装安装Redis首先需要获取安...

5
深度解析:Redis性能优势与局限性,助... redis有哪些优缺点?Redis的全称是RemoteDictionary.Se...

6
深入解析:MySQL数据库的特性与应用 mysql是什么MySQL是一个关系数据库管理系统。MySQL是一个开源关系数据...

7
SQL字符串转日期:CONVERT()函... sql字符串转换成日期将SQL字符串转换为日期;您可以使用CONVERT()函数...

8
SQL多表查询连接方式解析:内连接、外连... SQL多表查询的几种连接方式。WHERE条件:在带有ON条件的SELECT语句中...

9
一招轻松掌握:如何快速查看MySQL版本... 查看MySQL版本一步轻松搞定看mysql版本MySQL是一种关系数据库,有许多...

10
Python字符串格式化方法:.form... 格式化字符串是什么意思吸引力从某种意义上说,一个软件项目包含了大量与数据(尤其是...