sql语句中join ,left join ,right join有什么区别 sql语句中join、left join 、right jo...

sql\u8bed\u53e5\u4e2djoin\u3001left join \u3001right join\u6709\u4ec0\u4e48\u533a\u522b\uff1f

left join :\u5de6\u8fde\u63a5\uff0c\u8fd4\u56de\u5de6\u8868\u4e2d\u6240\u6709\u7684\u8bb0\u5f55\u4ee5\u53ca\u53f3\u8868\u4e2d\u8fde\u63a5\u5b57\u6bb5\u76f8\u7b49\u7684\u8bb0\u5f55\u3002right join :\u53f3\u8fde\u63a5\uff0c\u8fd4\u56de\u53f3\u8868\u4e2d\u6240\u6709\u7684\u8bb0\u5f55\u4ee5\u53ca\u5de6\u8868\u4e2d\u8fde\u63a5\u5b57\u6bb5\u76f8\u7b49\u7684\u8bb0\u5f55\u3002
SQL\u8bed\u53e5
inner join: \u5185\u8fde\u63a5\uff0c\u53c8\u53eb\u7b49\u503c\u8fde\u63a5\uff0c\u53ea\u8fd4\u56de\u4e24\u4e2a\u8868\u4e2d\u8fde\u63a5\u5b57\u6bb5\u76f8\u7b49\u7684\u884c\u3002
full join:\u5916\u8fde\u63a5\uff0c\u8fd4\u56de\u4e24\u4e2a\u8868\u4e2d\u7684\u884c\uff1aleft join + right join
cross join:\u7ed3\u679c\u662f\u7b1b\u5361\u5c14\u79ef\uff0c\u5c31\u662f\u7b2c\u4e00\u4e2a\u8868\u7684\u884c\u6570\u4e58\u4ee5\u7b2c\u4e8c\u4e2a\u8868\u7684\u884c\u6570\u3002

join\u7b49\u4ef7\u4e8einner
join\u5185\u8fde\u63a5\uff0c\u662f\u8fd4\u56de\u4e24\u4e2a\u8868\u4e2d\u90fd\u6709\u7684\u7b26\u5408\u6761\u4ef6\u7684\u884c\u3002
left
join\u5de6\u8fde\u63a5\uff0c\u662f\u8fd4\u56de\u5de6\u8868\u4e2d\u6240\u6709\u7684\u884c\u53ca\u53f3\u8868\u4e2d\u7b26\u5408\u6761\u4ef6\u7684\u884c\u3002
right
join\u53f3\u8fde\u63a5\uff0c\u662f\u8fd4\u56de\u53f3\u8868\u4e2d\u6240\u6709\u7684\u884c\u53ca\u5de6\u8868\u4e2d\u7b26\u5408\u6761\u4ef6\u7684\u884c\u3002
full
join\u5168\u8fde\u63a5\uff0c\u662f\u8fd4\u56de\u5de6\u8868\u4e2d\u6240\u6709\u7684\u884c\u53ca\u53f3\u8868\u4e2d\u6240\u6709\u7684\u884c\uff0c\u5e76\u6309\u6761\u4ef6\u8fde\u63a5\u3002
\u901a\u5e38\u60c5\u51b5\u4e0b\uff0cleft
join\u80af\u5b9a\u6bd4inner
join\u8fd4\u56de\u7684\u884c\u6570\u591a\u3002

left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录。
right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录。
inner join: 内连接,又叫等值连接,只返回两个表中连接字段相等的行。
full join:外连接,返回两个表中的行:left join + right join
cross join:结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。

declare @a table(a int,b int)
declare @b table(a int,b int)

insert @a values(1,1)
insert @a values(2,2)
insert @b values(1,1)
insert @b values(3,3)
select * from @a
select * from @b
--左:
select * from @a Aa left join @b Bb on Aa.a=Bb.a
--右:
select * from @a Aa right join @b Bb on Aa.a=Bb.a
--内
select * from @a Aa inner join @b Bb on Aa.a=Bb.a
--外:
select * from @a Aa full join @b Bb on Aa.a=Bb.a
--交叉连接
select * from @a cross join @b

left\right join是外部连接,inner join是内连接
外部连接有主表与从表,主表在left中是左侧表,right中是右侧表,主表数据会全部显示,从表数据则只显示关联部分匹配的数据,无匹配的数据用null补全
内连接则只显示两表关联条件匹配的数据
注:所谓关联条件即是指on的条件

join等价于inner join内连接,是返回两个表中都有的符合条件的行。

left join左连接,是返回左表中所有的行及右表中符合条件的行。

right join右连接,是返回右表中所有的行及左表中符合条件的行。

full join全连接,是返回左表中所有的行及右表中所有的行,并按条件连接。

通常情况下,left join肯定比inner join返回的行数多。

二、内连接(INNER JOIN)

内连接(INNER JOIN):有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。

例如:下面的语句3和语句4的结果是相同的。

语句3:隐式的内连接,没有INNER JOIN,形成的中间表为两个表的笛卡尔积(如果没有where条件)。

SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAMEFROM CUSTOMERS C,ORDERS O WHERE C.ID=O.CUSTOMER_ID;

语句4:显示的内连接,一般称为内连接,有INNER JOIN,形成的中间表为两个表经过ON条件过滤后的笛卡尔积。

SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAMEFROM CUSTOMERS C INNER JOIN ORDERS O ON C.ID=O.CUSTOMER_ID;

三、外连接(OUTER JOIN)(必须有ON条件):
外连不但返回符合连接和查询条件的数据行,还返回不符合条件的一些行。
外连接分三类:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。
三者的共同点是都返回符合连接条件和查询条件(即:内连接)的数据行。不同点如下:
左外连接还返回左表中不符合连接条件单符合查询条件的数据行。
右外连接还返回右表中不符合连接条件单符合查询条件的数据行。
全外连接还返回左表中不符合连接条件单符合查询条件的数据行,并且还返回右表中不符合连接条件单符合查询条件的数据行。全外连接实际是上左外连接和右外连接的数学合集(去掉重复),即“全外=左外 UNION 右外”。
说明:左表就是在“(LEFT OUTER JOIN)”关键字左边的表。右表当然就是右边的了。在三种类型的外连接中,OUTER 关键字是可省略的。
下面举例说明:

语句5:左外连接(LEFT OUTER JOIN)
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;

语句6:右外连接(RIGHT OUTER JOIN)
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O RIGHT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;注意:WHERE条件放在ON后面查询的结果是不一样的。例如:

语句7:WHERE条件独立。
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_IDWHERE O.ORDER_NUMBER<>'MIKE_ORDER001';

语句8:将语句7中的WHERE条件放到ON后面。
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEFROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID AND O.ORDER_NUMBER<>'MIKE_ORDER001';

从语句7和语句8查询的结果来看,显然是不相同的,语句8显示的结果是难以理解的。因此,推荐在写连接查询的时候,ON后面只跟连接条件,而对中间表限制的条件都写到WHERE子句中。

left join   :左连接,返回左表中所有的记录以及右表中连接字段相等的记录。
right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录。



扩展阅读:join left join ... sql join on 三表连接 ... sql inner join ... sql中的join on用法 ... sql full join ... left join写法 ... join on and ... sql语句left join ... sql join on 多个条件 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网