求sql server多库多表数据查询

求sql server多库多表数据查询,第1张

你可以建立链接服务器,链接到11个库。

可以使用t-sql编写脚本循环 找出每个库中你想要的表, 获取表中的数据

不同点是需要使用带数据链接的查询

select from [dblink名称]远程数据库名dbo表

查询结果直接创建一个新表存放

select into [新表名] FROM [原表名]WHERE 车辆='小汽车'

若新建表要放在另一个数据库B中

USE B

GO

SELECT INTO [新表名] FROM [数据库名][表名]

WHERE 车辆='小汽车'

GO

SQL Server 是Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点,可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows 2012 的大型多处理器的服务器等多种平台使用。

数据库实验总结一

试验内容

1、 数据表的建立

基本表《简单的》带有主键

带有外码约束的(外码来自其他表或者本表)

2、 数据表的修改

添加删除列

修改列属性类型

添加删除约束(约束名)

元组的添加,修改,删除

删除数据表

试验过程

1、create table student

(

sno char(9) primary key , /sno是主码 列级完整性约束条件/

sname char(20) unique, /sname取唯一值/

ssex char(2),

sage smallint, /类型为smallint/

sdept char(20) /所在系/

);

create table course

(

cno char(4) primary key, /列级完整性约束条件,cno是主码/

cname char(40),

cpno char(4), /cpno的含义是先行课/

ccredit smallint,

foreign key (cpno) references course(cno)

/表级完整性约束条件,cpno是外码,被参照表是course,被参照列是cno/

);

create table sc

(

sno char(9),

cno char(4),

grade smallint,

primary key (sno,cno),

/主码有两个属性构成,必须作为表级完整性进行定义/

foreign key (sno) references student(sno),

/表级完整性约束条件,sno是外码,被参照表是student/

foreign key (cno) references course(cno),

/表级完整性约束条件,cno是外码,被参照表示course/

);

例1、create table s

(

cno varchar(3), /变长的字符串,输入2个字符就是两个字符不会补空格/

sname varchar(20),

status int,

city varchar(20),

constraint pk_sno primary key(sno), /约束条件的名字为pk_sno/

);

create table p

(

pno varchar(3),

pname varchar(20),

color varchar(3),

weight int,

constraint pk_pno primary key (pno), /约束条件的名字是pk_pno/

);

create table j

(

jno varchar(3),

jname varchar(20),

city varchar(20),

constraint pk_jno primary key(jno) /约束条件的名字为pk_jno/

);

例2、create table spj

(

sno varchar(3), /第一个表中的主码/

pno varchar(3),

jno varchar(3),

qty int, /数量/

constraint pk_spj primary key(sno,pno,jno), /主码由3个属性组成/

foreign key(sno) references s(sno),

/表级完整性约束条件,sno是外码,被参照表是s/

foreign key(pno) references p(pno),

/表级完整性约束条件,pno是外码,被参照表是p/

foreign key(jno) references j(jno),

/表级完整性约束条件,jno是外码,被参照表是j/

);

2、数据表的更改

在s表中添加一个concat 列

alter table s add concat varchar(20)

在s表中删除concat 列

alter table s drop column concat

更改s表 concat列的属性 把长度由20改为30

alter table s alter column concat varchar(30)

**** 名字为concat 修改属性为唯一的 属性名为con_concat

alter table s add constraint con_concat unique(concat)

删除约束关系con_concat

alter table s drop constraint con_concat

/插入一个元组/

insert into s valus(‘s1’,’精益’,20,’天津’) /20不能写成’20’/

试验中的问题的排除与总结:

1、在创建spj时

有三个实体所以从3个实体中取主码,还有一个数量属性也要写上

主码由那3个主码确定

2、更改一个数据库中数据表时一定要先使该数据库处于正在使用状态

3、constraint

是可选关键字,表示 primary key、not null、unique、foreign key 或 check 约束定义的开始。约束是特殊属性,用于强制数据完整性并可以为表及其列创建索引

4、--go可以不加但是要注意顺序 注:go --注释 提示错误

5、注意添加一个空元素用 null

附 sql备份

--创建一个数据库 student

create database student

go

--在数据库student中创建表student course sc 注意顺序

use student

----------------------------------------------------------------

create table student

(

sno char(9) primary key, /sno是主码 列级完整性约束条件/

sname char(10) unique, /sname取唯一值/

ssex char(2),

sage smallint, /类型为smallint/

sdept char(20) /所在系/

); /;要加/

-----------

数据库实验总结二

