[数据库类(MYSQL/SQLIT)] 后端必备:15000 字的 SQL 语句大全

[复制链接]
查看1435 | 回复0 | 2020-9-19 21:45:17 | 显示全部楼层 |阅读模式

登录网站,浏览更多精彩内容

您需要 登录 才可以下载或查看,没有账号?加入我们

×
本帖最后由 nantong 于 2020-9-20 10:43 编辑 & W, G0 k( r- R/ F- [7 A
( I4 y* h& p% m+ e1 Y
一、基础
+ k: a- s, m- l/ K( Z1、说明:创建数据库CREATE DATABASE database-name2、说明:删除数据库drop database dbname3、说明:备份sql server--- 创建 备份数据的 device$ Q- s0 j4 I5 T' |7 I8 g9 m; f
USE master
% I& I5 d- e1 \% ]( REXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'+ ]7 S, i+ d! D. n' f# a: F7 N
--- 开始 备份2 s% W2 T" {' a. W5 d8 g( H
BACKUP DATABASE pubs TO testBack
4、说明:创建新表create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)根据已有的表创建新表: A:create table tab_new like tab_old (使用旧表创建新表)% z7 F( F4 r. t4 A
Bcreate table tab_new as select col1,col2… from tab_old definition only
5、说明:删除新表drop table tabname 6、说明:增加一个列Alter table tabname add column col type:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。7、说明:添加主键:Alter table tabname add primary key(col) / H3 K8 o  ?2 d) a# f$ y
说明:删除主键:Alter table tabname drop primary key(col)
8、说明:创建索引:create [unique] index idxname on tabname(col….) 删除索引:drop index idxname注:索引是不可更改的,想更改必须删除重新建。9、说明:创建视图:create view viewname as select statement删除视图:drop view viewname10、说明:几个简单的基本的sql语句选择:select * from table1 where 范围1 k$ W) f+ c+ a' L, y# M& I$ p) b
插入:insert into table1(field1,field2) values(value1,value2)
5 z) D+ Q7 ~/ s: _" d5 G删除:delete from table1 where 范围更新:update table1 set field1=value1 where 范围2 A; m6 ^; P1 M1 e
查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
3 ^) H  i! e2 B+ v  S排序:select * from table1 order by field1,field2 [desc]
: u; h( j2 Z4 S% r) z2 _总数:select count as totalcount from table19 i) o& Y% i  w: o
求和:select sum(field1) as sumvalue from table1
9 Y6 j9 Q  e( b3 v: G0 [3 i平均:select avg(field1) as avgvalue from table1  ~+ E# D3 j+ i: [& z
最大:select max(field1) as maxvalue from table15 ?9 z* u( y+ f2 c* V
最小:select min(field1) as minvalue from table1
11、说明:几个高级查询运算词A:UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 B:EXCEPT 运算符 EXCEPT运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。C:INTERSECT 运算符INTERSECT运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 " o) z0 B; n! L+ d; T
注:使用运算词的几个查询结果行必须是一致的。
12、说明:使用外连接 A、left (outer) join左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.cB:right (outer) join: 右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 C:full/cross (outer) join全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。12、分组:Group by:
8 q1 j% f2 E" T2 c( I6 e
一张表,一旦分组 完成后,查询后只能得到组相关的信息。组相关的信息:(统计信息) count,sum,max,min,avg 分组的标准)在SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据在selecte统计函数中的字段,不能和普通的字段放在一起; 13、对数据库进行操作:
/ \+ }* C6 W2 F& Y! q分离数据库 sp_detach_db;附加数据库sp_attach_db 后接表明,附加需要完整的路径名
! Q' g! B# L: S' E& G2 N. e# }& i  M1 Y" t
14.如何修改数据库的名称:sp_renamedb 'old_name', 'new_name' 二、提升 1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
' n, T" s/ e- {

8 t/ E/ Z5 {9 s9 |6 ^法一:select * into b from a where 1<>1(仅用于SQlServer)法二:select top 0 * into b from a- g3 z" A1 d- B6 Q" R, q* h
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)+ v7 i& I4 d6 M7 Y
& ?, ~5 F! z; |4 `& d
insert into b(a, b, c) select d,e,f from b; 3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
, A/ b1 d5 N' |7 s6 e4 v
7 A* c: w7 P; b) a; W
insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
1 s0 f! `8 K* ^1 }: g+ v8 N例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..
4、说明:子查询(表名1:a 表名2:b), E2 F0 c) k/ B0 w  B& R: p; A( v

$ T' r. r/ C# g
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3) 5、说明:显示文章、提交人和最后回复时间1 c0 _) \: I2 X% L  u

