首页 > 代码库 > SQL学习之联结表的使用

SQL学习之联结表的使用

1、简介:"联结(join)表"是SQL最强大的功能之一。联结是利用SQL的SELECT能执行的最重要的操作,很好地理解联结及其语法是学习SQL的极为重要的部分!

在能够有效的使用联结前,必须了解关系表以及关系型数据库设计的一些基础知识。

2、关系表

下面通过一个列子来理解关系表。

有一个包含产品目录的数据库表,其中每类物品占一行。对于每一种物品,要存储的信息包括产品描述、价格以及生产该产品的供应商。关于供应商,现在一个供应商生产多个产品,那么在何处存储供应商名、地址、联系方式等供应商信息呢?这里正确的做法是将供应商的信息和产品信息分开存储到两个表中,而分开的理由是:

(1)同一供应商生产的每个产品,其供应商信息是相同的,对每个产品重复此信息既浪费时间又浪费存储空间;

(2)如果供应商信息发生变化,只需修改一次供应商信息即可,而不需要去每个产品的信息中修改;

(3)如果有重复数据(即每种产品都存储供应商信息),则很难保证每次输入该数据的方式(也就是说输错供应商信息)都相同。不一致的数据在报表中就很难利用到;

关键是,相同的数据出现多次绝对不是一件好事,这是关系型数据库设计的基础。关系表的设计就是要把信息分解成多个表,一类数据一个表。各表之间通过某些共同的值相互关联(所以才叫关系型数据库,大多数情况下采用主键关联);

综上所述,我们建立两个表:一个存储供应商信息(Vendors),另一个存储产品信息(Products),Products表通过存储Vendors的主键实现两个表之间的通信(关联)。

这样做的好处是:

(1)供应商的信息不会重复,不会浪费时间和存储空间,每个产品只需要存储一个供应商Id,就可以通过它知道所有关于供应商的信息(前提是供应商Id要是唯一的);

(2)如果供应商的信息发生变动,只需要更新Vendors(供应商)表,相关表的数据不用改动;

(3)由于数据不重复,数据显然是一致的,使得处理数据和生成报表更简单;

总之,关系型数据库可以有效的存储,方便的处理。因此,关系型数据库的可伸缩性远比非关系数据库的要好。

可伸缩性:能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序称为可伸缩性好。

 

3、像2中所说的将数据分解成多个表能有效的存储,更方便的处理,并且可伸缩性更好。但这些好处是有代价的。

    因为如果数据存储在多个表中,怎样用一条SELECT语句就检索出想要的数据呢?这个时候就需要使用到SQL的联结表技术了,简答的说,联结是一种机制,用来在一条SELECT语句中关联多个表,因此称为联结。使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行。

下面通过代码来理解联结的作用:

create database Studygouse Studygocreate table Products(Id int identity(1000,1),Name varchar(50) null,Price decimal(4,1) null,VendorId int null)insert into Products values(黑曼巴,666.6,100000)insert into Products values(淘宝网,100.6,100001)insert into Products values(人工智能汽车,366.6,100002)insert into Products values(英雄联盟,166.6,100005)insert into Products values(万达广场,66.6,100006)select * from Productscreate table Vendors(Id int identity(100000,1),Name varchar(20) null,Adress varchar(255) null,Tel varchar(11) null)insert into Vendors values(Nick,America California,1111111111)insert into Vendors values(Alibaba,Hangzhou China,2222222222)insert into Vendors values(BaiDu,BeiJing China,3333333333)insert into Vendors values(Tencent,ShenZheng China,44444444444)insert into Vendors values(WanDa,DaLian China,5555555555)select * from Vendors

这是关系库和关系表的SQL代码!

技术分享

这是两个表的数据图,现在有个报表程序需要所有产品的详细信息,包括产品的名称、价格、供应商名称、供应商的地址等;

简单的分析下问题,我们发现产品的名称、价格、可以从Products表中获取,但是供应商名称、供应商的地址却需要从Vendors表中获取!这个时候我们就需要使用SQL的"联结表技术"了,下面是解决代码:

select Vendors.Name,Vendors.Adress,Products.Name,Products.Price from Vendors,Products WHERE Vendors.Id=Products.VendorId

技术分享

ok,完成需求!

      下面分析下上面那段代码:首先SELECT语句和之前随笔中的SELECT语句都一样,即指定要检索的列,这里最大的差别是所指定的两列(Products.Name,Products.Price)在Products表中,而列外两列(Vendors.Name,Vendors.Adress)却在另一个表(Vendors)中,所以FROM语句和之前随笔中的不同,这里的FROM子句列出了两个表(Products表和Vendors表),最后再看WHERE子句,这里WHERE子句的作用是只是DBMS将Vendors表中的Id与Products表中的VendorId进行匹配,即Vendors表中每一行将于Products表中的每一行进行配对,配对条件是Vendors表的Id和Products表的VendorId是否相等,如果相等的话,再将两条记录进行合并(这是我个人的假想),通过SELECT语句返回对应的记录,如果不相等,则将对应的行记录过滤!

技术分享

SQL学习之联结表的使用