我在sql server 索引基础知识系列中,第一篇就讲了记录数据的基本格式。那里主要讲解的是,数据库的最小读存单元:数据页。一个数据页是8k大小。

对于数据库来说,它不会每次有一个数据页变化后,就存到硬盘。而是变化达到一定数量级后才会作这个 *** 作。 这时候,数据库并不是以数据页来作为 *** 作单元,而是以64k的数据(8个数据页,一个区)作为 *** 作单元。

区是管理空间的基本单位。一个区是八个物理上连续的页(即 64 kb)。这意味着 sql server 数据库中每 mb 有 16 个区。

为了使空间分配更有效,sql server 不会将所有区分配给包含少量数据的表。sql server 有两种类型的区:

统一区,由单个对象所有。区中的所有 8 页只能由所属对象使用。

混合区,最多可由八个对象共享。区中八页的每页可由不同的对象所有。

通常从混合区向新表或索引分配页。当表或索引增长到 8 页时,将变成使用统一区进行后续分配。如果对现有表创建索引,并且该表包含的行足以在索引中生成 8 页,则对该索引的所有分配都使用统一区进行。

为何会这样呢

其实很简单:

读或写 8kb 的时间与读或写 64 kb的时间几乎相同。

在 8 kb 到 64 kb 范围之内,单个磁盘 i/o 传输 *** 作所花的时间主要是磁盘取数臂和读/写磁头运动的时间。

因此,从数学上来讲,当需要传输 64 kb 以上的 sql 数据时,

尽可能地执行 64 kb 磁盘传输是有益的,即分成数个64k的 *** 作。

因为 64 kb 传输基本上与 8 kb 传输一样快,而每次传输的 sql server 数据是 8 kb 传输的 8 倍。

我们通过一个实例来看 有and *** 作符时候的最常见的一种情况。我们有下面一个表,

create table [dbo][member]( [member_no] [dbo][numeric_id] identity(1,1) not null, [lastname] [dbo][shortstring] not null, [firstname] [dbo][shortstring] not null, [middleinitial] [dbo][letter] null, [street] [dbo][shortstring] not null, [city] [dbo][shortstring] not null, [state_prov] [dbo][statecode] not null, [country] [dbo][countrycode] not null, [mail_code] [dbo][mailcode] not null, [phone_no] [dbo][phonenumber] null, [photograph] [image] null, [issue_dt] [datetime] not null default (getdate()), [expr_dt] [datetime] not null default (dateadd(year,1,getdate())), [region_no] [dbo][numeric_id] not null, [corp_no] [dbo][numeric_id] null, [prev_balance] [money] null default (0), [curr_balance] [money] null default (0), [member_code] [dbo][status_code] not null default (' '))

这个表具备下面的四个索引:

索引名 细节 索引的列

member_corporation_link nonclustered located on primary corp_no

member_ident clustered, unique, primary key located on primary member_no

member_region_link nonclustered located on primary region_no

memberfirstname nonclustered located on primary firstname

当我们执行下面的sql查询时候,

select mmember_no, mfirstname, mregion_nofrom dbomember as mwhere mfirstname like 'k%' and mregion_no > 6 and mmember_no < 5000go

sql server 会根据索引方式,优化成下面方式来执行。

select amember_no,afirstname,bregion_nofrom(select mmember_no, mfirstname from dbomember as m where mfirstname like 'k%' and mmember_no < 5000) a , -- 这个查询可以直接使用 memberfirstname 非聚集索引,而且这个非聚集索引覆盖了所有查询列-- 实际执行时,只需要 逻辑读取 3 次

(select mmember_no, mregion_no from dbomember as mwhere mregion_no > 6) b

-- 这个查询可以直接使用 member_region_link 非聚集索引,而且这个非聚集索引覆盖了所有查询列-- 实际执行时,只需要 逻辑读取 10 次

where amember_no = bmember_no

不信,你可以看这两个sql 的执行计划,以及逻辑读信息,都是一样的。

其实上面的sql,如果优化成下面的方式,实际的逻辑读消耗也是一样的。为何sql server 不会优化成下面的方式。是因为 and *** 作符优化的另外一个原则。

1/26 的数据和 1/6 的数据找交集的速度要比 1/52 的数据和 1/3 的数据找交集速度要慢。

select amember_no,afirstname,bregion_nofrom(select mmember_no, mfirstname from dbomember as mwhere mfirstname like 'k%' -- 1/26 数据) a,

(select mmember_no, mregion_no from dbomember as mwhere mregion_no > 6 and mmember_no < 5000-- 1/3 1/ 2 数据) bwhere amember_no = bmember_no