4 t. i5 ], H3 x; @, r
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b 6、说明:外连接查询(表名1:a 表名2:b)
7 h! r" ?, @6 y: l3 c7 t; e  A2 Y  ^
9 d9 x& V7 H1 B1 g$ |% a9 m
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c 7、说明:在线视图查询(表名1:a )
% b# g$ L" T' v$ Y" X, R( ~
select * from (SELECT a,b,c FROM a) T where t.a > 1;
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
$ D2 Q) g" a, o, o2 w- C6 }
3 F) i1 v( d, o2 k/ S( W8 k
select * from table1 where time between time1 and time2
; N/ u4 v3 T- s7 Gselect a,b,c, from table1 where a not between 数值1 and 数值2
9、说明:in 的使用方法. q8 Y4 @! ~- d/ X: C

3 D& a# Z) m5 e+ q! q  p- O
select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’) 10、说明:两张关联表,删除主表中已经在副表中没有的信息 0 }( r1 {. Z' t3 C$ z1 p$ K

. ]+ V( y3 R+ T9 [1 D/ C& i! \( C+ n
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) 11、说明:四表联查问题:
5 H7 P& w& p- ^- [% @0 ?+ [

6 b6 ]; a4 K. O6 y# Y1 ?
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where ..... 12、说明:日程安排提前五分钟提醒
4 q, Q$ Q6 M2 C3 I
; a4 Q! \. \% c" L, V% q
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 13、说明:一条sql 语句搞定数据库分页7 f/ _' I  ~3 }) ~" |" c3 p+ T0 ?
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段) j# x- t1 N! M# b; @( c
具体实现:关于数据库分页:, A4 w. K( D  D  `2 K. S
declare @start int,@end int
# h4 K  O  J" C0 x: v+ @  @sql  nvarchar(600)
$ w6 ]1 A% {) o& s! {  set @sql=’select top’+str(@end-@start+1)+’+from T where rid not in(select top’+str(@str-1)+’Rid from T where Rid>-1)’
, X% K3 m: [! b1 J9 Q# Z& R  s  exec sp_executesql @sql
注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,如果top后还有具体的字段,这样做是非常有好处的。因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际表中的不一致(逻辑索引中的数据有可能和数据表中的不一致,而查询时如果处在索引则首先查询索引) 14、说明:前10条记录0 s7 U/ X0 T4 b
! H% B# C( y; l5 U4 i
select top 10 * form table1 where 范围 15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
1 ~+ C- C% J" B4 X' {" Q
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) 16、说明:包括所有在 TableA中但不在 TableB和TableC中的行并消除所有重复行而派生出一个结果表
, c# ~: e0 h. `  M! D0 l# A
(select a from tableA ) except (select a from tableB) except (select a from tableC) 17、说明:随机取出10条数据% H0 `3 r5 t$ V7 g& G7 s

- y; s8 [1 l9 c( D
select top 10 * from tablename order by newid() 18、说明:随机选择记录
8 F6 ^7 S9 v( w- x3 p+ d  I
8 S+ i# |2 B: v
select newid() 19、说明:删除重复记录' Q8 A4 N. S' f0 ~, K3 b2 L0 Y
3 l' r4 |1 V3 f3 X/ D0 i6 @8 J
1) delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)4 r5 c# L, U0 T# z* Y6 h
2) select distinct * into temp from tablename. p7 Y' U. f+ m) w  G
  delete from tablename
6 z  B4 W5 ^/ V' V2 E5 _! E  insert into tablename select * from temp& D+ E5 L2 `" y5 ]8 R
评价:这种操作牵连大量的数据的移动,这种做法不适合大容量但数据操作3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段
, O" P* }( m- a" b6 {
alter table tablename
" J, Z3 x3 _2 g4 b% z--添加一个自增列
: E, k: P# A$ I* E8 e7 ^3 B* o! ^! ?add  column_b int identity(1,1): J1 j; {. K* v4 D3 P
delete from tablename where column_b not in(
, M) z) i6 A: ]3 ]+ W! x# qselect max(column_b) from tablename group by column1,column2,...)
8 l. S8 u& J1 S& a+ T0 {3 S: o4 Yalter table tablename drop column column_b
7 M- u9 y" Y/ z- N1 _3 m
20、说明:列出数据库里所有的表名& t" c4 S# G$ b4 c! x6 \0 `
select name from sysobjects where type='U' // U代表用户 21、说明:列出表里的所有的列名8 D+ I1 O. u" a9 a6 n7 K
select name from syscolumns where id=object_id('TableName') 22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
* p' c! u$ Q+ B
显示结果:3 |7 F9 q! c& o4 I1 v
type vender pcs5 j1 W; r* R: [$ P) t5 X9 I* n
电脑 A 1
) L) E4 r7 ]( D电脑 A 1. m/ n7 N" I# _7 ?3 r' T1 T
光盘 B 22 W6 |9 k8 M0 }% V- A- h# F  T
光盘 A 2
# U) _7 w2 N. m+ o1 W4 T8 i手机 B 3
9 ?- s9 D0 R4 \$ ~  T手机 C 3
23、说明:初始化表table1 TRUNCATE TABLE table1 24、说明:选择从10到15的记录
+ x9 B. }3 c; ~9 i: U) L4 h3 d
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc 三、技巧 1、1=1,1=2的使用,在SQL语句组合时用的较多 “where 1=1” 是表示选择全部    “where 1=2”全部不选,* k1 H- y: b' F! V
如:
if @strWhere !=''
7 l/ s! m. O. i% c9 Y" E: d2 fbegin
9 o8 b$ L0 X8 A2 S0 ^$ t* Nset @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere
# P& `, _; B; A, ~end
* D4 b6 C: @+ F% T- N2 |- Pelse / Y" o) H; U3 N$ C9 C3 y+ s
begin* Z# T+ ^, l1 E( \
set @strSQL = 'select count(*) as Total from [' + @tblName + ']' 2 V. c5 [: Z2 ?+ Q2 h; @# D
end
  r- y, O% ?, D
我们可以直接写成 set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere
# O2 @; L/ [( Z6 ?2、收缩数据库--重建索引8 J+ e0 o, B* I$ a2 o# o7 y
DBCC REINDEX# E, N7 J" @) i" B8 m# r: A7 z
DBCC INDEXDEFRAG
$ b5 m7 s* p) u: }--收缩数据和日志
) U6 ?6 n- s# _; ~5 M% x# C! iDBCC SHRINKDB
, j$ G$ _& \# VDBCC SHRINKFILE 3、压缩数据库dbcc shrinkdatabase(dbname) 4、转移数据库给新用户以已存在用户权限exec sp_change_users_login 'update_one','newname','oldname'# C# N& P/ n4 l# ^, {! I
go 5、检查备份集, L" C1 e" l) b4 u
RESTORE VERIFYONLY from disk='E:\dvbbs.bak' 6、修复数据库ALTER DATABASE [dvbbs] SET SINGLE_USER
' V5 p& I, i/ A( D2 a9 Y  jGO
8 X. C9 j8 Y; i! zDBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
% u; H$ b; J( {" x5 ]: PGO
- C4 ?; s4 \3 |* j; JALTER DATABASE [dvbbs] SET MULTI_USER
% W- O3 b  ]1 y# _. E8 H2 jGO 7、日志清除SET NOCOUNT ON: T4 e9 c# f3 ]" z
DECLARE @LogicalFileName sysname,5 r- Q. M+ p# q
@MaxMinutes INT,7 H) W0 ?9 H- j% ~8 w1 X6 u
@NewSize INT USE tablename -- 要操作的数据库名4 k. I  R* j1 {& A
SELECT  @LogicalFileName = 'tablename_log', -- 日志文件名8 @$ m, ]- t+ Q% e4 Z
@MaxMinutes = 10, -- Limit on time allowed to wrap log.
8 g( a1 Y. `7 N9 V9 k @NewSize = 1  -- 你想设定的日志文件的大小(M) Setup / initialize, C& Z- E( z1 C! W9 l
DECLARE @OriginalSize int
# [! x6 }3 U$ h; iSELECT @OriginalSize = size - C: ]8 s5 ~  N( `8 v6 `
FROM sysfiles
+ e) P# u5 c5 n WHERE name = @LogicalFileName
2 C3 p, g0 V, h& \& c# Q! ~' \  Q" WSELECT 'Original Size of ' + db_name() + ' LOG is ' + ) P: _3 s1 e. Y( P9 r3 h( a
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + ! m% O# _: |! D/ l; z* C
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
' R9 \5 j6 E. t FROM sysfiles
3 I9 p. t0 O% q& E/ k: Q WHERE name = @LogicalFileName# a5 C/ x5 s. h. j5 y6 }
CREATE TABLE DummyTrans; ^- Q' c1 J1 W9 b! D
(DummyColumn char (8000) not null) DECLARE @Counter    INT,5 o  k) m7 p/ ]# ?* H! ~) K
@StartTime DATETIME,
) |) A& N3 {0 w, b) j7 p  Y1 E @TruncLog   VARCHAR(255)  b; f+ Y, Z% r. R+ F3 f
SELECT @StartTime = GETDATE(),
: o& j6 y8 J) P  {. R1 r; x3 n' e @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' DBCC SHRINKFILE (@LogicalFileName, @NewSize)* a: H/ I* |/ i
EXEC (@TruncLog)4 L* a! i( A  w7 W# v
-- Wrap the log if necessary.
( N' Z' n2 ^+ w* d, |WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired- @+ U! U& f/ y2 \/ N( b
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)  3 B, L, Z# s) N, X$ `
AND (@OriginalSize * 8 /1024) > @NewSize  
" y- `9 Z- g$ @# N2 J1 v2 K BEGIN -- Outer loop.6 c; U+ U2 q0 o# h% v% x" E
SELECT @Counter = 0
$ z% b8 H! H0 T( W* I0 ?; h WHILE   ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))6 ^& k, q/ @1 V, y" K9 ]+ `# t, `- \( K1 B
BEGIN -- update
3 s$ w" o% P9 F* j INSERT DummyTrans VALUES ('Fill Log') DELETE DummyTrans
" \* w; W6 W0 f3 {4 ?, \ SELECT @Counter = @Counter + 1
0 ]( R3 E0 |( R1 n* ^& ]$ R, n4 } END
$ g+ J9 z: N2 f- r EXEC (@TruncLog)  + O9 L  J& M& j
END
4 F3 V* d' x; A8 R* s# rSELECT 'Final Size of ' + db_name() + ' LOG is ' +; S2 C7 N6 r# K+ k$ `/ |
CONVERT(VARCHAR(30),size) + ' 8K pages or ' + 8 P7 k5 @; P/ z- x
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
* h1 ?, `! O" F8 O+ N7 o FROM sysfiles 7 ~: V8 U; z# L  Z1 z( s, B
WHERE name = @LogicalFileName
! Z1 B: W* w5 @# ^; y) W3 @DROP TABLE DummyTrans
# P' r/ \% @/ L( kSET NOCOUNT OFF 8、说明:更改某个表exec sp_changeobjectowner 'tablename','dbo' 9、存储更改全部表 CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
& J" W2 R0 W) x  c; v! I8 b@OldOwner as NVARCHAR(128),' {# ~+ [$ K" F6 ]: N5 H& \
@NewOwner as NVARCHAR(128)3 p4 c* `- m0 T* ~- J6 _# X- Y
AS DECLARE @Name    as NVARCHAR(128)
/ o% s# a- a4 L. uDECLARE @Owner   as NVARCHAR(128); n0 S2 X9 H$ X2 Y3 b0 T+ p$ t3 x
DECLARE @OwnerName   as NVARCHAR(128) DECLARE curObject CURSOR FOR & R  [& B# p9 X. c9 z& E$ O6 I
select 'Name'    = name," ~* p6 B6 [( X& J. c! I5 W' y7 i
   'Owner'    = user_name(uid)
: t6 [! C& K# K; m. d4 e& u. n9 Zfrom sysobjects
6 w& v/ B. r& e0 R, C8 \/ a3 Bwhere user_name(uid)=@OldOwner
9 L, g" q* b( U" `) @8 q+ Gorder by name OPEN   curObject7 q" ^& |3 [, a0 @! _4 y
FETCH NEXT FROM curObject INTO @Name, @Owner; Q/ k0 b5 e1 L- E7 h9 l
WHILE(@@FETCH_STATUS=0)
+ z( F; ~0 C, F" ^$ g7 t! oBEGIN     
( k$ O% G: B5 I  o! Hif @Owner=@OldOwner
1 D# z0 E) y" A0 g8 N7 Sbegin
8 D$ K& i( ?( A# v/ h, z* U8 \& T   set @OwnerName = @OldOwner + '.' + rtrim(@Name)  p2 w+ P2 X8 B0 r
   exec sp_changeobjectowner @OwnerName, @NewOwner
' r" U  u. _$ T) D$ J! mend
6 k3 I: n" t/ H+ L" }-- select @name,@NewOwner,@OldOwner FETCH NEXT FROM curObject INTO @Name, @Owner+ V: k  r, y5 k- R
END close curObject2 W$ n/ J8 m6 U- s( i
deallocate curObject
6 c- p, W- j# b7 o8 eGO 10、SQL SERVER中直接循环写入数据declare @i int
$ r, M8 F7 g( [- D2 T" h. [; L0 [set @i=16 e% p8 D4 R3 C/ X. ?. ~5 e  z4 Y5 W
while @i<304 Z7 B5 K3 U$ I
begin
: ]) u5 g' [& j1 z) J    insert into test (userid) values(@i)
0 x# J: e' f1 b; w3 k, R- K) {    set @i=@i+1
# q/ d  V8 z; N) o+ x$ N! `: f: g' W8 Bend1 l$ ]# W+ b/ S- }
案例有如下表,要求就裱中所有沒有及格的成績,在每次增長0.1的基礎上,使他們剛好及格:Name   scor0 g  \4 A, ?* G' B! A' X7 }
Zhangshan 80
& G2 @- X! x- K9 e. tLishi 59
$ x+ Y: P2 v+ M; X# V* {% D- z2 wWangwu 50
0 z) H2 ]; D8 b+ XSongquan 69while((select min(score) from tb_table)<60) beginupdate tb_table set score =score*1.01where score<60if  (select min(score) from tb_table)>60  break else    continueend
, f& @* Y+ s6 O数据开发-经典 1.按姓氏笔画排序:! t  \! C) C  S& p$ n# I' Z
Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as //从少到多 2.数据库加密:
7 y* o/ C8 ^. ~7 s& \  u' s) Q& pselect encrypt('原始密码'). n; ?% s! G9 n+ D1 @" m
select pwdencrypt('原始密码')  {) }1 L$ e1 B! i+ }. l& ~8 V
select pwdcompare('原始密码','加密后密码') = 1--相同;否则不相同 encrypt('原始密码')8 N# v( J3 N2 D. M
select pwdencrypt('原始密码')
, s7 }* V9 E4 ], ^select pwdcompare('原始密码','加密后密码') = 1--相同;否则不相同 3.取回表中字段:declare @list varchar(1000)," e. W+ O- Q9 y& Y
@sql nvarchar(1000)
7 s( [1 F" H6 U+ I( q2 o2 _, `9 Wselect @list=@list+','+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name='表A'
  q' n7 ~2 w& P5 |' F# hset @sql='select '+right(@list,len(@list)-1)+' from 表A' 5 z4 Q7 @1 h( t5 ~
exec (@sql) 4.查看硬盘分区:EXEC master..xp_fixeddrives 5.比较A,B表是否相等:if (select checksum_agg(binary_checksum(*)) from A)
0 y% A5 x, L( n4 h     =
4 X( P# V5 \6 ~7 H" a0 ^/ q    (select checksum_agg(binary_checksum(*)) from B)
# P* j* I$ Y' [, Z8 Oprint '相等': y3 Q7 h3 t( B3 P
else
0 A% f) {3 O$ c$ d' L6 q5 d! yprint '不相等' 6.杀掉所有的事件探察器进程:DECLARE hcforeach CURSOR GLOBAL FOR SELECT 'kill '+RTRIM(spid) FROM master.dbo.sysprocesses' k1 P5 k" t# G' U7 S; ^5 |
WHERE program_name IN('SQL profiler',N'SQL 事件探查器')
3 c9 t& P! H$ ^8 j5 a0 hEXEC sp_msforeach_worker '?' 7.记录搜索:/ r9 u+ u/ R/ I# c% K
开头到N条记录Select Top N * From 表-------------------------------
4 p1 ^' C, L/ YNM条记录(要有主索引ID)
2 [3 P5 R  D4 a& q4 {
Select Top M-N * From 表 Where ID in (Select Top M ID From 表) Order by ID   Desc: s1 |" z5 l1 I& }
----------------------------------
: @$ R& _2 M8 x, CN到结尾记录Select Top N * From 表 Order by ID Desc
' k0 K9 M' a# y( {6 i; D$ O: D5 }案例例如1:一张表有一万多条记录,表的第一个字段 RecID 是自增长字段, 写一个SQL语句, 找出表的第31到第40个记录。  select top 10 recid from A where recid not  in(select top 30 recid from A) 分析:如果这样写会产生某些问题,如果recid在表中存在逻辑索引。 select top 10 recid from A where……是从索引中查找,而后面的select top 30 recid from A则在数据表中查找,这样由于索引中的顺序有可能和数据表中的不一致,这样就导致查询到的不是本来的欲得到的数据。 解决方案 1,用order by select top 30 recid from A order by ricid 如果该字段不是自增长,就会出现问题 2,在那个子查询中也加条件:select top 30 recid from A where recid>-1 例2:查询表中的最后以条记录,并不知道这个表共有多少数据,以及表结构。& [: J& x% K( r2 V8 q  s( ^3 v8 W
set @s = 'select top 1 * from T   where pid not in (select top ' + str(@count-1) + ' pid  from  T)'
print @s      exec  sp_executesql  @s 9:获取当前数据库中的所有用户表$ f% w8 x9 Y' P6 r* _
select Name from sysobjects where xtype='u' and status>=0 10:获取某一个表的所有字段select name from syscolumns where id=object_id('表名') select name from syscolumns where id in (select id from sysobjects where type = 'u' and name = '表名') 两种方式的效果相同 11:查看与某一个表相关的视图、存储过程、函数
, m- z" M& C# Z" d+ ]select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '%表名%' 12:查看当前数据库中所有存储过程select name as 存储过程名称 from sysobjects where xtype='P' 13:查询用户创建的所有数据库
4 V* a- F6 c4 t" u- [7 R9 k# Uselect * from master..sysdatabases D where sid not in(select sid from master..syslogins where name='sa')
# X$ d) `- k' n6 {或者
$ P! f& Z/ V% Q0 ~select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01 14:查询某一个表的字段和数据类型select column_name,data_type from information_schema.columns
* M1 T# ]' K* h" ?* O" Owhere table_name = '表名' 15:不同服务器数据库之间的数据操作. m: y6 L$ o& E
--创建链接服务器
3 N6 \4 [+ o, e  r) y8 M! W
! L$ a  l- B1 b: j! F8 V/ e; _exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
; S5 S# _& l' ?+ t$ [6 u
7 w( G+ W5 g! V, m# D) i( H; zexec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码 '& d) Z6 p  n( Q3 Q/ y
& z+ ?5 E0 _* d. F" Z( N
--查询示例6 U& r9 Z: i9 k

; \: O1 ^5 f( z: zselect * from ITSV.数据库名.dbo.表名
3 o0 V- x& O8 S$ l
# d$ b: c* J6 e3 g) J. f: |1 n--导入示例
7 I8 X4 I% U; ?+ O' e; P$ p$ t! Y! i, O- h- @
select * into 表 from ITSV.数据库名.dbo.表名& J3 T9 `/ ~/ \2 G7 @

2 e" R7 D$ c: E4 w+ y' q- m--以后不再使用时删除链接服务器
5 p) X5 K0 L0 y, u% ~. g: _5 i0 a+ L% q6 e+ R& [
exec sp_dropserver 'ITSV ', 'droplogins '. Y  R. T6 N% M8 x; S0 \/ K/ J* t
+ [! W( G! D" i4 I2 P
--连接远程/局域网数据(openrowset/openquery/opendatasource). @! R& r* L7 N0 Q
; c+ D+ r9 U. r) ~
--1、openrowset
+ X; n$ ]1 h: y" F) P1 E+ U6 Y7 r! a5 i0 s* l
--查询示例
8 U( f8 _5 @; g! b. o* a0 v* m. Z/ O# z3 p; N+ ?4 ^7 @
select * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)
7 z/ z( U# a% x# z( d3 m, C+ F. y0 _6 p
--生成本地表
$ B) x3 R/ w# h  {  U7 |
0 D: h" e) o8 b& N8 Rselect * into 表 from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)5 ?4 G% M: u7 x9 c  }

7 [2 F7 P  C% ]( Z& z- L! n7 O& c--把本地表导入远程表/ c0 W! @6 L* D* ~
1 P. O- I1 K1 H( u6 T6 s
insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)
7 S( P2 g& {0 S( G( u0 S2 C
. p  T6 m% K% g2 k' bselect *from 本地表
+ y% s/ y+ h& [' g- v% k5 d  v5 ~
& _. H) @- w) l! O4 U0 W$ E1 ^+ s--更新本地表
7 i9 ^; X8 A9 ]- w) Y" Yupdate b" P) o" ^5 q' c9 |9 q
set b.列A=a.列A
( V: q$ h) b4 q from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)as a inner join 本地表 b, d$ y9 e8 _" T
on a.column1=b.column1
4 ?( }$ |  x5 _& ~# k6 C  o' z& `$ i9 i--openquery用法需要创建一个连接
$ t1 a  ^& D5 u6 t/ U$ I; h" ~--首先创建一个连接创建链接服务器4 T# I0 k* d" A' @0 q, u
exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '4 d: s8 U! j  |- M
--查询! [( {5 J/ f4 T  O
select * FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')
4 K$ }  z; W% J--把本地表导入远程表- A3 M1 b9 L* @5 o
insert openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')
  {( K+ m  S" J: l& H) o6 Eselect * from 本地表
' o" j/ O# b9 I% G2 u0 d--更新本地表9 y% s- {$ K3 x! U0 I) ?) Z, U
  1. update b set b.列B=a.列B FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') as a inner join 本地表 b on a.列A=b.列A, }) \$ z* l( [8 ~4 B( I7 g. T. u; N( m+ \
  2. , b8 ]8 a! t6 i$ S4 S  t. h3 w
  3. --3、opendatasource/openrowset
    : w, D. x4 g- ~7 U3 F

  4. ; O) I8 B  F( D, k  E1 j4 h. `! C
  5. SELECT   * FROM   opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ' ).test.dbo.roy_ta5 ~  Z: `5 t$ B% U6 `) }: ~

  6. $ ~3 v" V! Z+ d; Q+ c
  7. --把本地表导入远程表
    ; Y7 z( B4 [/ z4 b  j0 K
  8. 3 g; u! r/ W/ ?- W; l! G
  9. insert opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').数据库.dbo.表名
    ( D+ s  s, K9 v) p9 G7 a) t2 c
  10. 0 X- u1 M2 z0 K( F
  11. select * from 本地表
复制代码
update b set b.列B=a.列B FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') as a inner join 本地表 b on a.列A=b.列A" A9 y. ^& ^4 f; }
--3、opendatasource/openrowset2 p3 t' T- a- y3 _" k% |8 y# y
SELECT   * FROM   opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ' ).test.dbo.roy_ta6 F" T, a" Q/ x/ a
--把本地表导入远程表
4 D; _1 p, X, p3 minsert opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').数据库.dbo.表名
' ^. y6 v3 j" `9 F0 {. d. d$ Y. yselect * from 本地表
中国领先的数字技术资源交流中心!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

238

主题

46

回帖

9300

积分

版主

积分
9300
学费
8227