SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。 Cx3m\
\c
l1|,Lr
EX_sJ c
一、基础 >a`zkl
1、说明:创建数据库 6L`+z
CREATE DATABASE database-name GO
GXM4I
2、说明:删除数据库 cTIwA:)D
drop database dbname A(@gv8e[H^
3、说明:备份sql server _2Xu1q.6~5
--- 创建 备份数据的 device 8iH;GFNJ7'
USE master [#*?uu+
jK
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' pNf9
--- 开始 备份 ,5+X%~'
BACKUP DATABASE pubs TO testBack x_iy;\s1
4、说明:创建新表 m+8b2H:V
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) s2v#evI`+
根据已有的表创建新表: en#g<on
A:create table tab_new like tab_old (使用旧表创建新表) P)j9\ muc
B:create table tab_new as select col1,col2... from tab_old definition only JW.&uV1Z
5、说明:删除新表 OFL+Q~~C
drop table tabname yLIj4bf
6、说明:增加一个列 Xgth|C}k
Alter table tabname add column col type /$.vHt5nt
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 huD\dmQ:]
7、说明:添加主键: Alter table tabname add primary key(col) f]6`GsE
说明:删除主键: Alter table tabname drop primary key(col) ]!J3?G
8、说明:创建索引:create [unique] index idxname on tabname(col....) sluZ-,zE
删除索引:drop index idxname .yh2ttf<gB
注:索引是不可更改的,想更改必须删除重新建。 8sjHQ)<
9、说明:创建视图:create view viewname as select statement >@89k^#Vc
删除视图:drop view viewname C05{,w?
10、说明:几个简单的基本的sql语句 y<x_v )k-
选择:select * from table1 where 范围 a.U:B
[v`
插入:insert into table1(field1,field2) values(value1,value2) 3!w>"h0(
删除:delete from table1 where 范围 =|&"/$+s
更新:update table1 set field1=value1 where 范围 2yO)}g FJ
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料! gx9sBkoq5D
排序:select * from table1 order by field1,field2 [desc] VGUDUM.8
总数:select count as totalcount from table1 =v`&iL~m
求和:select sum(field1) as sumvalue from table1 h|uP=0
平均:select avg(field1) as avgvalue from table1 :-@P3F[0
最大:select max(field1) as maxvalue from table1 Tvw2py q
最小:select min(field1) as minvalue from table1 adr^6n6v
CZ%"Pqy&1L
]fS~N9B
.lj! ~_
11、说明:几个高级查询运算词 }fMFQA)
>s?;2T2"yx
jqsktJw#i
A: UNION 运算符 JP*wi-8D
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 7MJ)p$&
B: EXCEPT 运算符 mb`}sTU).
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 VP[!ji9P
C: INTERSECT 运算符 v%~ViOgL\
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 |oi49:NXn
注:使用运算词的几个查询结果行必须是一致的。 AS"|r
12、说明:使用外连接 4^}PnU7z
A、left outer join: dQ~"b=
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 QN a3S*
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 XlJux_LD:
B:right outer join: r9'H7J
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 4xn^`xf9
C:full outer join: :+^llz
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 x(N}^Hu
{QkH%jj
`rJ ~*7-
二、提升 dY`J,s
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) ]H'82a
法一:select * into b from a where 1<>1 q8v!{Os+#
法二:select top 0 * into b from a D)cwttH
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) v")
W@haU
insert into b(a, b, c) select d,e,f from b; %=
;K>D
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) neH"ks5
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件 Z'm%3
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. V#KM~3e
4、说明:子查询(表名1:a 表名2:b) H@2+wr)$}
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) 1D]wW%us
5、说明:显示文章、提交人和最后回复时间 IDZn,^
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b _
RT}Ee}Y
6、说明:外连接查询(表名1:a 表名2:b) Us.jyg7_c
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c 1Xc%%j
7、说明:在线视图查询(表名1:a ) <Ux;dekz}
select * from (SELECT a,b,c FROM a) T where t.a > 1; :gv#_[k
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 8G<.5!f7`N
select * from table1 where time between time1 and time2 FM];+d0
select a,b,c, from table1 where a not between 数值1 and 数值2 xbA2R4|
9、说明:in 的使用方法
xoaQ5u
select * from table1 where a [not] in ('值1','值2','值4','值6') JwcP[w2
10、说明:两张关联表,删除主表中已经在副表中没有的信息 !1R
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) <{uIB;P
11、说明:四表联查问题: Z^S!w;eu
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 ..... iOxygs#p
12、说明:日程安排提前五分钟提醒 A'2:(m@{T
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 &ayoTE^0,
13、说明:一条sql 语句搞定数据库分页 %)V3QnBO
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 HrxEC)V6#
14、说明:前10条记录 5~QB.m,>
select top 10 * form table1 where 范围 K.Z{4x=0
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) VUy
1?n
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) @DR&e^Zz
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 9hU@VPB~
(select a from tableA ) except (select a from tableB) except (select a from tableC) (FHh,y~v
17、说明:随机取出10条数据 )cXc"aj@s
select top 10 * from tablename order by newid() 2[eY q1f!
18、说明:随机选择记录 V"73^
select newid() *^ BE1-
19、说明:删除重复记录 yD"sYT
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) Mk;j"ZDF
20、说明:列出数据库里所有的表名 Wd#6Y}:
select name from sysobjects where type='U' ]B||S7idq
21、说明:列出表里的所有的 cPSu!u}D
select name from syscolumns where id=object_id('TableName') EbHeP
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 2$ =HDwv
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 HDOa N
显示结果: In2D32"F
type vender pcs ,zaveQ~l
电脑 A 1 k=[Ro
电脑 A 1 xm5D$m3#
光盘 B 2 \=~Ap#Mpc4
光盘 A 2 huIr*)r&p
手机 B 3 ~5b %~:
手机 C 3 %iv'/B8
23、说明:初始化表table1 wd *Jq
TRUNCATE TABLE table1 &\r%&IX/
24、说明:选择从10到15的记录 $? Rod;
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc \ZB;K~BV&
?~Des"F6)1
Kkm7L-
`shB[Lt
三、技巧 YX(%jcj*
1、1=1,1=2的使用,在SQL语句组合时用的较多 ~S9nLb:O{
"where 1=1" 是表示选择全部 "where 1=2"全部不选, C
Qebb:y
如: FKP^f\!M
if @strWhere !='' j&9~OXYv
begin )d~Mag+
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere *?S\0a'W@
end FYJB.lAT
else g=.5*'Xlp
begin c/u;v69r
set @strSQL = 'select count(*) as Total from [' + @tblName + ']' lMP7o&
end )Jc>l;G(M
我们可以直接写成 t65!2G"<
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere b#M<b.R)
2、收缩数据库 $lQi0*s
--重建索引 ^iTA40K
DBCC REINDEX W[jxfZD9v
DBCC INDEXDEFRAG P|?z1JUd
--收缩数据和日志 7]Egu D4
DBCC SHRINKDB ! 9e>J
DBCC SHRINKFILE {2nXItso
3、压缩数据库 :1iw_GhJf
dbcc shrinkdatabase(dbname) @P-7a`3*
4、转移数据库给新用户以已存在用户权限 "~ /3
exec sp_change_users_login 'update_one','newname','oldname' $#!~K2$
go YANEdH`d
5、检查备份集 +38t82%YWo
RESTORE VERIFYONLY from disk='E:\dvbbs.bak' U;31}'b
6、修复数据库 bMZ0%(q
ALTER DATABASE [dvbbs] SET SINGLE_USER OjHBzrK
GO o.Q9kk?L
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK PQK_*hJG"
GO dx~Wm1
ALTER DATABASE [dvbbs] SET MULTI_USER gR+Z"]
GO ;?rW`e2
7、日志清除 Q*wx6Pu8
SET NOCOUNT ON %bsdC0xM
DECLARE @LogicalFileName sysname, sk5\"jna
@MaxMinutes INT, I4*N
@NewSize INT ^Iz.O
USE tablename -- 要操作的数据库名 sw&Qks?V
SELECT @LogicalFileName = 'tablename_log', -- 日志文件名 v6GWD}HH,
@MaxMinutes = 10, -- Limit on time allowed to wrap log. Zj JD@,j
@NewSize = 1 -- 你想设定的日志文件的大小(M) %F7aFvl*
-- Setup / initialize ^ey\ c1K
DECLARE @OriginalSize int m} V,+E
SELECT @OriginalSize = size o^ 4+eE
FROM sysfiles Kq*^*vWC
WHERE name = @LogicalFileName aH6pys!O
SELECT 'Original Size of ' + db_name() + ' LOG is ' + Mf
*qr9*
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + c]9OP9F
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' 1v Thb
FROM sysfiles &qr7yyY
WHERE name = @LogicalFileName oH;Y} h
CREATE TABLE DummyTrans #\jPBLc
(DummyColumn char (8000) not null) H0Tt(:.&
DECLARE @Counter INT, T&c[m!}X|t
@StartTime DATETIME, 7+c@pEU]
@TruncLog VARCHAR(255) r'8e"pTi
SELECT @StartTime = GETDATE(), PyoLk
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' 4e:hKv,+4
DBCC SHRINKFILE (@LogicalFileName, @NewSize) qUo(hbp
EXEC (@TruncLog) @f$P*_G
-- Wrap the log if necessary. 2vwT8/
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired QhZ%<zN
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName) #8`G&S*
AND (@OriginalSize * 8 /1024) > @NewSize LKm5U6
BEGIN -- Outer loop. BP7_o63/G
SELECT @Counter = 0 Pa.!:N-
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) ^'h~#7s
BEGIN -- update -{<%Wt9
INSERT DummyTrans VALUES ('Fill Log') B)(A#&nrb
DELETE DummyTrans 7}*5Mir p
SELECT @Counter = @Counter + 1 C?|gf?1p
END >!$4nxq2>
EXEC (@TruncLog) 3drgB;:g`
END Y5;:jYk#<_
SELECT 'Final Size of ' + db_name() + ' LOG is ' + +V) (,f1
CONVERT(VARCHAR(30),size) + ' 8K pages or ' + QW!'A`*x
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' y0Tb/&xN
FROM sysfiles >?kt3.IQ!X
WHERE name = @LogicalFileName qjWgyhL
DROP TABLE DummyTrans JmBYD[h,
SET NOCOUNT OFF *)w
8fq
8、说明:更改某个表 h$k(|/+
exec sp_changeobjectowner 'tablename','dbo' T7,tJk,(
9、存储更改全部表 ^a(q7ZfY
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch u]}Xq{ZN
@OldOwner as NVARCHAR(128), |9g*rO
@NewOwner as NVARCHAR(128) U3Q'ZT
AS )yK!EK\
DECLARE @Name as NVARCHAR(128) Wc)^@f[~<
DECLARE @Owner as NVARCHAR(128) DJ\lvT#j
DECLARE @OwnerName as NVARCHAR(128) ~(^[TuJC
DECLARE curObject CURSOR FOR YziQU_
select 'Name' = name, cx$Oh`-Car
'Owner' = user_name(uid) vb%\q sf
from sysobjects .v;Npm2
where user_name(uid)=@OldOwner .-r
1.'.A
order by name "ZH1W9A
OPEN curObject =gj]R
FETCH NEXT FROM curObject INTO @Name, @Owner )FB)ZK ;
WHILE(@@FETCH_STATUS=0) t512]eqhb(
BEGIN T^79p$
if @Owner=@OldOwner aw,8'N)
begin B1GSZUd^?0
set @OwnerName = @OldOwner + '.' + rtrim(@Name) $Fo ,$
exec sp_changeobjectowner @OwnerName, @NewOwner iX,Qh2(ig
end vEb~QX0~
-- select @name,@NewOwner,@OldOwner eBP
N[V
FETCH NEXT FROM curObject INTO @Name, @Owner o(a*Fk$
END :ortyCB:H
close curObject (cMrEuv
deallocate curObject ^c2 8Q.<w(
GO ]s<Q-/X
10、SQL SERVER中直接循环写入数据 fN&O `T>
declare @i int ?{FxbDp>
set @i=1 UVUHLu|^
while @i<30 `0so)2ty+
begin # ><.zZ
insert into test (userid) values(@i) Ao,lEjN I
set @i=@i+1 {!,+C0
end L'c4i[~s
小记存储过程中经常用到的本周,本月,本年函数 &
z?y
Dateadd(wk,datediff(wk,0,getdate()),-1) { u;ntDr
Dateadd(wk,datediff(wk,0,getdate()),6) 3(CUC
Dateadd(mm,datediff(mm,0,getdate()),0) V9MA)If>
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0)) <uAqb Wu
Dateadd(yy,datediff(yy,0,getdate()),0) UgUW4x'+
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) 4iKT
上面的SQL代码只是一个时间段 co;2s-X
Dateadd(wk,datediff(wk,0,getdate()),-1) \=QG6&_
Dateadd(wk,datediff(wk,0,getdate()),6) h rZ\ O?j
就是表示本周时间段. Qdtfi1_Y1
下面的SQL的条件部分,就是查询时间段在本周范围内的: $k!t&G
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6) Zw }7vD0
而在存储过程中 ld3,)ZY
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1) *zmbo >{(
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6) 2;q6~Y,