SQL多表连接
应用背景
数据库是由多张表组成的存储结构,并通过多张表之间的关系建立起完整的有效的数据存储形式,形成关系型数据库。作为数据查询语言SQL,提供了功能强大的数据表连接查询功能,使多张表格之间形成有效的数据联系,使得关系数据库在大型数据库应用中占据了主角地位。
一个普通的大型数据库应用程序所使用的数据库中,有多达几百张表的数据,那么如何将这些表高效的有机的联系起来,就成为设计关系数据库的一个重要指标。优良的数据库设计指标包括:
1.减少数据冗余,去除掉多余的数据冗余,可以通过建立表之间的连接关系完成。
2.数据更新正确,不能因为表之间存在关系后,使得更新记录出现不正常的数据。
3.添加数据正常,添加数据过程中,应该保持数据表之间的关系,确定表之间的连接。
4.查询简便灵活,在建立数据连接的查询过程中,连接清晰简便,操作灵活准确。
数据库设计是应用软件成功与否的一项重要标志。设计数据库,除与系统分析结果,设计员的水平等有关外,还可以参考一些规范的设计范式,下面简单介绍数据库的2个基本设计范式:
1.第一范式:要求表的每列都是不可再分的简单数据项,所以1对N关系就必须用多表表示,而不能用一张表表示。
2.第二范式:表中的每一个非主键列必须完全函数依赖于主键,就是说表中除主键之外的其他列,都必须通过主键能够唯一确定。
数据库的设计非常复杂,没有一成不变的东西,需要就地取材,解决问题,简单化问题。
知识要点
(1) 传统连接
连接就是将多个表中的数据连接到一起的查询,即连接操作可以在一个Select语句中完成
从多个表中查和处理数据,使用连接时可以使用名字相同的不同表的列,也可以不同,但要求连接的列不需可连接,即数据类型相同。
传统的连接语法如下:
Select * from Tblname1 T1,Tblname2 T2 lumn
连接SQL语句的明显标志为在From子句后边,有多个表Tblname1, Tblname2 ,Where子句后有表连接键T1.lumn。
例1:以销售单据为例,察看每个销售单据的真实客户姓名,单据号,单据金额,销售代表等信息。Select 语句如下:
SELECT T1.rid, T1.cid, T2ame, T1.rmoney, T1.remployee
FROM retail T1 , customer T2 where T1.cid = T2.cid
查询结果如下:
rid | cid | cname | rmoney | remployee |
1 | kh01 | 张经理 | 1200 | liuhong |
2 | kh02 | 李经理 | 1600 | liuhong |
3 | kh01 | 张经理 | 1600 | liuhong |
4 | kh01 | 张经理 | 3200 | zhangling |
5 | kh02 | 李经理 | 1800 | 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 | pname | ptype | pprice | dprice | dmoney |
1 | 001 | motorola | V30 | 2800 | 1200 | 2400 |
1 | 002 | sony | C30 | 3200 | 2400 | 4800 |
1 | 003 | nokia | sony6110 | 4500 | 1500 | 1500 |
2 | 002 | sony | C30 | 3200 | 2200 | 4400 |
2 | 003 | nokia | sony6110 | 4500 | 1500 | 3000 |
3 | 001 | motorola | V30 | 2800 | 1200 | 2400 |
3 | 002 | sony | C30 | 3200 | 2300 | 4600 |
3 | 003 | nokia | sony6110 | 4500 | 1500 | 3000 |
例3:多表连接,建立查询销售单据与销售明细连接,销售明细中的产品代码与产品信息中的代码连接,销售单据的客户代码与客户信息的客户代码连接,构成4张表的多表连接,Select 语句如下:
select T1.rid,T1.cid,T3ame,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 | cname | pcode | pname | dprice | dnumber | dmoney |
1 | kh01 | 张经理 | 001 | motorola | 1200 | 2 | 2400 |
1 | kh01 | 张经理 | 002 | sony | 2400 | 2 | 4800 |
1 | kh01 | 张经理 | 003 | nokia | 1500 | 1 | 1500 |
2 | kh02 | 李经理 | 002 | sony | 2200 | 2 | 4400 |
2 | kh02 | 李经理 | 003 | nokia | 1500 | 2 | 3000 |
3 | kh01 | 张经理 | 001 | motorola | 1200 | 2 | 2400 |
3 | kh01 | 张经理 | 002 | sony | 2300 | 2 | 4600 |
3 | kh01 | 张经理 | 003 | nokia | 1500 | 2 | 3000 |
(2) 内连接Inner Join
前面的多表连接写法,把表连接条件写在Where子句之后,导致表连接之间与记录筛选条件混合,使查询语句不清晰,故新的表连接条件采用关键字Join表示,连接又分为内连接,左连接,右连接,全连接。
标准内连接写法为:
Select [Distinct] select_list from Tblname1 [T1] Inner join Tblname2 T2 lomn [where condition] [Group By] [Order By ]
关键字Inner Join 前后为需要连接的表名,关键字On 后边是连接条件,在执行完连接条件后,才进行记录的筛选语句Where 子句,这样更符合结构化的查询语法。
例1:以销售单据为例,察看每个销售单据的真实客户姓名,单据号,单据金额,销售代表等信息,且要求客户姓名中包含“李”,那么修改后的Select 语句如下:
SELECT T1.rid, T1.cid, T2ame, T1.rmoney, T1.remployee
FROM retail T1 INNER JOIN
customer T2 ON T1.cid = T2.cid
WHERE (T2ame LIKE '%李%')
ORDER BY T1.rid
查询结果如下:
rid | cid | cname | rmoney | remployee |
2 | kh02 | 李经理 | 1600 | liuhong |
5 | kh02 | 李经理 | 1800 | zhangling |
例2:多表连接,建立查询销售单据与销售明细连接,销售明细中的产品代码与产品信息中的代码连接,销售单据的客户代码与客户信息的客户代码连接,构成4张表的多表连接,要
求客户名称包含“张”,产品名称包含“Nokia”,Select 语句如下:
SELECT T1.rid, T1.cid, T3ame, 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 (T3ame LIKE '%张%')
查询结果如下:
rid | cid | cname | pcode | pname | dprice | dnumber | dmoneysql中union多表合并 |
1 | kh01 | 张经理 | 003 | nokia | 1500 | 1 | 1500 |
3 | kh01 | 张经理 | 003 | nokia | 1500 | 2 | 3000 |
(3) 左连接
内连接一般把所有符合条件的记录都显示出来,而不符合连接条件的记录过滤掉。但有时候可能期望显示某个表中的所有记录,包括不符合条件的记录,那么就需要使用外连接。使用外连接可以方便地将连接结果中包含某个表中的所有记录。外连接,包括左连接,右连接,全连接。
左连接Left Outer Join 关键字左侧的表包含所有记录,右侧的表则只包含部分符合连接条件的记录。语法如下:
Select [Distinct] select_list from Tblname1 [T1] Left Outer join Tblname2 T2 lomn [where condition] [Group By] [Order By ]
左连接语句将列出所有Tblname1中的所有记录,而Tblname2的记录则只显示符合连接条件的记录。
例1:列出所有客户信息,并把相关客户的销售单据信息列出。Select语句如下:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论