最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

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

IT圈 admin 31浏览 0评论

2024年2月19日发(作者:乐正锐达)

SQL多表连接

应用背景

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

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

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

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

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

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

数据库设计是应用软件成功与否的一项重要标志。设计数据库,除与MS SQL 2000程序员培训教程

系统分析结果,设计员的水平等有关外,还可以参考一些规范的设计范式,下面简单介绍数据库的2个基本设计范式:

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

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

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

知识要点

(1) 传统连接

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

传统的连接语法如下:

Select * from Tblname1 T1,Tblname2 T2 where

=

连接SQL语句的明显标志为在From子句后边,有多个表Tblname1,

Tblname2 ,Where子句后有表连接键=。

MS SQL 2000程序员培训教程

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

SELECT , , , , yee

FROM retail T1 , customer T2 where =

查询结果如下:

rid

1

2

3

4

5

cid

kh01

kh02

kh01

kh01

kh02

cname rmoney remployee

liuhong

liuhong

liuhong

zhangling

zhangling

张经理 1200

李经理 1600

张经理 1600

张经理 3200

李经理 1800

例2:以销售明细为例,查询每个销售明细记录的真实产品名称,产品的零售单价,实际销售单价,销售金额等等信息,Select语句如下:

SELECT , , , , ,

,

FROM Detail T1 ,product T2 where =

查询结果如下:

rid pcode pname ptype pprice dprice dmoney

MS SQL 2000程序员培训教程

1

1

1

2

2

3

3

3

001 motorola V30

002 sony

003 nokia

002 sony

003 nokia

C30

2800

3200

1200

2400

1500

2200

1500

1200

2300

1500

2400

4800

1500

4400

3000

2400

4600

3000

sony6110 4500

C30 3200

sony6110 4500

2800

3200

001 motorola V30

002 sony

003 nokia

C30

sony6110 4500

例3:多表连接,建立查询销售单据与销售明细连接,销售明细中的产品代码与产品信息中的代码连接,销售单据的客户代码与客户信息的客户代码连接,构成4张表的多表连接,Select 语句如下:

select ,,,,,,

r,

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

where = and = and =

查询结果如下:

rid cid

1

cname pcode pname dprice dnumber dmoney

2 2400 kh01 张经理 001 motorola 1200

MS SQL 2000程序员培训教程

1

1

2

2

3

3

3

kh01 张经理 002 sony

kh01 张经理 003 nokia

kh02 李经理 002 sony

kh02 李经理 003 nokia

2400

1500

2200

1500

2

1

2

2

2

2

2

4800

1500

4400

3000

2400

4600

3000

kh01 张经理 001 motorola 1200

kh01 张经理 002 sony

kh01 张经理 003 nokia

2300

1500

(2) 内连接Inner Join

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

标准内连接写法为:

Select [Distinct] select_list from Tblname1 [T1] Inner join

Tblname2 T2 On = [where condition] [Group By]

[Order By ]

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

MS SQL 2000程序员培训教程

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

SELECT , , , , yee

FROM retail T1 INNER JOIN

customer T2 ON =

WHERE ( LIKE '%李%')

ORDER BY

查询结果如下:

rid

2

5

cid

kh02

kh02

cname rmoney remployee

liuhong

zhangling

李经理 1600

李经理 1800

例2:多表连接,建立查询销售单据与销售明细连接,销售明细中的产品代码与产品信息中的代码连接,销售单据的客户代码与客户信息的客户代码连接,构成4张表的多表连接,要求客户名称包含“张”,产品名称包含“Nokia”,Select 语句如下:

SELECT , , , , , ,

r,

MS SQL 2000程序员培训教程

FROM retail T1 INNER JOIN

detail T2 ON = INNER JOIN

customer T3 ON = INNER JOIN

product T4 ON =

WHERE ( LIKE '%nokia%') AND ( LIKE '%张%')

查询结果如下:

rid

1

3

(3) 左连接

内连接一般把所有符合条件的记录都显示出来,而不符合连接条件的记录过滤掉。但有时候可能期望显示某个表中的所有记录,包括不符合条件的记录,那么就需要使用外连接。使用外连接可以方便地将连接结果中包含某个表中的所有记录。外连接,包括左连接,右连接,全连接。

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

