SqlServer跨域联查

2023-02-20 00:00:00 数据 语句 服务器 专业 学院

跨域,即跨区域,区域可是是数据表、可以是数据库、也可以是数据库服务器。

在数据库查询操作中,常常会遇到想要查询的数据不在同一张表(库、服务器)中,此时就需要进行跨域联查。

本文包含且仅包含跨表联查、跨库联查与跨服务器联查。


一、跨表联查(多表联查)

学院表 college


学院表包含学院代码、学院名称。

专业表 major


专业表包含专业代码、专业名称、所属学院代码。

如果我们想知道[001]挖掘机学院包含哪些专业,只需要去专业表中查询所属学院代码为001的数据,语句如下:

select * from major where college_code='001';

查询结果如下:

查询结果中只有专业信息,没有学院名称信息,如果需要查询[001]挖掘机学院与[002]烹饪学院分别有哪些专业,语句如下:

select * from major where college_code in('001', '002');

结果如下:

我们仅能从college_code上去区分两个学院的专业,不直观,而且容易混淆。

此时就需要用到多表联查,多表联查的作用就是可以将不同表中的数据汇总后,在同一张结果表中展示。

多表联查分为内联接inner join、外联接 out join、全联接 full join,其中外联接out join又分为left join左联接与right join右联接,大同小异。

开始介绍联接查询的语法之前,我们先来分析一下两张表的关联,如下图:

不难看出,学院表与专业表是一对多的关系,即一个学院对应多个专业,两张表通过college_code字段关联。

从left join入手,left join是常用的联查语句,语法如下:

select * from A left join B on A.field1=B.field2;

联查表A与表B,并指定关联关系为A的field1与B的field2相等。

left join与on必须连用。

left join左侧的表为主表,即上图一对多关系中的“一”,left join右侧的表为副表,即一对多关系中的“多”。

on后面需要指定两张表的关联关系。

联查学院表与专业表的语句如下:

select * from college left join major on college.college_code=major.college_code;

结果如下:

上图中可以发现,查询结果既包含了学院信息,也包含了专业信息,并且在一对多关系中,学院信息为了迁就多个专业信息,会重复多行显示,如[001]挖掘机学院包含四个专业,上图中挖掘机专业就显示了四行。

此时的学院下面均包含对应专业,接下来我们新增一个学院:

insert into college values('006','外国语学院');

再次执行联查语句,结果如下:

可见[006]外国语学院对应的专业信息全为NULL,因为我们还没有给外国语学院添加专业,这次查询体现出了left join的特性:显示左表(主表)的全部数据,以及右表(副表)经过匹配的数据。如果右表中没有能与左表匹配的数据,如没有专业属于外国语学院,则显示为空。

right join的特性恰好相反,为:显示右表(主表)的全部数据,以及左表(副表)经过匹配的数据。right join的主表为右表。right join在此不做示例。

使用inner join进行查询,语句如下:

select * from college inner join major on college.college_code=major.college_code;

结果如下:

inner join的查询结果中没有包含[006]外国语学院,可见,inner join的特性为:包含且仅包含两张表中能够匹配的数据,一条只要有一张表匹配不了,就都不显示。

此时我们再给major表添加一个专业,并且college表中没有学院与之对应。

insert into major values('007001','护理专业','','007',1);

添加完成后,使用full join语句联查:

select * from college full join major on college.college_code=major.college_code;

结果如下:

除了两张表完全匹配的数据外,[006]外国语学院与[007001]护理专业也都显示在结果中了,可见full join的特性为:显示两张表的所有数据,如果其中一张表的数据根据联接条件,在另一张表中没有对应的数据,则另一张表的信息显示为空。

以上,跨表联查(多表联查)。


二、跨库联查

有了跨表联查的基础,跨库联查相对简单,假设college表与major表分别属于同一台数据库服务器的数据库A、数据库B,连接查询语句如下:

select * from A.dbo.college left join B.dbo.major on  A.dbo.college.college_code=B.dbo.major.college_code;

在跨库查询中,技术人员应该把眼光放在整台数据库服务器的角度,而不是局限于某一个库或某一张表,所以语句中凡涉及到数据表,均要指定库名,如A或B,dbo是SqlServer中每个数据库的默认用户,具有所有者权限,即DbOwner,A.dbo.college即代表数据库A中的dbo用户的college表。


以上,跨库联查。


三、跨服务器联查

跨服务器联查原理为:同一网络中,在一台数据库服务器上建立另一台数据库服务器的LINK,即链接服务器,即可通过LINK访问或联查另一台服务器的数据。

核心脚本如下(完整脚本已经分享在QQ群中):

以当前服务器为主服务器,执行建立LINK的脚本代码,即可建立链接服务器。

有了链接服务器,就可以对不同服务器上的数据进行查询,假设college位于主服务器上的A库中,major位于副服务器的B库中,已建立链接服务器A_LINK_B,联查语句如下:

select * from A.dbo.college left join A_LINK_B.B.dbo.major on A.dbo.college.college_code=A_LINK_B.B.dbo.major.college_code;

链接服务器建立后,可以在主服务器数据库中看到,如下图:

以上,跨服务器联查。



本文来源https://www.modb.pro/db/442554


相关文章