SQL 左外连接,右外连接,全连接,内连接 4种连接的区别
连接件可在条或子句中指定~建连在子句中指定连接件。条和子句FROMWHEREFROMWHEREHAVING
也可以包含搜索件~以连一步连连连接件所连的行。条条
连接可分连以下连,几
内连接。;典型的连接算~使用像 运 或 之连的比连算符,。包括运 相等连接和自然连接 。 = <>
内运个两个连接使用比连算符根据每表共有的列的连匹配表中的行。例如~连索 和 students courses
表中生连连相同的所有行。学号
外连接。外连接可以是左向外连接、右向外连接或完整外部连接。
在子句中指定外连接连~可以由下列连连连字中的一连指定,几 FROM
或 。 LEFT JOIN LEFT OUTER JOIN
左向外连接的连果集包括子句中指定的左表的所有行~而不连连是连接列所匹配的行。如果 LEFT OUTER
左表的某行在右表中有匹配行~连在相连连的连果集行中右表的所有连连列表列均连空连。没
或 。 RIGHT JOIN RIGHT OUTER JOIN
右向外连接是左向外连接的反向连接。将没将返回右表的所有行。如果右表的某行在左表中有匹配行~连连左
表返回空连。
或 。 FULL JOIN FULL OUTER JOIN
完整外部连接返回左表和右表中的所有行。某行在一表中有匹配行连~连一表的连连列表列包当另个没另个
含空连。如果表之连有匹配行~连整连果集行包含基表的据连。个数
交叉连接。交叉连接返回左表中的所有行~左表中的每一行右表中的所有行连合。交叉连接也作笛连连与称卡。
例如~下面的连接连索某出版商居住在相同州和城市的作者, 内与个
USE pubs
SELECT a.au_fname, a.au_lname, p.pub_name
FROM authors AS a INNER JOIN publishers AS p
ON a.city = p.city
AND a.state = p.state
ORDER BY a.au_lname ASC, a.au_fname ASC
子句中的表或连连可通连连接或完整外部连接按任意连序指定~但是~用左或右向外连接指定表或内 FROM
连连连~表或连连的连序重要。有连使用左或右向外连接排列表的更多信息~连连使用外连接。很参
例子,
表 表 aid name bid job parent_id
连 1 3 1 23 1
李四 2 2 34 2
王武 3 3 34 4
同存在连系 a.idparent_id
内连接
select a.*,b.* from a inner join b on a.id=b.parent_id
连果是
连 1 3 1 23 1
李四 2 2 34 2
左连接
select a.*,b.* from a left join b on a.id=b.parent_id
连果是
连 1 3 1 23 1
李四 2 2 34 2
王武 3 null
右连接
select a.*,b.* from a right join b on a.id=b.parent_id
连果是
连 1 3 1 23 1
李四 2 2 34 2
null 3 34 4
完全连接
select a.*,b.* from a full join b on a.id=b.parent_id
连果是
连 1 3 1 23 1
李四 2 2 34 2
null 3 34 4
王武 3 null
SQL code
DECLARE @TA TABLE (IDA INT,VA VARCHAR(10))
DECLARE @TB TABLE (IDB INT,VB VARCHAR(10)) INSERT INTO @TA SELECT 1,'AA' UNION SELECT 2,'BC' UNION
SELECT 3,'CCC' INSERT INTO @TB SELECT 1,'2' UNION
SELECT 3,'58' UNION SELECT 4,'67' --连接连连法 内写SELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A,@TB B WHERE
A.IDA=B.IDB --连接 内SELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A INNER JOIN @TB B ON A.IDA=B.IDB SELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A JOIN @TB B ON
A.IDA=B.IDB --左外连接 SELECT A.IDA,A.VA,B.IDB,B.VB FROM
@TA A LEFT JOIN @TB B ON A.IDA=B.IDB SELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A LEFT OUTER JOIN @TB B
ON A.IDA=B.IDB --右外连接 SELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A RIGHT JOIN @TB B ON A.IDA=B.IDB SELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A RIGHT OUTER JOIN @TB B ON A.IDA=B.IDB --完整外连接 SELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A FULL JOIN @TB B ON A.IDA=B.IDB SELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A FULL OUTER JOIN @TB B
ON A.IDA=B.IDB --交叉连接 SELECT A.IDA,A.VA,B.IDB,B.VB
FROM @TA A CROSS JOIN @TB B --自连接 SELECT
A.IDA,A.VA,B.IDA,B.VA FROM @TA A,@TA B WHERE A.IDA=B.IDA+1 连连分析器中连行, --建表table1,table2, create table table1(id int,name varchar(10)) create table table2(id int,score int) insert into table1 select 1,'lee' insert into table1 select 2,'zhang' insert into table1 select 4,'wang' insert into table2 select 1,90 insert into table2 select 2,100 insert into table2 select 3,70 如表 ---------
---------------------------------------- table1|table2|
------------------------------------------------- idname|idscore| 1lee|
190| 2zhang|2100| 4wang|370|
------------------------------------------------- 以下均在连连分析器中连行 一、外连接 1.念,包括左向外连接、右向外连接或完整外部连接 概2.左连接,left join 或 left outer join (1)左向外连接的连果集包括 LEFT OUTER 子句中指定的左表的所有行~而不连连是连接列所匹配的行。如果左表的某行在右表中有匹配行~连在相连连的连果集行中右表的所有连连列没
表列均连空连(null)。 (2)sql连句 select * from table1 left join table2 on
table1.id=table2.id -------------连果------------- idnameidscore ------------------------------ 1lee190 2zhang2100 4wangNULLNULL
------------------------------ 注连,包含table1的所有子句~根据指定条件返回table2相连的字段~不符合的以null连示 3.右连接,right join 或 right outer join (1)右向外连接是左向外连接的反向连接。返回右表的所将
有行。如果右表的某行在左表中有匹配行~连连左表返回空连。 没将(2)sql
连句 select * from table1 right join table2 on table1.id=table2.id -------------连果------------- idnameidscore ------------------------------
1lee190 2zhang2100 NULLNULL370 ------------------------------
注连,包含table2的所有子句~根据指定件返回条table1相连的字段~不符合的以null连示 4.完整外部连接:full join 或 full outer join (1)完整外部连接返回左表和右表中的所有行。某行在一表中有匹配行连~当另个没
连一表的连连列表列包含空连。如果表之连有匹配行~连整连果集行包含另个个
基表的据连。 数(2)sql连句 select * from table1 full join table2 on
table1.id=table2.id -------------连果------------- idnameidscore ------------------------------ 1lee190 2zhang2100 4wangNULLNULL
NULLNULL370 ------------------------------ 注连,返回左右连接的和;连上左、右连接, 二、连接 内1.念,连接是用比连算符比连要连接列概内运
的连的连接 2.连接,内join 或 inner join 3.sql连句 select * from table1
join table2 on table1.id=table2.id -------------连果-------------
idnameidscore ------------------------------ 1lee190 2zhang2100 ------------------------------ 注连,只返回符合件的条table1和table2的
列 4.等价;下列连行效果相同, 与A:select a.*,b.* from table1
a,table2 b where a.id=b.id B:select * from table1 cross join table2
where table1.id=table2.id (注,cross join后加件只能用条where,不能用
on) 三、交叉连接(完全) 1.念,有 概没WHERE 子句的交叉连接连生连将
接所涉及的表的笛连连。第一表的行乘以第二表的行等于笛连连卡个数个数卡
连果集的大小。;table1和table2交叉连接连生3*3=9连连, 条2.交叉连接,
cross join (不连件条where...) 3.sql连句 select * from table1 cross join
table2 -------------连果------------- idnameidscore
------------------------------ 1lee190 2zhang190 4wang190 1lee2100
2zhang2100 4wang2100 1lee370 2zhang370 4wang370 ------------------------------ 注连,返回3*3=9连连~笛连连 条即卡4.等价
;下列连行效果相同, 与A:select * from table1,table2