SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。 fxgPhnaC>
Y;dz,}re
T*8VDY7
一、基础 [YRz*5
1、说明:创建数据库 #|Y5,a,{
CREATE DATABASE database-name ][gq#Vx@
2、说明:删除数据库 3GaQk-
drop database dbname 2Nu=/tMN
3、说明:备份sql server "Gfh ,e
--- 创建 备份数据的 device 6}gls}[0{e
USE master 1L%CJ+Q#0i
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' ocqU=^ta
--- 开始 备份 g`{;(/M+
BACKUP DATABASE pubs TO testBack 8{wwd:6
4、说明:创建新表 kw>v:F<M
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) W]"zctE
根据已有的表创建新表: Tzt8h\Q^z
A:create table tab_new like tab_old (使用旧表创建新表) )M,OfXa
B:create table tab_new as select col1,col2... from tab_old definition only c(3~0Yr
5、说明:删除新表 &oP+$;Y
drop table tabname 9TgIB
6、说明:增加一个列 'DY`jVwa
Alter table tabname add column col type (Mo*^pVr
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 KSbKEA
7、说明:添加主键: Alter table tabname add primary key(col) y6ECdVF
说明:删除主键: Alter table tabname drop primary key(col) y?[ v=j*U
8、说明:创建索引:create [unique] index idxname on tabname(col....) 7]U"Z*
删除索引:drop index idxname nF54tR[
注:索引是不可更改的,想更改必须删除重新建。 54gBJEhg
9、说明:创建视图:create view viewname as select statement 1Ce@*XBU
删除视图:drop view viewname yQ_B)b
10、说明:几个简单的基本的sql语句 H7z,j}l
选择:select * from table1 where 范围 )JDs\fUE
插入:insert into table1(field1,field2) values(value1,value2) 9A/\h3HrJ
删除:delete from table1 where 范围 ,V,`Jf
更新:update table1 set field1=value1 where 范围 ^!<U_;+
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料! l7XUXbYp&=
排序:select * from table1 order by field1,field2 [desc] !^^?dRd*v
总数:select count as totalcount from table1 ;;_,~pI?k
求和:select sum(field1) as sumvalue from table1 eV2W{vuI
平均:select avg(field1) as avgvalue from table1 TTeH`
最大:select max(field1) as maxvalue from table1 8;d:-Cp
最小:select min(field1) as minvalue from table1 {'XggI%
R?GDJ3
gQ o]
;\a
YlV-
11、说明:几个高级查询运算词 %7"q"A r[
TC@s
Ee)T1~;W
A: UNION 运算符 ]9YJ,d@J
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 $yn];0$J
B: EXCEPT 运算符 )<oJnxe]
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 J ][T"K
C: INTERSECT 运算符 q-
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 W^0w
注:使用运算词的几个查询结果行必须是一致的。 nim*/LC[:
12、说明:使用外连接 3p39`"~
A、left outer join: @KWb+?_H{<
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 H35S#+KX
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 9E
zj"
B:right outer join: j5K]CTz#
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 UR%/MV
C:full outer join: ?+_Gs;DGVE
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
txJr;
dU6ou'pf
Vu)4dD!
二、提升 |*oZ_gI
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) WB?jRYp
法一:select * into b from a where 1<>1 %j:]^vqFA
法二:select top 0 * into b from a aO]ZZleNS
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) ge,H-8'Z
insert into b(a, b, c) select d,e,f from b; 9*2[B"5
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) I~q#eO)
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件 y[`l3;u:'
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. _a5d?Q9Z
4、说明:子查询(表名1:a 表名2:b) yyoqX"v[
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) GS0;bI4ay
5、说明:显示文章、提交人和最后回复时间 o}$XH,-9&
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b aK&b{d
6、说明:外连接查询(表名1:a 表名2:b) W,4QzcQR
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c '= _/ 1F*q
7、说明:在线视图查询(表名1:a ) NiWa7 /Hr
select * from (SELECT a,b,c FROM a) T where t.a > 1; NMW#AZVd
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 kjW+QT?T&
select * from table1 where time between time1 and time2 ZO!I.
select a,b,c, from table1 where a not between 数值1 and 数值2 3
*d"B tg
9、说明:in 的使用方法 &%8'8,.
select * from table1 where a [not] in ('值1','值2','值4','值6') R%Qf7Q
10、说明:两张关联表,删除主表中已经在副表中没有的信息 M9Cv
wMi
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) ZW-yP2
11、说明:四表联查问题: ]=.\-K
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 ..... :j5n7s?&=y
12、说明:日程安排提前五分钟提醒 o4`hY/<t
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 0)%YNaskj
13、说明:一条sql 语句搞定数据库分页 C+?Hm1
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 1LqoF{S:
14、说明:前10条记录 6o
|kIBte-
select top 10 * form table1 where 范围 !,l9@eJQ
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) m#8m] Y
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) c|lu&}BS
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 @x9a?L.48
(select a from tableA ) except (select a from tableB) except (select a from tableC) 0Oi,#]F
17、说明:随机取出10条数据 `k=bL"T>\
select top 10 * from tablename order by newid() {FO;Yg'
18、说明:随机选择记录 E'v_#FLvR
select newid() {s)+R[?m<o
19、说明:删除重复记录 q`|LRz&al
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) G %N
$C
20、说明:列出数据库里所有的表名 stG~AC
select name from sysobjects where type='U' 8;z6=.4xtg
21、说明:列出表里的所有的 GT~)nC9f
select name from syscolumns where id=object_id('TableName') ZtV9&rd7
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 !zuxz
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 K)-U1JE7
显示结果: ln$&``L
type vender pcs /d0K7F
电脑 A 1 M8INk,si
电脑 A 1 4oK?-|=?
光盘 B 2 .clP#r{U
光盘 A 2 ~u)}ScTp
手机 B 3 ]p*l%(dhY
手机 C 3 _6_IP0;
23、说明:初始化表table1 T#M,~lD
TRUNCATE TABLE table1 $u7;TW6QD
24、说明:选择从10到15的记录 w ihH?~]
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc aY3^C q(r
1)9sf0LyU
?;KKw*
lwHzj&/ ~
三、技巧 &yGaCq;0
1、1=1,1=2的使用,在SQL语句组合时用的较多 $h^wG)s2P
"where 1=1" 是表示选择全部 "where 1=2"全部不选, ,^?^dB
如: |s)Rxq){"V
if @strWhere !='' 8
![|F:
begin ,O.3&Nz,c
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere CJ(NgYC h
end 0FGe=$vD
else Uh.oErHQD
begin HqI t74+
set @strSQL = 'select count(*) as Total from [' + @tblName + ']' 7]^M>#
end (>F%UY
我们可以直接写成 SLO%7%>p
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere ;+0t;B!V
2、收缩数据库 C2@,BCR
--重建索引 Ol1e/Wv
DBCC REINDEX `%CtWJ(e
DBCC INDEXDEFRAG =3|O%\
--收缩数据和日志 c05TsMF&O
DBCC SHRINKDB F\fWvXdW
DBCC SHRINKFILE 4/mig0"N.
3、压缩数据库 2}YOcnB
dbcc shrinkdatabase(dbname) aJYgzr,
4、转移数据库给新用户以已存在用户权限 z)'M k[
exec sp_change_users_login 'update_one','newname','oldname' "vXxv'0\f
go Tg!i%v(-t
5、检查备份集 W"):-Wq
RESTORE VERIFYONLY from disk='E:\dvbbs.bak' !O-T0O
6、修复数据库 W4hbK9y
ALTER DATABASE [dvbbs] SET SINGLE_USER Z&0'a
GO 8'~[pMn`
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK UjaK&K+M?
GO ="x\`+U
ALTER DATABASE [dvbbs] SET MULTI_USER e"/;7:J5\
GO O_$m!5ug
7、日志清除 zV:pQRbt.
SET NOCOUNT ON W4[V}s5u
DECLARE @LogicalFileName sysname, )A!>=2M`
@MaxMinutes INT, (EK"V';
@NewSize INT OC1I&",Ai|
USE tablename -- 要操作的数据库名 u1t%(_h
SELECT @LogicalFileName = 'tablename_log', -- 日志文件名 $SM#< @
@MaxMinutes = 10, -- Limit on time allowed to wrap log. $tz;<M7B
@NewSize = 1 -- 你想设定的日志文件的大小(M) r;>*_Oc7g
-- Setup / initialize $}lbT15a
DECLARE @OriginalSize int t>1Z\lE\"
SELECT @OriginalSize = size SfgU`eF%B
FROM sysfiles !
vP[;6
WHERE name = @LogicalFileName mu?Eco`~
SELECT 'Original Size of ' + db_name() + ' LOG is ' + )p
T?/J
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + rrQQZ5fh b
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' VS9`{
FROM sysfiles 3BB%Z6F
WHERE name = @LogicalFileName uIcn{RZ_z
CREATE TABLE DummyTrans A'G66ei
(DummyColumn char (8000) not null)
0dhF&*h|L
DECLARE @Counter INT, ktj]:rCkF
@StartTime DATETIME, Of{/t1o?
@TruncLog VARCHAR(255) KC(xb5x
Y
SELECT @StartTime = GETDATE(), NLS%S q
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' b`)){LR
DBCC SHRINKFILE (@LogicalFileName, @NewSize) m_=$0m J$
EXEC (@TruncLog) O<96/a'
-- Wrap the log if necessary. RRmLd/(
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired T?:glp[4I
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName) d@ Y}SWTB
AND (@OriginalSize * 8 /1024) > @NewSize ]04e1F1J
BEGIN -- Outer loop. QA2borfy
SELECT @Counter = 0 \cC%!4
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) I?"q/Ub~h
BEGIN -- update Ul2R'"FB
INSERT DummyTrans VALUES ('Fill Log') d*A*y ^OD
DELETE DummyTrans la( <8
SELECT @Counter = @Counter + 1 >y.%xK
END (WK&^,zQn
EXEC (@TruncLog) t<~ $
END D|rFu
SELECT 'Final Size of ' + db_name() + ' LOG is ' + Xv<B1
CONVERT(VARCHAR(30),size) + ' 8K pages or ' + uwa~-xX6
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' vJ\pR~?
FROM sysfiles 4AG\[f
8q
WHERE name = @LogicalFileName 43={Xy
DROP TABLE DummyTrans .u:81I=w(
SET NOCOUNT OFF r) $+
8、说明:更改某个表 *NkA8PC
exec sp_changeobjectowner 'tablename','dbo' [|P!{?A43|
9、存储更改全部表 A;/-u<f
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch vw>2(K=e1
@OldOwner as NVARCHAR(128),
Y^
kXSU
@NewOwner as NVARCHAR(128) vFE;D@bz:
AS v-yde>(
DECLARE @Name as NVARCHAR(128) }e2(T
DECLARE @Owner as NVARCHAR(128) PUo/J~ v
DECLARE @OwnerName as NVARCHAR(128) p3]_}Y
D[#
DECLARE curObject CURSOR FOR #+$G=pS'v
select 'Name' = name, xEf'Bmebk
'Owner' = user_name(uid) VYt!U
from sysobjects 0KMctPT]p
where user_name(uid)=@OldOwner 9Xl`pEhC
order by name y]J89
OPEN curObject Cl^\OZN\=
FETCH NEXT FROM curObject INTO @Name, @Owner 0{dz5gUde
WHILE(@@FETCH_STATUS=0) Lb;zBmwB
BEGIN N@O8\oQG
if @Owner=@OldOwner p"l3e9&'j
begin w"SoeU
set @OwnerName = @OldOwner + '.' + rtrim(@Name) YyTSyP4
exec sp_changeobjectowner @OwnerName, @NewOwner 9uRFnzJVx
end BT)X8>ct
-- select @name,@NewOwner,@OldOwner D[_| *9BC
FETCH NEXT FROM curObject INTO @Name, @Owner wD68tG$
END \[gReaI
close curObject slg ]#Dy
deallocate curObject HPb]Zj
GO Q3|T':l4
10、SQL SERVER中直接循环写入数据 GP&vLt51
declare @i int t5'V6nv
set @i=1 Nluv/?<
while @i<30 Gm9hYhC8
begin TF 'U
insert into test (userid) values(@i) yY[<0|o u
set @i=@i+1 JJ{9U(`_y6
end taFn![}/!g
小记存储过程中经常用到的本周,本月,本年函数 s<9RKfm
Dateadd(wk,datediff(wk,0,getdate()),-1) 5B&;uY
Dateadd(wk,datediff(wk,0,getdate()),6) C?i >.t
Dateadd(mm,datediff(mm,0,getdate()),0) O!Oumw,$
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0)) :um|nRwy9
Dateadd(yy,datediff(yy,0,getdate()),0) E2cB U{x
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) oS7(s
上面的SQL代码只是一个时间段 \3'9Uz,OC
Dateadd(wk,datediff(wk,0,getdate()),-1) aX~%5mF
Dateadd(wk,datediff(wk,0,getdate()),6) DyQM>xw)t
就是表示本周时间段. Wx~k&[&E
下面的SQL的条件部分,就是查询时间段在本周范围内的: <{2e#Y
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6) !-N6l6N
而在存储过程中 M/):e$S
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1) ?0YCpn
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6) x.3J[=z=>