Select [Distinct] select_list from Tblname1 [T1] Left Outer join

MS SQL 2000程序员培训教程

cid cname pcode pname dprice dnumber dmoney

1500

1500

1

2

1500

3000

kh01 张经理 003 nokia

kh01 张经理 003 nokia

Tblname2 T2 On = [where condition] [Group By]

[Order By ]

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

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

SELECT , , AS Expr1, AS

Expr2

FROM customer T1 LEFT OUTER JOIN

retail T2 ON =

查询结果如下:

cid

kh01

kh01

kh01

kh02

kh02

kh03

cname Expr1 Expr2

1200

1600

3200

1600

1800

张经理 2006-9-1

张经理 2006-9-3

张经理 2006-9-3

李经理 2006-9-2

李经理 2006-9-4

老刘

MS SQL 2000程序员培训教程

liubang

mingren

刘工

韩先生

例2:列出所有产品信息,并将相关产品信息的销售数量合计,销售金额合计列出,Select语句如下:

SELECT , SUM(r) AS Expr1,

SUM() AS Expr2

FROM product T1 LEFT OUTER JOIN

detail T2 ON =

GROUP BY

上述Select语句没有列出产品名称,是因为在分组列表中没有列出产品名称,查询结果如下:

pcode

001

002

003

004

005

006

MS SQL 2000程序员培训教程

Expr1

4

6

5

Expr2

4800

13800

7500

(4) 右连接

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

Select [Distinct] select_list from Tblname1 [T1] Right Outer join

Tblname2 T2 On = [where condition] [Group By]

[Order By ]

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

例1:列出所有销售单据,并将每个单据的客户名称列出,Select语句如下:

SELECT T2.*, AS Expr1

FROM customer T1 RIGHT OUTER JOIN

retail T2 ON =

查询结果如下:

rid

1

cid cdate remployee rrate rprice rmoney Expr1

1200 1200 张经理

2 kh02 2006-9-2 liuhong 80 2000 1600 李经kh01 2006-9-1 liuhong 90

MS SQL 2000程序员培训教程

10

2024年2月19日发(作者:乐正锐达)

SQL多表连接

应用背景

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

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

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

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

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

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

数据库设计是应用软件成功与否的一项重要标志。设计数据库,除与MS SQL 2000程序员培训教程

系统分析结果,设计员的水平等有关外,还可以参考一些规范的设计范式,下面简单介绍数据库的2个基本设计范式:

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

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

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

知识要点

(1) 传统连接

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

传统的连接语法如下:

Select * from Tblname1 T1,Tblname2 T2 where

=

连接SQL语句的明显标志为在From子句后边,有多个表Tblname1,

Tblname2 ,Where子句后有表连接键=。

MS SQL 2000程序员培训教程

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

SELECT , , , , yee

FROM retail T1 , customer T2 where =

查询结果如下:

rid

1

2

3

4

5

cid

kh01

kh02

kh01

kh01

kh02

cname rmoney remployee

liuhong

liuhong

liuhong

zhangling

zhangling

张经理 1200

李经理 1600

张经理 1600

张经理 3200

李经理 1800

例2:以销售明细为例,查询每个销售明细记录的真实产品名称,产品的零售单价,实际销售单价,销售金额等等信息,Select语句如下:

SELECT , , , , ,

,

FROM Detail T1 ,product T2 where =

查询结果如下:

rid pcode pname ptype pprice dprice dmoney

MS SQL 2000程序员培训教程

1

1

1

2

2

3

3

3

001 motorola V30

002 sony

003 nokia

002 sony

003 nokia

C30

2800

3200

1200

2400

1500

2200

1500

1200

2300

1500

2400

4800

1500

4400

3000

2400

4600

3000

sony6110 4500

C30 3200

sony6110 4500

2800

3200

001 motorola V30

002 sony

003 nokia

C30

sony6110 4500

例3:多表连接,建立查询销售单据与销售明细连接,销售明细中的产品代码与产品信息中的代码连接,销售单据的客户代码与客户信息的客户代码连接,构成4张表的多表连接,Select 语句如下:

select ,,,,,,

r,

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

where = and = and =

查询结果如下:

rid cid

