SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。 45+%K@@x
\/*Nf?;
x9)aBB
一、基础 O b8B
1、说明:创建数据库 sCF40AoY&
CREATE DATABASE database-name Zgg'9E
2、说明:删除数据库
gmRT1T
drop database dbname Jh43)#G-
3、说明:备份sql server 2sqm7th
--- 创建 备份数据的 device bbNU\r5%
USE master ] dHB}
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' ^.D}k
--- 开始 备份 a;"Uz|rz
BACKUP DATABASE pubs TO testBack 1^L`)Up
4、说明:创建新表 \6lh `U
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) xEVLE,*?>
根据已有的表创建新表: ^KkRF":
A:create table tab_new like tab_old (使用旧表创建新表) 8VP"ydg-U
B:create table tab_new as select col1,col2... from tab_old definition only 7}?k^x,1
5、说明:删除新表 2f|6z-Z
drop table tabname 4O`6h)!NQ
6、说明:增加一个列 l801`~*gO
Alter table tabname add column col type cGE=.
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 Z6Nj<2u2
7、说明:添加主键: Alter table tabname add primary key(col)
(A29ZH
说明:删除主键: Alter table tabname drop primary key(col) -!J2x8Ri
8、说明:创建索引:create [unique] index idxname on tabname(col....) W}XYmF*_?
删除索引:drop index idxname `l>93A
注:索引是不可更改的,想更改必须删除重新建。 8M^wuRn
9、说明:创建视图:create view viewname as select statement F&QTL-pQW
删除视图:drop view viewname 3ar=1_Ar
10、说明:几个简单的基本的sql语句 K DYYB6|
选择:select * from table1 where 范围 {)V? R
插入:insert into table1(field1,field2) values(value1,value2) 4l&"]9D
删除:delete from table1 where 范围 gEv-> pc
更新:update table1 set field1=value1 where 范围 =n-z;/NL
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料! ohrw\<xsu
排序:select * from table1 order by field1,field2 [desc] &:V@2_6"
总数:select count as totalcount from table1 -B1YZ/.rz"
求和:select sum(field1) as sumvalue from table1 co5y"yj_
平均:select avg(field1) as avgvalue from table1 xfq]9<
最大:select max(field1) as maxvalue from table1 F#(.v7Za
最小:select min(field1) as minvalue from table1 ch@x]@-;A3
|JUe>E*
>dpbCPJ9[
Ag0]U
11、说明:几个高级查询运算词 ~ww?Emrw
lDW!Fg
$]@O/[
A: UNION 运算符 gbm0H-A:*
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 Tu]&^[B('
B: EXCEPT 运算符 Y4mC_4EU
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 `gBD_0<T7
C: INTERSECT 运算符 _QR
g7
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 8>UKIdp
注:使用运算词的几个查询结果行必须是一致的。 b5AGk
12、说明:使用外连接 F:%^&%\
A、left outer join: &*B>P>x
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 izCaB~{/
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 - $U@By<SJ
B:right outer join: mCM|&u
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 [2Iau1<@
C:full outer join: tbq|,"
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 Ko#4z%Yq
Lf
>YdD
4s9c#nVlu
二、提升 z|ves&lRa
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) cDCJ]iDs
法一:select * into b from a where 1<>1 ZP"yq6!i
法二:select top 0 * into b from a ]Ap`
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) 6wPeb~{
insert into b(a, b, c) select d,e,f from b; FbveI4
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) /H')~!Yz
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件 '/k^C9~m
r
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. Bg-VCJI<
4、说明:子查询(表名1:a 表名2:b) #c-b}.R
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) MDk*j,5V
5、说明:显示文章、提交人和最后回复时间
LI[ ?~P2\
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b JwZ?hc
6、说明:外连接查询(表名1:a 表名2:b) TfJL+a0
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c OCCEL9d
7、说明:在线视图查询(表名1:a ) EYG"49
c
select * from (SELECT a,b,c FROM a) T where t.a > 1; TMK'(6dH
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 tWm> j
select * from table1 where time between time1 and time2 J' W}7r
select a,b,c, from table1 where a not between 数值1 and 数值2 n!a<:]b<
9、说明:in 的使用方法 E*BSfn&i
select * from table1 where a [not] in ('值1','值2','值4','值6') 5O&d3;p'
10、说明:两张关联表,删除主表中已经在副表中没有的信息 [FGgkd}
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) Y;} 2'"
11、说明:四表联查问题: q0Xoj__c!A
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 ..... _z q)0\
12、说明:日程安排提前五分钟提醒 1!!\+
c2*
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 MU|{g
5/
)
13、说明:一条sql 语句搞定数据库分页 Ls]@icH0
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 r*chL&7
14、说明:前10条记录 i^WIr h3a
select top 10 * form table1 where 范围 lzEb5mg
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) W6vf=I@f
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
lWbZ=x_0
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 G]4OFz+
(select a from tableA ) except (select a from tableB) except (select a from tableC) q/$GE,"
17、说明:随机取出10条数据 \^LWCp,C"
select top 10 * from tablename order by newid() 1] j^d
18、说明:随机选择记录 > @+#
select newid() X(]Zr
19、说明:删除重复记录 !i^]UN
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) >V(zJ
20、说明:列出数据库里所有的表名 |Ab{H%
select name from sysobjects where type='U' ibXe"X/_
21、说明:列出表里的所有的 Txo@U
select name from syscolumns where id=object_id('TableName') c5("-xB
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 ~b Rd)1
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 [(|^O>k8c
显示结果: g5y;?fqJ
type vender pcs JkU1daTe
电脑 A 1 ~Q?!W0ZBE
电脑 A 1 n+HsQ]z.
光盘 B 2 <c+K3P'3?
光盘 A 2 X8b|]Nr
手机 B 3 [SkKz>rC
手机 C 3 jq(qo4~;
23、说明:初始化表table1 0 " y%9
TRUNCATE TABLE table1 # ORO&78
24、说明:选择从10到15的记录 Rn-G
@}f
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc 1}}>Un`U5,
dAL3. %
! RPb|1Y}+
&Yf",KcL*I
三、技巧 n_P3\Y|
1、1=1,1=2的使用,在SQL语句组合时用的较多 qaG# ;
"where 1=1" 是表示选择全部 "where 1=2"全部不选, f"Vgefk
如: A " S/^<
if @strWhere !=''
/ +1{
begin P]Xbjs<p
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere 1CkdpYjsj
end 1{Jb"
else F~6#LT
begin ^ S
set @strSQL = 'select count(*) as Total from [' + @tblName + ']' OQScW2a&
end Q`A6(y/s?
我们可以直接写成 2+.18"rvi
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere "Z T.k5Z
2、收缩数据库 _yv Luj
--重建索引 |CIC$2u
DBCC REINDEX f@@s1gdb
DBCC INDEXDEFRAG y\'P3ihK
--收缩数据和日志 #r<?v
DBCC SHRINKDB Y % Ieg.o
DBCC SHRINKFILE wAFW*rO5o
3、压缩数据库 v$Uhm</|19
dbcc shrinkdatabase(dbname) `ZMK9f:
4、转移数据库给新用户以已存在用户权限 u[")*\CP
exec sp_change_users_login 'update_one','newname','oldname' S@xXq{j
go Yp1bH+/u
5、检查备份集 gcf6\f}\<
RESTORE VERIFYONLY from disk='E:\dvbbs.bak' nWJ:=JQ i"
6、修复数据库 Tf x :"u
ALTER DATABASE [dvbbs] SET SINGLE_USER +@<KC
GO JYm7@gx
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK gsPl _
GO Hx2En:^Gf
ALTER DATABASE [dvbbs] SET MULTI_USER I%"'*7U
GO c#lPc>0xb
7、日志清除 -.iNNM&a
SET NOCOUNT ON vfw A$7N
DECLARE @LogicalFileName sysname, r&%.z*q
@MaxMinutes INT, lw[e*q{s.
@NewSize INT R-rCh.
USE tablename -- 要操作的数据库名 r?A|d.Tl
SELECT @LogicalFileName = 'tablename_log', -- 日志文件名 G[h(xp?,l
@MaxMinutes = 10, -- Limit on time allowed to wrap log. :!Ig- +W
@NewSize = 1 -- 你想设定的日志文件的大小(M) ]|U-y645
-- Setup / initialize ECcZz.
DECLARE @OriginalSize int {v` 2sB
SELECT @OriginalSize = size bk<FL6z
z
FROM sysfiles p'f%%#I
WHERE name = @LogicalFileName % /}WUP^H
SELECT 'Original Size of ' + db_name() + ' LOG is ' + B$vr'U
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + #yW\5)
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' VK:8 Nk_y
FROM sysfiles AIRr{Y
WHERE name = @LogicalFileName 1J}8sG2`
CREATE TABLE DummyTrans y(a!YicA?
(DummyColumn char (8000) not null) QI}E4-s8
DECLARE @Counter INT, U#
JIs
@StartTime DATETIME, ~AZWds(,N
@TruncLog VARCHAR(255) nfdq y)
SELECT @StartTime = GETDATE(), 2i7e#
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' 8)yI<`q6
DBCC SHRINKFILE (@LogicalFileName, @NewSize) @Uo6>-WF
EXEC (@TruncLog) kKiA
-- Wrap the log if necessary. tX%`#hb?s
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired k?6z_vu
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName) feX^~gM
AND (@OriginalSize * 8 /1024) > @NewSize z@Hp,|Vy[
BEGIN -- Outer loop. [/ M`
SELECT @Counter = 0 j_cs;G: "
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) U@F)2?
BEGIN -- update z[EFQ^*>
INSERT DummyTrans VALUES ('Fill Log') yT8=l"-[G
DELETE DummyTrans +jP~s
SELECT @Counter = @Counter + 1 O+~ 7l?o
END 'ZP)cI:+X
EXEC (@TruncLog) =ll=)"O
END EU-]sTJLF
SELECT 'Final Size of ' + db_name() + ' LOG is ' + ~9\zWRh
CONVERT(VARCHAR(30),size) + ' 8K pages or ' + RA O`i>@
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' +iO/m
FROM sysfiles !>z:m!MlQ
WHERE name = @LogicalFileName %rkk>m
DROP TABLE DummyTrans mXzrEI
SET NOCOUNT OFF %Ym^{N
8、说明:更改某个表 o<i,*y88
exec sp_changeobjectowner 'tablename','dbo' fc_2D|
9、存储更改全部表 XORk!m|
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch 51BlM%
@OldOwner as NVARCHAR(128), H1EDMhn/
@NewOwner as NVARCHAR(128) *|#T8t,}n
AS G?c-79]U
DECLARE @Name as NVARCHAR(128) "xJ 0 vlw
DECLARE @Owner as NVARCHAR(128) %9v@0}5V
DECLARE @OwnerName as NVARCHAR(128) >vbY<HGt
DECLARE curObject CURSOR FOR #z'uRHx%=0
select 'Name' = name, S9| a$3K'
'Owner' = user_name(uid) 6Jz^
from sysobjects LiQgR
6j
where user_name(uid)=@OldOwner I5m][~6.?
order by name SHVWwoieT
OPEN curObject ;gg\;i}^
FETCH NEXT FROM curObject INTO @Name, @Owner 13hE}g;.
WHILE(@@FETCH_STATUS=0) BB$oq'
BEGIN ?sz)J3
if @Owner=@OldOwner lfZ04M{2
begin gB'fFkd
set @OwnerName = @OldOwner + '.' + rtrim(@Name) 5ETip'<KT6
exec sp_changeobjectowner @OwnerName, @NewOwner @`36ku
end 4qi[r)G
-- select @name,@NewOwner,@OldOwner _aWl]I){5
FETCH NEXT FROM curObject INTO @Name, @Owner ;)AfB#:d
END 6uPcXd:8ZR
close curObject 5ExDB6Bx@y
deallocate curObject q.YfC
GO ~]C%/gEh
10、SQL SERVER中直接循环写入数据 x#.C4O09
declare @i int Q Fm|-j
set @i=1 b</9Ai=
while @i<30 NB_)ZEmF
begin <^?1uzxH8A
insert into test (userid) values(@i) @=jWHS
set @i=@i+1 _PFnh)o
end 2i{cQ96
小记存储过程中经常用到的本周,本月,本年函数 ) 0 W`
Dateadd(wk,datediff(wk,0,getdate()),-1) aUHcYc\u
Dateadd(wk,datediff(wk,0,getdate()),6) `Z"Q^
Dateadd(mm,datediff(mm,0,getdate()),0) ~@ jY[_
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0)) 7JJ/D4uT
Dateadd(yy,datediff(yy,0,getdate()),0) WI> P-D
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) `o]g~AKX
上面的SQL代码只是一个时间段 C'yppl%
Dateadd(wk,datediff(wk,0,getdate()),-1) nrm+z"7
Dateadd(wk,datediff(wk,0,getdate()),6) j^tW
Iz
就是表示本周时间段. 39wa|:I
下面的SQL的条件部分,就是查询时间段在本周范围内的: Vwk #qgnX
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6) L"jY+{oLIJ
而在存储过程中 B.r4$:+jb2
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1) ($w@Z/;
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6) ~Nf})U