SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。 6Q4X6U:WB
wmNHT _
:WGtR\tK
一、基础 TG48%L
1、说明:创建数据库 v4Zb?
Yb
CREATE DATABASE database-name MOn,Db$
2、说明:删除数据库 6[qA`x#
drop database dbname >$67 7
3、说明:备份sql server >t,M
--- 创建 备份数据的 device >!e<}84b
USE master c97{Pu
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' uaw~r2
--- 开始 备份 o!TQk{0
BACKUP DATABASE pubs TO testBack dCYCHHHF
4、说明:创建新表 Zt
-1h{7
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) + Y.1)i}
根据已有的表创建新表: h[KvhbD3
A:create table tab_new like tab_old (使用旧表创建新表) 7T``-:`[
B:create table tab_new as select col1,col2... from tab_old definition only }/dRU${!
5、说明:删除新表 zo{/'BnU
drop table tabname Agh`]XQ2
6、说明:增加一个列 t9gfU5?
Alter table tabname add column col type HysS_/t~
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 }TRAw#h
7、说明:添加主键: Alter table tabname add primary key(col) F~#zxwd
说明:删除主键: Alter table tabname drop primary key(col) 6dH }]~a
8、说明:创建索引:create [unique] index idxname on tabname(col....) h!@|RW&}qX
删除索引:drop index idxname <^.=>Q0S\
注:索引是不可更改的,想更改必须删除重新建。 }_tl n
9、说明:创建视图:create view viewname as select statement `cz2DR-"
删除视图:drop view viewname SEwku}
10、说明:几个简单的基本的sql语句 c'6g*%2k
选择:select * from table1 where 范围 "eWk#/
插入:insert into table1(field1,field2) values(value1,value2) m ~#!
删除:delete from table1 where 范围 p?[Tm*r
更新:update table1 set field1=value1 where 范围 .JX EK
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料! `=+^|Y}
排序:select * from table1 order by field1,field2 [desc] \?>Hu
v
总数:select count as totalcount from table1 bUV >^d
求和:select sum(field1) as sumvalue from table1 z't??6
平均:select avg(field1) as avgvalue from table1 CHd9l]Rbe
最大:select max(field1) as maxvalue from table1 ,H}_%}10
最小:select min(field1) as minvalue from table1 *,C(\!b
!?
M}:=zcZ l
HD,xY4q&N
y4Z&@,_{
11、说明:几个高级查询运算词 !IU.a90V
eg<bi@C1|
a)Q!'$"'
A: UNION 运算符 ]Y6cwZOe
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 D.D$#O_n.S
B: EXCEPT 运算符 jdKOb
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 ,y4I[[
C: INTERSECT 运算符 65z"
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 !Bz0^1,L
注:使用运算词的几个查询结果行必须是一致的。 1XG!$4DW
12、说明:使用外连接 .iCDXc{#
A、left outer join: )}Q(Tl\$
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 n%h^o
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 Er/bO
B:right outer join: 4%WzIzRb
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 kK8itO
C:full outer join: -?]W*f
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 yJuQ8+vgR}
r|4t aV&
T|&[7%F3"
二、提升 jF`BjxrG
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) _'4A|-9
法一:select * into b from a where 1<>1 Q
4CjA3
法二:select top 0 * into b from a T0)4v-EO
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) ) 9,
insert into b(a, b, c) select d,e,f from b; yx V:!gl
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) ntNI]~z&
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件 (R`B'OtGg
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. <Q|d&vDVfV
4、说明:子查询(表名1:a 表名2:b) [m^+,%m5]
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) Pxn,Qw*
5、说明:显示文章、提交人和最后回复时间 u3Gjg{-N7
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b +cb6??H
6、说明:外连接查询(表名1:a 表名2:b) 0$r^C6}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 :Hxv6
7、说明:在线视图查询(表名1:a ) .^J2.>.
select * from (SELECT a,b,c FROM a) T where t.a > 1; MX>[^}n
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 `1 :{0p2q
select * from table1 where time between time1 and time2 c1X1+b,
select a,b,c, from table1 where a not between 数值1 and 数值2 $mF_,|
9、说明:in 的使用方法 t6v/sZ{F
select * from table1 where a [not] in ('值1','值2','值4','值6') ]v+31vdf:O
10、说明:两张关联表,删除主表中已经在副表中没有的信息 XMG]Wf^%\<
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) \uss Uv
11、说明:四表联查问题: HF|oBX$_
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 ..... R_=6GZH$G
12、说明:日程安排提前五分钟提醒 zB yqD$
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 -i-? .:
13、说明:一条sql 语句搞定数据库分页 "
RxP^l
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 0!v->Dk
14、说明:前10条记录 p~LrPWHSTP
select top 10 * form table1 where 范围 n~VD uKn9
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) <nEi<iAY>U
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) G
"P4-
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 s+tGFjq
(select a from tableA ) except (select a from tableB) except (select a from tableC) OtFh,}E
17、说明:随机取出10条数据 zbJT&@z
select top 10 * from tablename order by newid() &/,|+U[
18、说明:随机选择记录 \9-"M;R.d
select newid() !!Z?[rj
19、说明:删除重复记录 dz Zb
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) @k&qb!Qah
20、说明:列出数据库里所有的表名 GfC5z n>
select name from sysobjects where type='U' =B.F;40
21、说明:列出表里的所有的 j65<8svl
select name from syscolumns where id=object_id('TableName') }@.|?2b +
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 FLEo*9u>b
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 ||yzt!n
显示结果: J90v!p-
type vender pcs 7gRgOzWfV
电脑 A 1 #Fyuf,hw4
电脑 A 1 LR"9D
光盘 B 2 YuB+k^
光盘 A 2 Ar~"R4!
手机 B 3 HaIM#R32T
手机 C 3 L5MzLE&~
23、说明:初始化表table1 sVex
(X
TRUNCATE TABLE table1 b86}% FM
24、说明:选择从10到15的记录 JU&+c6>
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc vm>b m
# W"=ry3{
?6'rBH/w
HV<Lf
6gE
三、技巧 1'?4m0W1
1、1=1,1=2的使用,在SQL语句组合时用的较多 R:B^
"where 1=1" 是表示选择全部 "where 1=2"全部不选, _UuC,Pl3
如: `-LGU7~+
if @strWhere !='' Hc`A3SMR
begin Bj7gQ%>H4
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere v0L\0&+
end &c1A*Pl/:G
else =hl }.p
begin v$^Z6>vVI
set @strSQL = 'select count(*) as Total from [' + @tblName + ']' gCyW Vp
end {T].]7Z
我们可以直接写成 +
nF'a(
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere G8Du~h!!U
2、收缩数据库 oY, %Iq
--重建索引 Nz)l<S9>
DBCC REINDEX u{L!n$D7
DBCC INDEXDEFRAG <_Q1k>
--收缩数据和日志 d^`?ed\1
DBCC SHRINKDB %j7XEh<'
DBCC SHRINKFILE @V!r"Bkg.
3、压缩数据库 bV"G~3COy
dbcc shrinkdatabase(dbname) p)+k=b
4、转移数据库给新用户以已存在用户权限 n0is\ZK 0
exec sp_change_users_login 'update_one','newname','oldname' m)oJFF
go [n}T|<
5、检查备份集 4WK3.6GN
RESTORE VERIFYONLY from disk='E:\dvbbs.bak' {5
sO
6、修复数据库 $q 2D+_
ALTER DATABASE [dvbbs] SET SINGLE_USER &4_qF^9J
GO CD8}I85K
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK mx=BD'
GO vhhC>
7
ALTER DATABASE [dvbbs] SET MULTI_USER
Tgl}
GO A<ynIs<
7、日志清除 G$sA`<<
SET NOCOUNT ON 71l%MH
DECLARE @LogicalFileName sysname, TiH)5
@MaxMinutes INT, b5^OQH{v
@NewSize INT )5
R=Z<
USE tablename -- 要操作的数据库名 k?7 X3/O
SELECT @LogicalFileName = 'tablename_log', -- 日志文件名 )rixMl &[
@MaxMinutes = 10, -- Limit on time allowed to wrap log. edPUG
N
@NewSize = 1 -- 你想设定的日志文件的大小(M) IY*EA4>
-- Setup / initialize B-r0"MX&
DECLARE @OriginalSize int M>/Zbnq
SELECT @OriginalSize = size aCL!]4K84$
FROM sysfiles jq!tT%o*B
WHERE name = @LogicalFileName 4
uQT5
SELECT 'Original Size of ' + db_name() + ' LOG is ' + YX#-nyK
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + I"`M@ %
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' 9VbOQ {8
FROM sysfiles {`w;39$+
WHERE name = @LogicalFileName t2"FXTAq
CREATE TABLE DummyTrans y a_<^O
9
(DummyColumn char (8000) not null) nqf,4MR
DECLARE @Counter INT, Ox@P6|m
@StartTime DATETIME, ^I+)o1%F
@TruncLog VARCHAR(255) >
%KuNy{
SELECT @StartTime = GETDATE(), +}a ]GTBgA
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' {*ob_oc
DBCC SHRINKFILE (@LogicalFileName, @NewSize) znHnVYll(
EXEC (@TruncLog) Y5j]Z^^v
-- Wrap the log if necessary. xL" |)A =
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired I&YSQK:b
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName) :GJ &_YHf
AND (@OriginalSize * 8 /1024) > @NewSize F,'exuZ
BEGIN -- Outer loop. b3VS\[p
SELECT @Counter = 0 -neKuj
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) uAWM\?
BEGIN -- update =xS+5(
INSERT DummyTrans VALUES ('Fill Log') hh[jN7K
DELETE DummyTrans x@Hc@R<!
SELECT @Counter = @Counter + 1 )[Yv?>ib
END 2r ZxSg
EXEC (@TruncLog) ,tg0L$qC
END {+@bZ}57
SELECT 'Final Size of ' + db_name() + ' LOG is ' + 9rA=pH%<>B
CONVERT(VARCHAR(30),size) + ' 8K pages or ' + 1u9LdkhnY
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' p"U,G
-_
FROM sysfiles yR\btx|e5~
WHERE name = @LogicalFileName zi3\63D3eO
DROP TABLE DummyTrans Kx%Sku<F'
SET NOCOUNT OFF 2j&AiD
8、说明:更改某个表 cSm%s
exec sp_changeobjectowner 'tablename','dbo' B9J&=6`)
9、存储更改全部表 ;"m ,:5%
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch Xp}Yw"7
@OldOwner as NVARCHAR(128), )=etG
@NewOwner as NVARCHAR(128) 6w@ Ii;
AS /QJ?bD#a
DECLARE @Name as NVARCHAR(128) ~B(6+~%
DECLARE @Owner as NVARCHAR(128) &kpwo )
DECLARE @OwnerName as NVARCHAR(128) STaA]i}P
DECLARE curObject CURSOR FOR J:\|Nc?
select 'Name' = name, [r[=W!
'Owner' = user_name(uid) -bU oCF0
from sysobjects 9*(aUz9j
where user_name(uid)=@OldOwner |*0<M(YXN
order by name Ho
*AAg
OPEN curObject f-71~
FETCH NEXT FROM curObject INTO @Name, @Owner *~x/=.}
WHILE(@@FETCH_STATUS=0) 0/oyf]HR
BEGIN 9,"L^W8"k
if @Owner=@OldOwner ,11H.E
Z
begin *C:|X b<9
set @OwnerName = @OldOwner + '.' + rtrim(@Name) +PuPO9jKO@
exec sp_changeobjectowner @OwnerName, @NewOwner #&7}-"Nd
end 2m2;t0
-- select @name,@NewOwner,@OldOwner =7o"u3hG
FETCH NEXT FROM curObject INTO @Name, @Owner ?%y?rk <
END )
v,:N.@Q
close curObject o+$7'+y1n-
deallocate curObject Ht4;5?/y
GO 5kz)5,KjM
10、SQL SERVER中直接循环写入数据 ,c)uX#1
declare @i int 4%3Mb-#Y]
set @i=1 QhK#Y{xY
while @i<30 u5%7}<nNi
begin 5EfS^MRf\n
insert into test (userid) values(@i) G@Z?&"
set @i=@i+1
7?%k7f
end v*[.a#1^
小记存储过程中经常用到的本周,本月,本年函数 AD<q%pu&H?
Dateadd(wk,datediff(wk,0,getdate()),-1) X<%Q"2hW
Dateadd(wk,datediff(wk,0,getdate()),6) mFZ?hOyP.
Dateadd(mm,datediff(mm,0,getdate()),0) ]V#M%0:Q82
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0)) 9^p;UA
Dateadd(yy,datediff(yy,0,getdate()),0) 8UVmv=T
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) ;IokThI
上面的SQL代码只是一个时间段 sK5r$Dbr
Dateadd(wk,datediff(wk,0,getdate()),-1) a)'5Nw9*
Dateadd(wk,datediff(wk,0,getdate()),6) %&Q$dzgb_
就是表示本周时间段. aWY
gR
下面的SQL的条件部分,就是查询时间段在本周范围内的: !!? Mw
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6) BFOq8}fX2
而在存储过程中 jE/AA!DC#
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1) }-sdov<<
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6) +qwjbA+