1

cname pcode pname dprice dnumber dmoney

2 2400 kh01 张经理 001 motorola 1200

MS SQL 2000程序员培训教程

1

1

2

2

3

3

3

kh01 张经理 002 sony

kh01 张经理 003 nokia

kh02 李经理 002 sony

kh02 李经理 003 nokia

2400

1500

2200

1500

2

1

2

2

2

2

2

4800

1500

4400

3000

2400

4600

3000

kh01 张经理 001 motorola 1200

kh01 张经理 002 sony

kh01 张经理 003 nokia

2300

1500

(2) 内连接Inner Join

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

标准内连接写法为:

Select [Distinct] select_list from Tblname1 [T1] Inner join

Tblname2 T2 On = [where condition] [Group By]

[Order By ]

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

MS SQL 2000程序员培训教程

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

SELECT , , , , yee

FROM retail T1 INNER JOIN

customer T2 ON =

WHERE ( LIKE '%李%')

ORDER BY

查询结果如下:

rid

2

5

cid

kh02

kh02

cname rmoney remployee

liuhong

zhangling

李经理 1600

李经理 1800

例2:多表连接,建立查询销售单据与销售明细连接,销售明细中的产品代码与产品信息中的代码连接,销售单据的客户代码与客户信息的客户代码连接,构成4张表的多表连接,要求客户名称包含“张”,产品名称包含“Nokia”,Select 语句如下:

SELECT , , , , , ,

r,

MS SQL 2000程序员培训教程

FROM retail T1 INNER JOIN

detail T2 ON = INNER JOIN

customer T3 ON = INNER JOIN

product T4 ON =

WHERE ( LIKE '%nokia%') AND ( LIKE '%张%')

查询结果如下:

rid

1

3

(3) 左连接

内连接一般把所有符合条件的记录都显示出来,而不符合连接条件的记录过滤掉。但有时候可能期望显示某个表中的所有记录,包括不符合条件的记录,那么就需要使用外连接。使用外连接可以方便地将连接结果中包含某个表中的所有记录。外连接,包括左连接,右连接,全连接。

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

Select [Distinct] select_list from Tblname1 [T1] Left Outer join

MS SQL 2000程序员培训教程

cid cname pcode pname dprice dnumber dmoney

1500

1500

1

2

1500

3000

kh01 张经理 003 nokia

kh01 张经理 003 nokia

Tblname2 T2 On = [where condition] [Group By]

[Order By ]

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

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

SELECT , , AS Expr1, AS

Expr2

FROM customer T1 LEFT OUTER JOIN

retail T2 ON =

查询结果如下:

cid

kh01

kh01

kh01

kh02

kh02

kh03

cname Expr1 Expr2

1200

1600

3200

1600

1800

张经理 2006-9-1

张经理 2006-9-3

张经理 2006-9-3

李经理 2006-9-2

李经理 2006-9-4

老刘

MS SQL 2000程序员培训教程

liubang

mingren

刘工

韩先生

例2:列出所有产品信息,并将相关产品信息的销售数量合计,销售金额合计列出,Select语句如下:

SELECT , SUM(r) AS Expr1,

SUM() AS Expr2

FROM product T1 LEFT OUTER JOIN

detail T2 ON =

GROUP BY

上述Select语句没有列出产品名称,是因为在分组列表中没有列出产品名称,查询结果如下:

pcode

001

002

003

004

005

006

MS SQL 2000程序员培训教程

Expr1

4

6

5

Expr2

4800

13800

7500

(4) 右连接

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

Select [Distinct] select_list from Tblname1 [T1] Right Outer join

Tblname2 T2 On = [where condition] [Group By]

[Order By ]

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

例1:列出所有销售单据,并将每个单据的客户名称列出,Select语句如下:

SELECT T2.*, AS Expr1

FROM customer T1 RIGHT OUTER JOIN

retail T2 ON =

查询结果如下:

rid

1

cid cdate remployee rrate rprice rmoney Expr1

1200 1200 张经理

2 kh02 2006-9-2 liuhong 80 2000 1600 李经kh01 2006-9-1 liuhong 90

MS SQL 2000程序员培训教程

10

发布评论

评论列表 (0)

  1. 暂无评论