`
独善其身008
  • 浏览: 171318 次
  • 性别: Icon_minigender_2
  • 来自: 苏州
文章分类
社区版块
存档分类
最新评论

SQL多表关联! inner join,left join ,right join

 
阅读更多

SQL多表关联! inner join,left join ,right join
2007-08-06 20:35

我对多表关联的总结://以下若有理解错误请指出,谢谢!
内连接      
INNER JOIN:只显示多表之间与关联条件相匹配的列.

外连接:
LEFT JOIN :以左表为基础,显示左表中的所有列,不管是否与关联条件相匹配,而右表中的数据只显示与关联条件相匹配的列,不匹配的列以NULL字符填充.

RIGHT JOIN:以右表为基础,显示右表中的所有列,不管是否与关联条件相匹配,而左表中的数据只显示与关联条件相匹配的列,不匹配的列以NULL字符填充.

FULL JOIN :显示多个表中的所有的列,不匹配关联条件的列以NULL字符填充.

下面是我写的关于sql 多表关联的sql语句,大家可以在SQL SERVER中操作下试下,是否与上面的对于sql关联的总结相同,查询结果我就不结了,大家试下就知道了!

create database mydb;

use mydb;

create table customers
(
cust_id int not null identity(1,1) primary key,
cust_name varchar(100) not null,
cust_tel varchar(50) not null,
cust_address varchar(100) not null 
)

create table books
(
isbn int not null identity(700001,1),
book_name varchar(100) not null,
price money not null
)

create table orders
(
order_id int not null identity(1001,1),
isbn int not null,
cust_id int not null,
order_date datetime not null
)


insert into customers(cust_name,cust_tel,cust_address) values('书店a','0553-2451466','江苏省');
insert into customers(cust_name,cust_tel,cust_address) values('书店b','0553-2215266','江苏省');
insert into customers(cust_name,cust_tel,cust_address) values('书店c','0553-8754466','江苏省');
insert into customers(cust_name,cust_tel,cust_address) values('书店d','0553-4563466','江苏省');
insert into customers(cust_name,cust_tel,cust_address) values('书店e','0553-2145212','江苏省');

insert into books(book_name,price) values('php',78);
insert into books(book_name,price) values('java',72);
insert into books(book_name,price) values('c++',72);
insert into books(book_name,price) values('C语言',56);
insert into books(book_name,price) values('sql',53);
insert into books(book_name,price) values('asp.net',69);
insert into books(book_name,price) values('asp',43);

insert into orders(isbn,cust_id,order_date) values(700001,1,getdate());
insert into orders(isbn,cust_id,order_date) values(700002,1,getdate());
insert into orders(isbn,cust_id,order_date) values(700003,2,getdate());
insert into orders(isbn,cust_id,order_date) values(700001,1,getdate());
insert into orders(isbn,cust_id,order_date) values(700003,1,getdate());
insert into orders(isbn,cust_id,order_date) values(700006,1,getdate());
insert into orders(isbn,cust_id,order_date) values(700001,2,getdate());
insert into orders(isbn,cust_id,order_date) values(700001,2,getdate());
insert into orders(isbn,cust_id,order_date) values(700002,2,getdate());
insert into orders(isbn,cust_id,order_date) values(700003,1,getdate());
insert into orders(isbn,cust_id,order_date) values(700003,9,getdate());--我下面是故意的,让大家看到效果
insert into orders(isbn,cust_id,order_date) values(7000025,9,getdate());

select a.order_id,a.isbn,b.book_name,b.price,c.cust_name,c.cust_tel,c.cust_address,a.order_date
from orders as a inner join books as b 
on
a.isbn=b.isbn inner join customers as c
on
a.cust_id=c.cust_id;


select a.order_id,a.isbn,b.book_name,b.price,c.cust_name,c.cust_tel,c.cust_address,a.order_date
from orders as a left join books as b 
on
a.isbn=b.isbn left join customers as c
on
a.cust_id=c.cust_id;


select a.order_id,a.isbn,b.book_name,b.price,c.cust_name,c.cust_tel,c.cust_address,a.order_date
from orders as a right join books as b 
on
a.isbn=b.isbn right join customers as c
on
a.cust_id=c.cust_id;

 

左表右表指哪些表?
select * from 
table_1 as a left join table_2 as c
on
a.id=b.id 
leftjoin table_3 as c
on
b.isbn=c.isbn


疑问中............
第一种认为:
认为最左边的表左表 table_1
右表就是除了左表的其它表,而不是最右边的表
所以这里的左表是 table_1,那右表是table_2,table_3

第二种认为:
table_1 是table_2的左表,table_2是table_3的左表

CSDN SQL专区提问,竟请您的加盟:http://community.csdn.net/Expert/topic/5696/5696608.xml?temp=.4501764

还请牛人指点!

最终答案:
table_1 左连接 table_2 以table_1为基础进行连接运算,得到新表即临时表(#table)。
#table     左连接 table_3 以table# 为基础进行连接运算,得到最终结果。
与我的总结一致!


以下是来自网上的关于关联说的比较好的文章(易懂)
来自:http://www.cnblogs.com/temptation/archive/2006/05/23/407328.aspx
表A记录如下:
aID                  aNum
1                     a20050111
2                     a20050112
3                     a20050113
4                     a20050114
5                     a20050115


表B记录如下:
bID                  bName
1                      2006032401
2                     2006032402
3                     2006032403
4                     2006032404
8                     2006032408

实验如下:
1.              left join
sql语句如下: 

SQL多表关联! inner join,left join ,right join - 十维空间 - SunriseSELECT * FROM A
SQL多表关联! inner join,left join ,right join - 十维空间 - Sunrise
LEFT JOIN B 
SQL多表关联! inner join,left join ,right join - 十维空间 - Sunrise
ON A.aID = B.bID

结果如下:
aID                  aNum                             bID                     bName
1                      a20050111                   1                         2006032401
2                      a20050112                   2                        2006032402
3                      a20050113                   3                        2006032403
4                      a20050114                   4                        2006032404
5                      a20050115                   NULL                 NULL

(所影响的行数为 5 行)

结果说明:
                  left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).
B表记录不足的地方均为NULL.


2.              right join
sql语句如下: 
SQL多表关联! inner join,left join ,right join - 十维空间 - SunriseSELECT * FROM A
SQL多表关联! inner join,left join ,right join - 十维空间 - Sunrise
RIGHT JOIN B 
SQL多表关联! inner join,left join ,right join - 十维空间 - Sunrise
ON A.aID = B.bID

结果如下:
aID                  aNum                             bID                     bName
1                      a20050111                   1                         2006032401
2                      a20050112                   2                        2006032402
3                      a20050113                   3                        2006032403
4                      a20050114                   4                        2006032404
NULL              NULL                          8                        2006032408

(所影响的行数为 5 行)

结果说明:
                  仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.


3.inner join
sql语句如下: 
SQL多表关联! inner join,left join ,right join - 十维空间 - SunriseSELECT * FROM A
SQL多表关联! inner join,left join ,right join - 十维空间 - SunriseINNERJOIN B 
SQL多表关联! inner join,left join ,right join - 十维空间 - Sunrise
ON A.aID = B.bID

结果如下:
aID                  aNum                             bID                     bName
1                      a20050111                   1                         2006032401
2                      a20050112                   2                        2006032402
3                      a20050113                   3                        2006032403
4                      a20050114                   4                        2006032404


结果说明:
                  很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.


-----------------[以下为网上的一点资料]------------------ 
LEFT JOIN操作用于在任何的 FROM 子句中,组合来源表的记录。使用 LEFT JOIN 运算来创建一个左边外部联接。左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即使在第二个(右边)表中并没有相符值的记录。 

语法:
FROM table1 LEFT JOIN table2 ON table1.field1 compopr table2.field2 

说明:
① table1, table2参数用于指定要将记录组合的表的名称。
② field1, field2参数指定被联接的字段的名称。且这些字段必须有相同的数据类型及包含相同类型的数据,但它们不需要有相同的名称。
③ compopr参数指定关系比较运算符:"=", "<", ">", "<=", ">=" 或 "<>"。
④ 如果在INNER JOIN操作中要联接包含Memo 数据类型或 OLE Object 数据类型数据的字段,将会发生错误。

分享到:
评论
1 楼 沧澜竹 2016-05-28  
受益1111111111111

相关推荐

    SQL语句left join/right join/inner join 的用法比较

    在SQL查询中,JOIN操作是连接...在实际数据库设计中,JOIN操作是构建复杂查询的重要工具,尤其在处理多表关系时。理解并熟练掌握LEFT JOIN、RIGHT JOIN和INNER JOIN的使用,能帮助我们更有效地从数据库中提取所需信息。

    inner join、 left join 、right join、 outer join之间的区别

    `INNER JOIN`仅返回匹配的行,而`LEFT JOIN`和`RIGHT JOIN`分别优先考虑左侧和右侧的表,即使另一侧没有匹配也会返回数据。`FULL OUTER JOIN`则返回所有记录,无论是否有匹配。正确理解这些连接方式有助于更有效地...

    SQL中的left outer join,inner join,right outer join用法详解

    * RIGHT OUTER JOIN:与 LEFT 相同,但两个表的角色互换。 * FULL OUTER JOIN:LEFT OUTER 和 RIGHT OUTER 中所有行的超集。 内连接(Inner Join) 内连接是最常见的一种连接,它也被称为普通连接,而 E.FCodd 最...

    SQL语句inner join,left join ,right join连接的不同之处

    在SQL语言中,连接(Join)操作是一种非常重要的数据整合方式,主要用于从两个或多个表中提取数据。根据连接方式的不同,可以分为多种类型,包括内连接(Inner Join)、左连接(Left Join)以及右连接(Right Join)...

    关于sql的left join,right join,inner join,outerjoin

    总之,LEFT JOIN、RIGHT JOIN、INNER JOIN和OUTER JOIN是SQL语言中的核心部分,理解和熟练运用它们对于任何数据库开发人员都至关重要。通过不断的实践和学习,你可以更好地掌握这些JOIN类型,并在解决复杂数据查询...

    SQL表连接查询(inner join、full join、left join、right join)1

    在SQL中,主要有四种类型的连接查询:内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL JOIN)。下面将详细解释这四种连接方式。 1. 内连接(INNER JOIN): 内连接返回两个表中...

    (Left join , Right Join, Inner Join)用法详解

    ### (Left join , Right Join, Inner Join)用法详解 #### 一、基本概念与应用场景 在数据库查询语言SQL中,连接(Join)是一种非常重要的操作,它允许我们结合两个或多个表的数据来检索信息。根据不同的连接方式,...

    left join right join inner join 区别和联系

    左连接(LEFT JOIN)、右连接(RIGHT JOIN)和内连接(INNER JOIN)是三种最基本的连接类型。在本节中,我们将详细介绍左连接、右连接和内连接的区别和联系。 左连接(LEFT JOIN) 左连接返回左表中的所有行,右表...

    SQL 外链接操作小结 inner join left join right join

    SQL 外链接操作小结 inner join left join right join SQL 外链接操作是关系型数据库管理系统中的一种基本操作,用于从多个表中检索数据。外链接操作可以分为三种:inner join、left join 和 right join。 inner ...

    数据库关联查询(left,right,inner join)

    ### 数据库关联查询(Left, Right, Inner Join) 在数据库管理与操作中,关联查询是一项极为重要的技术,它能够帮助我们高效地从多个表中提取数据,并根据特定条件进行匹配和整合。本文将通过通俗易懂的方式,详细...

    SQL多表连接查询、多表关联

    sql多表连接查询inner join, left join , right join ,full join ,cross join Posted on 2008-05-07 21:55 我开始懂了 阅读(21431) 评论(9) 编辑 收藏 inner join,full outer join,left join,right jion 内部连接 ...

    SQL left join

    SQL Left Join、Right Join和Inner Join都是用于组合表数据的查询操作,但它们之间存在着明显的区别。 * Left Join:以左表为基础,返回左表中的所有记录和右表中符合条件的记录。 * Right Join:以右表为基础,...

    sql join( inner join, outer join) 分析

    在实际工作中,根据需求选择合适的JOIN类型,能帮助我们更高效地处理多表数据,从而提高数据处理的效率和准确性。《数据库表连接和查询分析.doc》这样的文档很可能包含了这些概念的详细解释和示例,有助于进一步学习...

    关于SQL 中的inner join的使用

    **INNER JOIN** 是SQL中最常用的连接类型之一,主要用于从两个或多个表中提取数据,其中仅返回那些满足连接条件的记录。简单来说,INNER JOIN返回的是两个表中匹配部分的数据。 #### 二、INNER JOIN的语法结构 ...

    hive sql + left join 数据缺失

    ### Hive SQL Left Join 数据缺失问题解析 #### 一、问题背景 在大数据处理场景中,Hive 是一种广泛使用的工具,用于对存储在 Hadoop 文件系统中的数据进行数据汇总、查询和分析。随着Hive版本的不断更新,部分用户...

    kettle实现SQL关联查询

    "Merge Join" Step就是其中之一,它允许用户实现类似SQL中的各种类型关联查询,包括INNER JOIN、LEFT JOIN、RIGHT JOIN以及FULL JOIN。 INNER JOIN是SQL中的一种基本联接类型,它返回两个表中存在匹配的记录。在...

    SQL中inner join、outer join和cross join的区别

    根据不同的连接方式,`JOIN`可以分为几种类型,包括`INNER JOIN`、`OUTER JOIN`(左外联接`LEFT JOIN`、右外联接`RIGHT JOIN`以及全外联接`FULL JOIN`)和`CROSS JOIN`。每种类型的`JOIN`都有其独特的应用场景和特点。...

    MySQL JOIN 语法说明与 INNER JOIN 语法用法实例.docx

    JOIN 通常与 ON 关键字搭配使用,基本语法如下:`FROM table1 INNER|LEFT|RIGHT JOIN table2 ON condition`,其中 `table1` 通常称为左表,`table2` 称为右表。ON 关键字用于设定匹配条件,用于限定在结果集合中想要...

    SQL语句优化之JOIN和LEFT JOIN 和 RIGHT JOIN语句的优化

    SQL语句优化对于大型数据库系统至关重要,特别是在涉及多表查询时,JOIN、LEFT JOIN 和 RIGHT JOIN 的高效运用能显著提升查询速度。以下将详细探讨这些JOIN类型以及相关的优化策略。 JOIN原理: JOIN操作实际上是...

    join on 语句及扩展

    在SQL查询中,JOIN操作是用于合并两个或更多表中的数据的关键部分,它允许你在不同表之间建立联系,以便从多个源获取所需的信息。这里我们将深入探讨几种JOIN类型及其使用,以及ON和WHERE子句的区别。 1. INNER ...

Global site tag (gtag.js) - Google Analytics