多表联合查询sql语句

多表联合查询SQL语句主要通过JOIN关键字实现,如内连接、左连接、右连接和全连接。

说明:

在关系数据库中,我们经常需要查询多个表来检索所需的数据。
这时,常见的多表查询就显得尤为重要。
SQL中的JOIN语句允许我们根据它们之间的某些连接条件将两个或多个表连接在一起进行查询。

1.INNERJOIN:

这是最常用的连接查询方法。
它仅返回两个表中具有匹配数据的行。
语法如下:

sql

SELECT列名

FROM表1

INNERJOIN表2

ON表1.列名=表2.列名;

这里的“ON”关键字后面是连接两个表的条​​件。

2.LEFTJOIN:

左连接返回左表中的所有记录以及右表中的匹配记录。
如果相应的表中没有匹配的记录,则结果中相应的字段将为NULL。
语法与INNERJOIN类似。

3.RIGHTJOIN:

右连接与左连接相反,返回右表中的所有记录以及左表中的匹配记录。
如果左表中没有匹配的记录,则结果中对应的字段也将为NULL。
同样,语法与INNERJOIN类似。

4.FULLJOIN:

全连接返回左右表中的所有记录。
如果给定一侧没有匹配的记录,则结果中相应字段将为NULL。
它的使用相对较少,但在某些情况下非常有用。

除了上述基本的JOIN操作外,还可以使用其他SQL语句,例如WHERE、GROUPBY等,来执行更复杂的查询操作。
多表联合查询是SQL中一个强大的功能,可以大大提高数据查询的效率和灵活性。
在实际应用中,根据需要选择合适的连接方法,可以有效地从多个表中提取所需的数据。

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


WHERE条件:在带有ON条件的SELECT语句中,是过滤中间表的约束条件。
在没有ON的单表查询中,它是一个约束,限制物理表或中间查询结果返回的记录。
在两表或多表连接中,约束限制连接的返回结果形成最终的中间表。
从这里可以看出,将WHERE条件移到ON之后是不合适的。
推荐的做法是:ON只进行连接操作,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的查询结果。
内连接使用比较运算符(包括=、>、<、<>、>=、<=、!>和!<)对表和符合连接条件的查询数据进行比较操作。
根据所使用的比较方法的不同,内连接分为三种类型:等价连接、自然连接和自连接。
等值连接是使用“=”关系连接表的查询。
查询结果列出了连接表中的所有列,包括重复列。
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_RLSNaturalINNERJOINPM_ACT_RLSONPM_ACT_JOB_RLS.RlsPK=PM_ACT_RLS.RlsPK语句1:SELECT*FROMORDERSONATURALINNERJOINCUSTOMERSC;语句2:SELECT*FROMORDERSONATURALLEFTOUTERJOINCUSTOMERSC;语句3:SELECT*FROMORDERSONATURALLIGHTOUTERJOINCUSTOMERSC;语句4:SELECT*FROMORDERSONATURALFULLOUTERJOINCUSTOMERSC;自连接如果在连接查询中,设计的两个表是同一个表,这种查询称为自连接查询。
--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.NAMEFROMORDERSOLEFTOUTERJOINCUSTOMERSCONC.ID=O.CUSTOMER_IDUNIONSELECTO.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROMORDERSORIGHTOUTERJOINCUSTOMERSCONC.ID=O.CUSTOMER_ID;联合连接(UNIONJOIN)这是一种很少见的连接方法。
Oracle和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外部加入。
内连接仅返回满足连接条件的数据行。
外连接不仅列出符合连接条件的行,还列出左表(左外连接时)、右表(连接右外连接时)或两者中所有符合搜索条件的数据行表(连接全外连接时)外连接有三种类型:左外连接、右外连接和全外连接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;注意:ON后面加WHERE条件,查询结果会有所不同。
例如:语句3:WHERE条件是独立的。
SELECTO.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROMORDERSOLEFTOUTERJOINCUSTOMERSCONC.ID=O.CUSTOMER_IDWHEREO.ORDER_NUMBER<>‘MIKE_ORDER001’;语句4:将语句7中的WHERE条件放在ON后面。
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示例a表b表idnameidjobparent_id1张312312李四23423王武33441)内连接selecta.*,b.*fromainnerjoinbona.id=b.parent_id结果为1312312李四23422)左连接selecta.*,b.*fromaleftjoinbona.id=b.parent_id结果为1张图片312312李四23423王五null3)右连接selecta.*,b.*fromarightjoinbona.id=b.parent_id结果为1张图片312312李四2342null33444)完成加入选择。
ta.*,b.*fromafulljoinbona.id=b.parent_id结果为1张图片312312李四2342null33443王武null2.存储过程、函数等更高级的方法。
3.总结Join查询是SQL查询的核心。
连接查询连接类型选择根据实际需要而定。
如果选择不当,不但不会提高查询效率,反而会造成一些逻辑错误或者性能低下。
下面总结了两个表之间连接查询的选择方法的依据:1、使用内连接来检查两个表的关联列是否相等的数据。
2.当Col_L是Col_R的子集时,使用右外连接。
3.Col_R是Col在取_L子集时使用左外连接。
4.当Col_R和Col_L有交集但互不子集时,使用全外法。
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多表查询的几种连接方式。
标签:bsplan差异str右外连接www.parententeranother