当然,我们要学习sql 如何优化的话,就会用到查询语句中的一个功能,指定查询使用哪个索引来进行。

比如下面的查询语句

select mmember_no, mfirstname, mregion_nofrom dbomember as m with (index (0))where mfirstname like 'k%' and mregion_no > 6 and mmember_no < 5000go

select mmember_no, mfirstname, mregion_nofrom dbomember as m with (index (1))where mfirstname like 'k%' and mregion_no > 6 and mmember_no < 5000goselect mmember_no, mfirstname, mregion_nofrom dbomember as m with (index (membercovering3))where mfirstname like 'k%' and mregion_no > 6 and mmember_no < 5000goselect mmember_no, mfirstname, mregion_nofrom dbomember as m with (index (memberfirstname, member_region_link))where mfirstname like 'k%' and mregion_no > 6 and mmember_no < 5000go

这里 index 计算符可以是 0 ,1, 指定的一个或者多个索引名字。对于 0 ,1 的意义如下:

如果存在聚集索引,则 index(0) 强制执行聚集索引扫描,index(1) 强制执行聚集索引扫描或查找(使用性能最高的一种)。

如果不存在聚集索引,则 index(0) 强制执行表扫描,index(1) 被解释为错误。

总结知识点:

简单来说,我们可以这么理解:sql server 对于每一条查询语句。会根据实际索引情况(sysindexes 系统表中存储这些信息),分析每种组合可能的成本。然后选择它认为成本最小的一种。作为它实际执行的计划。

成本代价计算的一个主要组成部分是逻辑i/o的数量,特别是对于单表的查询。

and *** 作要满足所有条件,这样,经常会要求对几个数据集作交集。数据集越小,数据集的交集计算越节省成本。

的项目中,竟然出现了滥用聚集索引的问题。看来没有培训最最基础的索引的意义,代价,使用场景,是一个非常大的失误。这篇博客就是从这个角度来罗列索引的基础知识。

使用索引的意义

索引在数据库中的作用类似于目录在书籍中的作用,用来提高查找信息的速度。

使用索引查找数据,无需对整表进行扫描,可以快速找到所需数据。

使用索引的代价

索引需要占用数据表以外的物理存储空间。

创建索引和维护索引要花费一定的时间。

当对表进行更新 *** 作时,索引需要被重建,这样降低了数据的维护速度。

创建索引的列

主键

外键或在表联接 *** 作中经常用到的列

在经常查询的字段上最好建立索引

不创建索引的列

很少在查询中被引用

包含较少的惟一值

定义为 text、ntext 或者 image 数据类型的列

heaps是staging data的很好选择,当它没有任何index时

excellent for high performance data loading (parallel bulk load and parallel index creation after load)

excellent as a partition to a partitioned view or a partitioned table

聚集索引提高性能的方法,在前面几篇博客中分别提到过,下面只是一个简单的大纲,细节请参看前面几篇博客。

何时创建聚集索引

clustered index会提高大多数table的性能,尤其是当它满足以下条件时:

独特, 狭窄, 静止: 最重要的条件

持续增长的,最好是只向上增加。例如:

identity

date, identity

guid (only when using newsequentialid() function)

聚集索引唯一性(独特型的问题)

由于聚集索引的b+树结构的叶子节点必须指向具体数据。如果你要建立聚集索引的列不唯一,并且你指定的创建的聚集索引是非唯一的聚集索引,则会有以下情况:

如果未使用 unique 属性创建聚集索引,数据库引擎 将向表自动添加一个四字节 uniqueifier 列。必要时,数据库引擎 将向行自动添加一个 uniqueifier 值,使每个键唯一。此列和列值供内部使用,用户不能查看或访问。

