您好,欢迎来到榕意旅游网。
搜索
您的当前位置:首页SQL数据库多表连接详细讲解

SQL数据库多表连接详细讲解

来源:榕意旅游网
SQL多表连接

应用背景 数据库是由多张表组成的存储结构,并通过多张表之间的关系建立起完整的有效的数据存储形式,形成关系型数据库。作为数据查询语言SQL,提供了功能强大的数据表连接查询功能,使多张表格之间形成有效的数据联系,使得关系数据库在大型数据库应用中占据了主角地位。

一个普通的大型数据库应用程序所使用的数据库中,有多达几百张表的数据,那么如何将这些表高效的有机的联系起来,就成为设计关系数据库的一个重要指标。优良的数据库设计指标包括:

1.减少数据冗余,去除掉多余的数据冗余,可以通过建立表之间的连接关系完成。

2.数据更新正确,不能因为表之间存在关系后,使得更新记录出现不正常的数据。

3.添加数据正常,添加数据过程中,应该保持数据表之间的关系,确定表之间的连接。

4.查询简便灵活,在建立数据连接的查询过程中,连接清晰简便,操作灵活准确。

数据库设计是应用软件成功与否的一项重要标志。设计数据库,除与系统分析结果,设计员的水平等有关外,还可以参考一些规范的设计范式,下面简单介绍数据库的2个基本设计范式:

1.第一范式:要求表的每列都是不可再分的简单数据项,所以1对N关系就必须用多表表示,而不能用一张表表示。

2.第二范式:表中的每一个非主键列必须完全函数依赖于主键,就是说表中除主键之外的其他列,都必须通过主键能够唯一确定。

数据库的设计非常复杂,没有一成不变的东西,需要就地取材,解决问题,简单化问题。

知识要点 (1) 传统连接

连接就是将多个表中的数据连接到一起的查询,即连接操作可以在一个Select语句中完成从多个表中查找和处理数据,使用连接时可以使用名字相同的不同表的列,也可以不同,但要求连接的列不需可连接,即数据类型相同。

传统的连接语法如下:

Select * from Tblname1 T1,Tblname2 T2 where T1.column=T2.column

连接SQL语句的明显标志为在From子句后边,有多个表Tblname1, Tblname2 ,Where子句后有表连接键T1.column=T2.column。

例1:以销售单据为例,察看每个销售单据的真实客户姓名,单据号,单据金额,销售代表等信息。Select 语句如下:

SELECT T1.rid, T1.cid, T2.cname, T1.rmoney, T1.remployee

FROM retail T1 , customer T2 where T1.cid = T2.cid

查询结果如下: rid 1 cid kh01 cname 张经理 rmoney 1200 remployee liuhong 2 3 4 5 kh02 kh01 kh01 kh02 李经理 张经理 张经理 李经理 1600 1600 3200 1800 liuhong liuhong zhangling zhangling 例2:以销售明细为例,查询每个销售明细记录的真实产品名称,产品的零售单价,实际销售单价,销售金额等等信息,Select语句如下:

SELECT T1.rid, T1.pcode, T2.pname, T2.ptype, T2.pprice, T1.dprice,T1.dmoney

FROM Detail T1 ,product T2 where T1.pcode = T2.pcode

查询结果如下: rid pcode 1 1 1 2 2 3 3 3 001 002 003 002 003 001 002 003 pname motorola sony nokia sony nokia motorola sony nokia ptype V30 C30 sony6110 C30 sony6110 V30 C30 sony6110 pprice 2800 3200 4500 3200 4500 2800 3200 4500 dprice 1200 2400 1500 2200 1500 1200 2300 1500 dmoney 2400 4800 1500 4400 3000 2400 4600 3000 例3:多表连接,建立查询销售单据与销售明细连接,销售明细中的产品代码与产品信息中的代码连接,销售单据的客户代码与客户信息的客户代码连接,构成4张表的多表连接,Select 语句如下:

