分享

SQL Server中的 多表关联 查找数据

 豫龙晏子 2017-02-06

大家在做项目中为了不使数据库出现大量的冗余数据,一定会在每张表中设置一个主键,用来链接区分每一张表。而多表连接正是是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。

首先跟大家讲一下小编所知的多表(3个表及以上)联合查询的办法,

①:连接查询,②:子查询。(当然如果小编漏掉其他方法的话,欢迎大家在评论中指出哈,小编会随后奉上)

当然第一步,先建立测试表:

--第一个:商品明细表:商品ID,名称

create table demo1 ( spID char(3), spName varchar(20))

insert demo1

select 'sp1','name1' union all

select 'sp2','name2' union all

select 'sp3','name3' union all

select 'sp4','name4' union all

select 'sp5','name5' union all

select 'sp6','name6' union all

select 'sp7','name7' union all

select 'sp8','name8' union all

select 'sp9','name9'

--第二个:商品价格表:商品ID,价格

create table demo2 (spID char(3), Lshj int)

insert demo2

select 'sp1',30 union all

select 'sp2',50 union all

select 'sp3',80 union all

select 'sp8',40 union all

select 'sp9',100

--第三个:在库数量表:名称,数量(只是举个例子方便大家理解。大家不要较真哈,建库的时候没人会脑残到这么建库的哈)

create table demo3 ( spName varchar(20), spShl int)

insert demo3

select 'name1',8 union all

select 'name2',5 union all

select 'name3',9 union all

select 'name6',3 union all

select 'name7',7

SQL Server中的 多表关联 查找数据

建立成功的表

  • 实例:我想查一下每一个*在库且有零售价*的商品名称、零售价、数量。

--方法一(子查询):

select t.spName,t.Lshj,a.spShl

from demo3 a,(select b.spName,c.Lshj from demo1 b,demo2 c where b.spID=c.spID ) t

where a.spName=t.spName

--方法二(连接查询)

select a.spName,b.Lshj,c.spShl

from demo1 a join demo2 b on a.spID=b.spID join demo3 c on a.spName=c.spName

--结论:两种方法得出的结果完全一样,如图

SQL Server中的 多表关联 查找数据

两种方法的结果对比

--注意:当我们想要查询在库的所有商品的价格时,子查询就不是那么灵便啦.因此我们的join语法的优势就能体现出来了。

  • 例如:要查询在库的所有商品的名称、价格

--方法:

select b.spName,a.spShl,c.Lshj

from demo3 a left join demo1 b on a.spName=b.spName left join demo2 c on c.spID=b.spID

得出的结果如图.SQL Server中的 多表关联 查找数据

好啦。讲了这么多,现在我正式进入join(连接查询)的专题哈。


  • @@@@

  • 连接查询(内连接、外连接、交叉连接)

  • @@@@

连接标准语法格式:

SQL-92标准所定义的FROM子句的连接语法格式为:

FROM 表1 join_type 表2 [ON (条件)]

其中。join_type 指出连接类型。

连接类型:

连接分为三种:内连接、外连接、交叉连接。

1.内连接(INNER JOIN)

使用比较运算符(包括=、>、<><>、>=、<=、!>和!<>

2.外连接

外连接分为左连接(LEFT JOIN)或左外连接(LEFT OUTER JOIN)、右连接(RIGHT JOIN)或右外

连接(RIGHT OUTER JOIN)、全连接(FULL JOIN)或全外连接(FULL OUTER JOIN)。我们就简单的叫:左连接、右连接和全连接。

1、左连接 left join:

概念:返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回NULL值。

select *

from demo1 a left join demo2 b on a.spid=b.spid

结果是:

SQL Server中的 多表关联 查找数据

left join

总结:左连接显示左表全部行,和右表与左表相同行。

2、右连接right join:

概念:恰与左连接相反,返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值。

select *

from demo2 a right join demo1 b on a.spid=b.spid

结果是:

SQL Server中的 多表关联 查找数据

right join

总结:右连接恰与左连接相反,显示右表全部行,和左表与右表相同行。

3

、全连接full join:

概念:返回左表和右表中的所有行。当某行在另一表中没有匹配行,则另一表中的列返回空值

交叉连接(CROSS JOIN):也称迪卡尔积

注释:(1)不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行

select *

from demo2 a cross join demo3

SQL Server中的 多表关联 查找数据

cross join

总结:相当与笛卡尔积,左表和右表组合。

(2)、有where子句,往往会先生成两个表行数乘积的数据表,然后才根据where条件从中选择。

select *

from demo2 a cross join demo3

where demo3.spShl>7

(注:cross join后加条件只能用where,不能用on)

SQL Server中的 多表关联 查找数据

添加where条件后的cross join

小提示:子查询就是查询中又嵌套的查询,嵌套的级数随各数据库厂商的设定而有所不同,一般最大嵌套数不超过15级,实际应用中,一般不要超过2级,否则代码难以理解.

一般来说,所有嵌套子查询都可改写为非嵌套的查询,但是这样将导致代码量增大.子查询就如递归函数一样,有时侯使用起来能达到事半功倍之效,只是其执行效率同样较低,有时用自身连接可代替某些子查询,另外,某些相关子查询也可改写成非相关子查询

表连接都可以用子查询,但不是所有子查询都能用表连接替换,子查询比较灵活,方便,形式多样,适合用于作为查询的筛选条件,而表连接更适合与查看多表的数据

注意: 子查询不一定需要两个表有关联字段,而连接查询必须有字段关联(所谓的主外键关系)

最后:小编温馨提示:大家用完测试的表后记得

  • drop table demo1

  • drop table demo2

  • drop table demo3

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多