SQL三表联合查询技巧:内连接、外连接详解
求三表联合查询的SQL查询语句
汽车消息公告:selectusername,pswfrom(a1leftjoina2ona1.a1_id=a2.a1_id)leftjoina3ona1.a1_id=a3.a1_id
这样写:
SELECT
S.SNameAS姓名,CS.CourseNameAS当然,C.ScoreAS分数
FROMStudentsASS
INNERJOINScoreASCON(S.SCode=C.StudentID
INNERJOINCourseASCSON(CS.CourseID=C.CourseID
扩展信息:SQL连接查询的分类
1.笛卡尔本质上是基于外键关系,过滤查询中包含的正确数据。
该语句有两种形式:
Select*fromdept,empwheredept.id=emp.dept_id
Select*fromdeptinnerjoinempondept.id=emp.dept_id
2.左外连接查询:在内连接的基础上,添加左表中存在但右表中不存在的字符
语句:Select*fromdeptjoinempondept.id=emp.dept_id
4.右外连接:从内连接中添加不在右表中的记录
语句:Select*fromdeptrightjoinempondept.id=emp。
部门ID
SQL多表查询的几种连接方式
。WHERE条件:在带有ON条件的SELECT语句中,这是过滤中间表的约束条件。
在非运行的单表查询中,这是限制实际表或中间查询结果返回的记录的约束。
在两个表或多表的连接中,约束限制连接的返回结果形成最终的中间表。
从这里可以看出,将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,中间表由两者组成表。
是状态滤波后的笛卡尔积。
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语句,也不允许指定显示列。
width列只能用*表示(在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;CT*来自订单自然左外部加入客户;语句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.NAMEFROM;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或LEFTOUTERJOINLEFTOUTER子句中指定的左表的所有行,而不仅仅是与连接列匹配的行。
如果左表中没有行与右表中的行匹配,则右表中所选列表的所有列在关联结果集的行中都将包含空值。
2)RIGHTJOIN或RIGHTOUTERJOIN右外连接是左外连接的逆连接。
将返回右表中的所有行。
如果右表中没有行与左表中的匹配行,则左表返回空值。
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:其中条件是独立的。
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所示的结果。
因此,建议在编写连接查询时,ONLYONLY应该跟在CONNECT条件之后,并且所有限制中间表的条件都应该写在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)左连接选择*,b.*fromaleftjoinbona.i结果d=b.parent_id是一张图像312312李四23423王武null3)右连接Selecta.*,b.*fromarightjoinbona.id=b.parent_id结果是一张图像312312李四2342null33444)全连接Selecta。
ta.*,b.*fromafulljoinbona.id=b.parent_id结果是图像Single312312李四2342null33443王武null2.存储过程、函数等更高级的方法3.Join查询总结是SQLJoin查询的核心连接类型的确定根据实际需要而定。
如果选择不正确,不但不会提高查询效率,反而会导致一些逻辑错误或者性能下降。
下面总结一下确定两个表之间的连接查询方法的依据:1、使用内连接来检查两个表的列相等的数据。
2.当Col_L是Col_R的子集时,使用右外连接。
3.Col_R是col设置_L时使用左外连接。
4.当Col_R和Col_L有交集但互不子集时,使用全外法。
5.执行diff操作时使用共享查询。
当查询多个表时,这些不同的连接类型可以写在一起。
例如: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查询的几种连接方式:bsplandiff、正确的外连接www.parententerelse
sql中内连接使用详细说明
SQL中的内连接
在SQL中,内连接是一种在两个或多个表之间根据一定的匹配条件获取数据的查询方法。
仅返回满足连接条件的记录。
下面是SQL内连接的详细说明:
1.定义和基本语法
内连接根据两个或多个表之间的列值匹配返回记录。
如果在两个表中找到指定条件的匹配项,则将返回这些记录。
基本语法如下:
SQL
SELECT列名
FROM表1
INNERJOIN表2
ON表1.列名=表2.列名;
2.连接方法
内连接可以分为多种类型,最常见的是基于等连接的内连接。
假设有两个表A和B。
两个表都有一个名为ID的列。
我们可以根据该列进行内连接。
此外,还可以使用其他比较运算符如“>”、“<”等进行链接。
需要注意的是,内连接默认是等连接。
3.特点和优点
内连接的主要作用是只返回满足连接条件的记录。
对于具有相关关系的表,如果某条记录在连接条件中未找到匹配项,则该记录不会出现在结果集中。
此功能使内连接在处理大量数据时更加高效。
同时,明智地使用内连接可以有效地组织和简化复杂的查询逻辑。
4.示例
假设有两个表:员工表和部门表,它们通过部门ID链接。
我们可以使用内连接来查询所有员工及其部门的姓名:
sql
SELECTEmployees.Name,Departments.DepartmentName
FROMEmployees
INNERJOINDepartmentsONEmployees.DepartmentID=Departments.DepartmentID;
上面的查询返回所有员工的姓名及其对应的部门。
仅当“雇员”表中的部门ID与“部门”表中的部门ID匹配时,记录才会出现在结果集中。
如果没有匹配,则不会出现在结果集中。
这基本上就是内部联接的工作原理。