select T1.rid,T1.cid,T3.cname,T2.pcode,T4.pname,T2.dprice, T2.dnumber,T2.dmoney

from retail T1,detail T2,customer T3,product T4

where T1.rid=T2.rid and T1.cid=T3.cid and T2.pcode=T4.pcode

查询结果如下: rid cid 1 1 1 2 2 3 3 3

前面的多表连接写法,把表连接条件写在Where子句之后,导致表连接之间与记录筛选条件混合,使查询语句不清晰,故新的表连接条件采用关键字Join表示,连接又分为内连接,左连接,右连接,全连接。

cname pcode pname motorola sony nokia sony nokia motorola sony nokia dprice 1200 2400 1500 2200 1500 1200 2300 1500 dnumber 2 2 1 2 2 2 2 2 dmoney 2400 4800 1500 4400 3000 2400 4600 3000 kh01 张经理 001 kh01 张经理 002 kh01 张经理 003 kh02 李经理 002 kh02 李经理 003 kh01 张经理 001 kh01 张经理 002 kh01 张经理 003 (2) 内连接Inner Join

标准内连接写法为:

Select [Distinct] select_list from Tblname1 [T1] Inner join Tblname2 T2 On T1.colomn=T2.colomn [where condition] [Group By] [Order By ]

关键字Inner Join 前后为需要连接的表名,关键字On 后边是连接条件,在执行完连接条件后,才进行记录的筛选语句Where 子句,这样更符合结构化的查询语法。

例1:以销售单据为例,察看每个销售单据的真实客户姓名,单据号,单据金额,销售代表等信息,且要求客户姓名中包含“李”,那么修改后的Select 语句如下:

SELECT T1.rid, T1.cid, T2.cname, T1.rmoney, T1.remployee

FROM retail T1 INNER JOIN

customer T2 ON T1.cid = T2.cid

WHERE (T2.cname LIKE '%李%')

ORDER BY T1.rid

查询结果如下: rid 2 5 cid kh02 kh02 cname 李经理 李经理 rmoney 1600 1800 remployee liuhong zhangling 例2:多表连接,建立查询销售单据与销售明细连接,销售明细中的产品代码与产品信息中的代码连接,销售单据的客户代码与客户信息的客户代码连接,构成4张表的多表连接,要求客户名称包含“张”,产品名称包含“Nokia”,Select 语句如下:

SELECT T1.rid, T1.cid, T3.cname, T2.pcode, T4.pname, T2.dprice, T2.dnumber,

T2.dmoney

FROM retail T1 INNER JOIN

detail T2 ON T1.rid = T2.rid INNER JOIN

customer T3 ON T1.cid = T3.cid INNER JOIN

product T4 ON T2.pcode = T4.pcode

WHERE (T4.pname LIKE '%nokia%') AND (T3.cname LIKE '%张%')

查询结果如下: rid cid 1 3

内连接一般把所有符合条件的记录都显示出来,而不符合连接条件的记录过滤掉。但有时候可能期望显示某个表中的所有记录,包括不符合条件的记录,那么

cname pcode 003 003 pname nokia nokia dprice 1500 1500 dnumber 1 2 dmoney 1500 3000 kh01 张经理 kh01 张经理 (3) 左连接

就需要使用外连接。使用外连接可以方便地将连接结果中包含某个表中的所有记录。外连接,包括左连接,右连接,全连接。

左连接Left Outer Join 关键字左侧的表包含所有记录,右侧的表则只包含部分符合连接条件的记录。语法如下:

Select [Distinct] select_list from Tblname1 [T1] Left Outer join Tblname2 T2 On T1.colomn=T2.colomn [where condition] [Group By] [Order By ]

左连接语句将列出所有Tblname1中的所有记录,而Tblname2的记录则只显示符合连接条件的记录。

例1:列出所有客户信息,并把相关客户的销售单据信息列出。Select语句如下:

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- nryq.cn 版权所有 赣ICP备2024042798号-6

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务