SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。
i=D,T[|>a
MocH>^,
?Sqm`)\>4
一、基础 ["M>
1、说明:创建数据库 F~AS(sk
CREATE DATABASE database-name 7y\g~?5N
2、说明:删除数据库 m0"\3@kB
drop database dbname 6Ts`5$e
3、说明:备份sql server "=(;l3-o
--- 创建 备份数据的 device {Jc!T:vJ
USE master /z5lxS@#
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' #V6
-*
--- 开始 备份 m5pVt4
BACKUP DATABASE pubs TO testBack w-$w
4、说明:创建新表 k
))*z FV
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) pYG,5+g
根据已有的表创建新表: *
2%e.d3"M
A:create table tab_new like tab_old (使用旧表创建新表) Uz|]}t5V
B:create table tab_new as select col1,col2... from tab_old definition only \7/_+)0}'
5、说明:删除新表 G= cxc_9
drop table tabname l/^-:RRNKi
6、说明:增加一个列 8957$g
Alter table tabname add column col type v~Qy{dn
P
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 D3{lyi|8
7、说明:添加主键: Alter table tabname add primary key(col) Yn>zR I
说明:删除主键: Alter table tabname drop primary key(col) +a-@
!J~:
8、说明:创建索引:create [unique] index idxname on tabname(col....) xW =$j|
删除索引:drop index idxname 6hK"k
注:索引是不可更改的,想更改必须删除重新建。 DeA'D|
9、说明:创建视图:create view viewname as select statement
e 63|Z[8
删除视图:drop view viewname o3qv945
10、说明:几个简单的基本的sql语句 D3xaR
选择:select * from table1 where 范围 CE,Om^
插入:insert into table1(field1,field2) values(value1,value2) u2]g1XjeG
删除:delete from table1 where 范围 #:|?t&On
更新:update table1 set field1=value1 where 范围 JZzf,G:
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料! RH Vv}N0
排序:select * from table1 order by field1,field2 [desc] '.yWL
总数:select count as totalcount from table1 &|'6-wD.
求和:select sum(field1) as sumvalue from table1 |sa7Y_
平均:select avg(field1) as avgvalue from table1 @3 c#\jx
最大:select max(field1) as maxvalue from table1 kVnyX@
最小:select min(field1) as minvalue from table1 U_'q- *W
AFTed?(
"}p?pF<'0
--`LP[ll
11、说明:几个高级查询运算词 #\BI-zt
o(/ia3
?w/nZQWi
A: UNION 运算符 .~L4#V{c~
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 zI! R-Nb
B: EXCEPT 运算符 (H+[ ^(3d2
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 +c`C9RXk
C: INTERSECT 运算符 ~4MjJKzA
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 RCYbRR4y
注:使用运算词的几个查询结果行必须是一致的。 "n }fEVJ,
12、说明:使用外连接 [9om"'
A、left outer join: /'6[*]IZP
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 9Fx z!-9m
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c Ko)T>8:
B:right outer join: T zYgH
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 NB5B$q_'#
C:full outer join: -_DiD^UcXn
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 o%PoSZZ
Z4ov
So%1RY{)
二、提升 G@EjWZQ
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) J 7;n;Mx
法一:select * into b from a where 1<>1 V
C'-h~
法二:select top 0 * into b from a !a(qqZ|s
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) V)QR!4De
insert into b(a, b, c) select d,e,f from b; |~LjH |*M
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) BC{J3<0bf@
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件 5qQ(V)ah
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. vC<kpf!
4、说明:子查询(表名1:a 表名2:b) ]#q7}Sd
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) )^S^s>3
5、说明:显示文章、提交人和最后回复时间 b[o"Uq@8?
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b :YXQ9/iRr
6、说明:外连接查询(表名1:a 表名2:b) Qfu*F}
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c 2G5!u)
7、说明:在线视图查询(表名1:a ) ku9FN
select * from (SELECT a,b,c FROM a) T where t.a > 1; X /,1]
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 j_uY8c>3\q
select * from table1 where time between time1 and time2 *2
$m>N
select a,b,c, from table1 where a not between 数值1 and 数值2 #'Y6UGJ\n
9、说明:in 的使用方法 LY!3u0PnlT
select * from table1 where a [not] in ('值1','值2','值4','值6') (Zn3-t*
10、说明:两张关联表,删除主表中已经在副表中没有的信息 q\y#
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) Y_3YO2K]
11、说明:四表联查问题: `[ ` *@O(y
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 ..... A;j$rGx
12、说明:日程安排提前五分钟提醒 FJ,\?ooGf
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 *5'6E'
13、说明:一条sql 语句搞定数据库分页 Q0uO49sg
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 pD_eo6xX
14、说明:前10条记录 |DPpp/
select top 10 * form table1 where 范围 _&Uo|T
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) T{{AZV"pB
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) MY*>)us\
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 obc^<ZD]
(select a from tableA ) except (select a from tableB) except (select a from tableC) VueQP|
17、说明:随机取出10条数据 @1-GPmj-
select top 10 * from tablename order by newid() f.84=epv
18、说明:随机选择记录 xiOrk
select newid() qMdtJ(gq
19、说明:删除重复记录 xVz -_z
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) dms:i)L2
20、说明:列出数据库里所有的表名 zV(tvt
select name from sysobjects where type='U' i~Ob( YIH
21、说明:列出表里的所有的 [(P[qEY
select name from syscolumns where id=object_id('TableName') <\9Ijuq}k
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 \
NSw<.
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 ~v(M6dz~vk
显示结果: 3g#=sd!0O@
type vender pcs 9Bvn>+_K
电脑 A 1 q{Ta?|x#
电脑 A 1 :f
!=_^}
光盘 B 2 9k+&fyy
光盘 A 2 (T#(A4:6S
手机 B 3 vl{_M*w
;
手机 C 3 m57tOX
23、说明:初始化表table1 S}p&\w H
TRUNCATE TABLE table1 tqwk?[y}+l
24、说明:选择从10到15的记录 IJBJebqL
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc p<0kmA<B/
)>X|o$2
%=mwOoMk0L
C|~JPcl
三、技巧 "K$ Wh1<7
1、1=1,1=2的使用,在SQL语句组合时用的较多 %f>
|fs
"where 1=1" 是表示选择全部 "where 1=2"全部不选, si!9Gz;
如: >7(~'#x8A"
if @strWhere !='' :*&9TNUE@
begin -}qGb}F8!
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere bR8
HGH28
end z2nUul(2
else PxVI{:Uz
begin 6v2RS
set @strSQL = 'select count(*) as Total from [' + @tblName + ']' 3{I=#>;
end #9hXZr/8
我们可以直接写成 x [{q&N!"`
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere vu'!-K=0
2、收缩数据库 mLk6!&zN
--重建索引 XAULD]Q
DBCC REINDEX lF}$`6
DBCC INDEXDEFRAG >upXt?
--收缩数据和日志 Aiks>Cyi23
DBCC SHRINKDB ~ut& U
DBCC SHRINKFILE *CPB5s
3、压缩数据库 xlPcg7
dbcc shrinkdatabase(dbname) K.iH
4、转移数据库给新用户以已存在用户权限 k"^t?\Q%vI
exec sp_change_users_login 'update_one','newname','oldname' .M53, 8X
go lgjoF_D
5、检查备份集 o S:vTr+$
RESTORE VERIFYONLY from disk='E:\dvbbs.bak' hA1gkEM2o
6、修复数据库 6|9g4@Hy
ALTER DATABASE [dvbbs] SET SINGLE_USER ?<yq 2`\4O
GO peTO-x^a-
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK 0q>NE<L
GO $kD`$L@U
ALTER DATABASE [dvbbs] SET MULTI_USER 4z0R\tjT
GO leb^,1/D6
7、日志清除 zmL~]!~&
SET NOCOUNT ON fBWJ%W
DECLARE @LogicalFileName sysname, 5Du>-.r
@MaxMinutes INT, K7[AiU_I
@NewSize INT y5AXL5
USE tablename -- 要操作的数据库名 +%le/Pg@
SELECT @LogicalFileName = 'tablename_log', -- 日志文件名 X~)V )'R
@MaxMinutes = 10, -- Limit on time allowed to wrap log. TH(Lzrbg
@NewSize = 1 -- 你想设定的日志文件的大小(M) Ky'3z"
-- Setup / initialize THbtu*El
DECLARE @OriginalSize int /,uSCITD
SELECT @OriginalSize = size Gkodk[VuLs
FROM sysfiles pT
ocqJ22
WHERE name = @LogicalFileName :9x084ESR)
SELECT 'Original Size of ' + db_name() + ' LOG is ' + `3sy>GU?
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + [nN\{"~O
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' %+7T9>+
FROM sysfiles Vr/` \441
WHERE name = @LogicalFileName ZXsY-5$#d-
CREATE TABLE DummyTrans 1hMX(N&|
(DummyColumn char (8000) not null) =~W0 ~lxX
DECLARE @Counter INT, `r'0"V
@StartTime DATETIME, RP|>&I
@TruncLog VARCHAR(255) %];h|[ax]
SELECT @StartTime = GETDATE(), 1 ~B<
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' =UB*xm%!
DBCC SHRINKFILE (@LogicalFileName, @NewSize) FUzMc1zy|
EXEC (@TruncLog) Kixr6\
-- Wrap the log if necessary. N&x WHFn]C
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired DQ n`@
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName) 7{Ki;1B[w
AND (@OriginalSize * 8 /1024) > @NewSize P"V{y|2
BEGIN -- Outer loop. ,.6J6{
SELECT @Counter = 0 68J 9T^84
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) /XW&q)z-Hl
BEGIN -- update 8=n9hLhqo
INSERT DummyTrans VALUES ('Fill Log') F; MF:;mM
DELETE DummyTrans M8#*zCp{5
SELECT @Counter = @Counter + 1 !HdvCYB>
END j2o1"
EXEC (@TruncLog) n2jvXLJq
END r{_B:
SELECT 'Final Size of ' + db_name() + ' LOG is ' + V&mH#k
CONVERT(VARCHAR(30),size) + ' 8K pages or ' + OZ>)sL
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' (/"K+$8'
FROM sysfiles EZ%w=
WHERE name = @LogicalFileName *793H\
DROP TABLE DummyTrans T]Tdx.B
SET NOCOUNT OFF hr_9;,EPh
8、说明:更改某个表 OD?y
exec sp_changeobjectowner 'tablename','dbo' l}Q"Nb)
9、存储更改全部表 #90[PASx
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch jIx8k8
@OldOwner as NVARCHAR(128), ^6)GS%R
@NewOwner as NVARCHAR(128) cD'HQ3+
AS Ss#@=:"P
DECLARE @Name as NVARCHAR(128) |P,zGy
DECLARE @Owner as NVARCHAR(128) !^)wPmk
DECLARE @OwnerName as NVARCHAR(128) wDT>">&d
DECLARE curObject CURSOR FOR N"Qg\PS_
select 'Name' = name, tT@w%Sz57N
'Owner' = user_name(uid) MG7 ?N #
from sysobjects "wnpiB}
where user_name(uid)=@OldOwner }pl]9
order by name ?fbgU
OPEN curObject @pF
fpHq?>
FETCH NEXT FROM curObject INTO @Name, @Owner 5|<yfk8*J
WHILE(@@FETCH_STATUS=0) eKZ@FEZ
BEGIN C%}]"0Q1
if @Owner=@OldOwner %]a
@A8o0
begin k#axt
Sc
set @OwnerName = @OldOwner + '.' + rtrim(@Name) nabBU4;h
exec sp_changeobjectowner @OwnerName, @NewOwner v"P&`1=T
end Pl rkgS0J
-- select @name,@NewOwner,@OldOwner F`Dg*O
FETCH NEXT FROM curObject INTO @Name, @Owner e2]4a3
END
h`wMi}q'D
close curObject 54q4CagFq
deallocate curObject H&w:`JYDL3
GO V=j-Um;
10、SQL SERVER中直接循环写入数据 GBH_r0
declare @i int K3vseor
set @i=1 =jg#fdM
-
while @i<30 ..t,LU@|
begin Y7<zm}=(/
insert into test (userid) values(@i) Vq3gceo'0A
set @i=@i+1 }xAie(
end N$\ bg|v
小记存储过程中经常用到的本周,本月,本年函数 [>W"R1/
Dateadd(wk,datediff(wk,0,getdate()),-1) KQG-2oW
Dateadd(wk,datediff(wk,0,getdate()),6) 7d&DrI@~
Dateadd(mm,datediff(mm,0,getdate()),0) 1R0ffP]
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0)) r\$6'+Si
Dateadd(yy,datediff(yy,0,getdate()),0) nNt*} k
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) X+=-f^)&
上面的SQL代码只是一个时间段 Nls83 W
Dateadd(wk,datediff(wk,0,getdate()),-1) E,{GU
Dateadd(wk,datediff(wk,0,getdate()),6) {>8Pl2J
就是表示本周时间段. )y9 ;OA
下面的SQL的条件部分,就是查询时间段在本周范围内的: Y/.AUN
Z
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6) &+mV7o
而在存储过程中 V]79vC
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1) aWyUu/g<A`
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6) $4Z+F#mx