1应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:\x0d\select id from t where num is null\x0d\可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:\x0d\select id from t where num=0\x0d\2应尽量避免在 where 子句中使用!=或 *** 作符,否则将引擎放弃使用索引而进行全表扫描。优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。\x0d\3应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:\x0d\select id from t where num=10 or num=20\x0d\可以这样查询:\x0d\select id from t where num=10\x0d\union all\x0d\select id from t where num=20\x0d\4in 和 not in 也要慎用,因为IN会使系统无法使用索引,而只能直接搜索表中的数据。如:\x0d\select id from t where num in(1,2,3)\x0d\对于连续的数值,能用 between 就不要用 in 了:\x0d\select id from t where num between 1 and 3\x0d\5尽量避免在索引过的字符数据中,使用非打头字母搜索。这也使得引擎无法利用索引。 \x0d\见如下例子: \x0d\SELECT FROM T1 WHERE NAME LIKE ‘%L%’ \x0d\SELECT FROM T1 WHERE SUBSTING(NAME,2,1)=’L’ \x0d\SELECT FROM T1 WHERE NAME LIKE ‘L%’ \x0d\即使NAME字段建有索引,前两个查询依然无法利用索引完成加快 *** 作,引擎不得不对全表所有数据逐条 *** 作来完成任务。而第三个查询能够使用索引来加快 *** 作。\x0d\6必要时强制查询优化器使用某个索引,如在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:\x0d\select id from t where num=@num\x0d\可以改为强制查询使用索引:\x0d\select id from t with(index(索引名)) where num=@num\x0d\7应尽量避免在 where 子句中对字段进行表达式 *** 作,这将导致引擎放弃使用索引而进行全表扫描。如:\x0d\SELECT FROM T1 WHERE F1/2=100 \x0d\应改为: \x0d\SELECT FROM T1 WHERE F1=1002\x0d\SELECT FROM RECORD WHERE SUBSTRING(CARD_NO,1,4)=’5378’ \x0d\应改为: \x0d\SELECT FROM RECORD WHERE CARD_NO LIKE ‘5378%’\x0d\SELECT member_number, first_name, last_name FROM members \x0d\WHERE DATEDIFF(yy,datofbirth,GETDATE()) > 21 \x0d\应改为: \x0d\SELECT member_number, first_name, last_name FROM members \x0d\WHERE dateofbirth ='2005-11-30' and createdate0) \x0d\SELECT SUM(T1C1) FROM T1WHERE EXISTS( \x0d\SELECT FROM T2 WHERE T2C2=T1C2) \x0d\两者产生相同的结果,但是后者的效率显然要高于前者。因为后者不会产生大量锁定的表扫描或是索引扫描。

连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于将连接 *** 作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。

SQL-92标准所定义的FROM子句的连接语法格式为:

FROM join_table join_type join_table

[ON (join_condition)]

其中join_table指出参与连接 *** 作的表名,连接可以对同一个表 *** 作,也可以对多表 *** 作,对同一个表 *** 作的连接又称做自连接。

join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。

内连接(INNER JOIN)使用比较运算符进行表间某(些)列数据的比较 *** 作,并列出这些表中与连接条件相匹配的数据行。根据所使用的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。

外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。

交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

连接 *** 作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑运算符等构成。

无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接连接。例如:

SELECT p1pub_id,p2pub_id,p1pr_info

FROM pub_info AS p1 INNER JOIN pub_info AS p2

ON DATALENGTH(p1pr_info)=DATALENGTH(p2pr_info)

(一)内连接

内连接查询 *** 作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分三种:

1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。

2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。

3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。

例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社:

SELECT

FROM authors AS a INNER JOIN publishers AS p

ON acity=pcity

又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state):

SELECT a,ppub_id,ppub_name,pcountry

FROM authors AS a INNER JOIN publishers AS p

ON acity=pcity

(二)外连接

内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。

如下面使用左外连接将论坛内容和作者信息连接起来:

SELECT a,b FROM luntan LEFT JOIN usertable as b

ON ausername=busername

下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市:

SELECT a,b

FROM city as a FULL OUTER JOIN user as b

ON ausername=busername

左连接:(也叫左外连接,给出两个表的配匹行,并且以左边的表为准,如果左边表有而右边表没有的行,则在右边表的相应行选择的列显示为NULL,允许左边的基准表对应右边表多条满足条件的记录)左连接就是返回左边的匹配行,不考虑右边的表是否有相应的行,如:select field1,field2 from table1 left join table2

on field1=field2(基准字段,可以多个)

where table1field3=table2field3

右连接:(也叫右外连接,给出两个表的配匹行,并且以右边的表为准,如果右边表有而左边表没有的行,则在右边表的相应行选择的列显示为NULL,允许右边的基准表对应左边表多条满足条件的记录)

(三)交叉连接

交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等于68=48行。

SELECT type,pub_name

FROM titles CROSS JOIN publishers

ORDER BY

SELECT BMY,AUNAME,ANICKNAME FROM USERINFO A

LEFT JOIN FRIEND B ON AUID=BME

WHERE BME=33

以上就是关于求sql server多库多表数据查询全部的内容,包括:求sql server多库多表数据查询、SQL server数据库里查询时新建查询怎么进行多表查询、数据库实验总结等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10196032.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存