SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。 AXs=1 e
ZWO)tVw9G
pz{'1\_+9
一、基础 )zU:
1、说明:创建数据库 ]*qU+&
CREATE DATABASE database-name axmsrjW#
2、说明:删除数据库 7paUpQit
drop database dbname EIr@g
3、说明:备份sql server (
#*"c
--- 创建 备份数据的 device ._?V%/
USE master GcT;e5D
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' SxJ$b
--- 开始 备份 l3.
BACKUP DATABASE pubs TO testBack iv*V#J>
4、说明:创建新表 .}q]`<]ze
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) ;f:gX`"\
根据已有的表创建新表: ^i+[m
A:create table tab_new like tab_old (使用旧表创建新表) F$Hx`hoy
B:create table tab_new as select col1,col2... from tab_old definition only }Dn^d}?s||
5、说明:删除新表 i31<].|kA*
drop table tabname Us,)]W.S
6、说明:增加一个列 =!BobC- [b
Alter table tabname add column col type afHaB/t{R
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 ks*Y9D*=
7、说明:添加主键: Alter table tabname add primary key(col) q*,Q5
说明:删除主键: Alter table tabname drop primary key(col) u)a'
8、说明:创建索引:create [unique] index idxname on tabname(col....) ,>n%
~'gb
删除索引:drop index idxname 5Fmav5
注:索引是不可更改的,想更改必须删除重新建。 8TE>IPjm
9、说明:创建视图:create view viewname as select statement v?%LQKO
删除视图:drop view viewname ]IZ>2!6r
10、说明:几个简单的基本的sql语句 ?s?$d&h
选择:select * from table1 where 范围 =7%oE[
插入:insert into table1(field1,field2) values(value1,value2) P ZxFZvE
删除:delete from table1 where 范围 ]ab#q=
更新:update table1 set field1=value1 where 范围 Ha%F"V*
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料! MPIlSMe
排序:select * from table1 order by field1,field2 [desc] 7\ypW $Ot
总数:select count as totalcount from table1 PY`L$e
求和:select sum(field1) as sumvalue from table1 1svi8wh
平均:select avg(field1) as avgvalue from table1 UL(
lf}M
最大:select max(field1) as maxvalue from table1 <xo-Fv
最小:select min(field1) as minvalue from table1 6BocGo({
tu0aD%C
\}5p0.=
e4`uVq5
11、说明:几个高级查询运算词 d;7uFh|o
m}3gZu]
s
=Umj'1k
A: UNION 运算符 BQ/PGY>
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 Md,pDWb
B: EXCEPT 运算符 v.=/Y(J
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 maNW{"1
C: INTERSECT 运算符 %g3,qI
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 DWU`\9xA*
注:使用运算词的几个查询结果行必须是一致的。 ffe1lw%
12、说明:使用外连接 j}:~5 |.
A、left outer join: :K':P5i
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 =8Ehrlq
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 D)Q)NI
B:right outer join:
fvEAIs
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 nwA8ALhE
C:full outer join: @F~LW6K
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 ^e Gue
jZpa0g rA
9zBMlc$X
二、提升 1[;;sSp
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) usFfMF X
法一:select * into b from a where 1<>1 F%d\~Vj
法二:select top 0 * into b from a ua5?(,E`']
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) a|4~NL
insert into b(a, b, c) select d,e,f from b; C3'rtY.
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) R@iUCT^$
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件 +GF#?X0^
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. 'zZcn" +!
4、说明:子查询(表名1:a 表名2:b) $w#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) #!2k<Q*5uT
5、说明:显示文章、提交人和最后回复时间 G8Z 4J7^
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b i3VW1~ .8
6、说明:外连接查询(表名1:a 表名2:b) Km#pX1]>e
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c *\uM.m0$
7、说明:在线视图查询(表名1:a ) K_/zuTy
select * from (SELECT a,b,c FROM a) T where t.a > 1; EW<kI+0D
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 ObG|o1b
select * from table1 where time between time1 and time2 A"v{~
select a,b,c, from table1 where a not between 数值1 and 数值2 Q=uR Kh
9、说明:in 的使用方法 T ?Fcohz(
select * from table1 where a [not] in ('值1','值2','值4','值6') S4CbyXW
10、说明:两张关联表,删除主表中已经在副表中没有的信息 ln!'_\{
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) crcA\lJf
11、说明:四表联查问题: ])DX%$f
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 ..... CO:u1?
12、说明:日程安排提前五分钟提醒 2@=IT0[E\
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 q.#[TI ^
13、说明:一条sql 语句搞定数据库分页 ccFn.($p?,
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 .w?(NZ2~
14、说明:前10条记录 @}-r&/#
select top 10 * form table1 where 范围 ->^~KVh&
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) N|g;W
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) \2 y5_;O
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 kq=V4-a[
(select a from tableA ) except (select a from tableB) except (select a from tableC) FQz?3w&ia
17、说明:随机取出10条数据 Kl{>jr8B3
select top 10 * from tablename order by newid() zSEs?
18、说明:随机选择记录 )D&M2CUw"f
select newid() cO2& VC
19、说明:删除重复记录 !4"^`ors$
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) 4+;$7"fJ
20、说明:列出数据库里所有的表名 :O<bA&:d
select name from sysobjects where type='U' x%+{VStA
21、说明:列出表里的所有的 LhXUm
select name from syscolumns where id=object_id('TableName') l v&mp0V+
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 @Ky> 9m{
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 *l+OlQI0+
显示结果: B/JO~;{
type vender pcs
-t2T(ha
电脑 A 1 "9EE1];NT
电脑 A 1 *OJ/V O
光盘 B 2 -|k)tvAm
光盘 A 2 Kv'n:z7Md
手机 B 3 qBV x6MI
手机 C 3 $rF=_D6
23、说明:初始化表table1 6lwta`2
TRUNCATE TABLE table1 "gtHTqheH
24、说明:选择从10到15的记录 F~:O.$f]G
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc VV4Gjc
H=*5ASc
\0l>q ,
3A:q7#m
三、技巧 n% 'tKU\q
1、1=1,1=2的使用,在SQL语句组合时用的较多 Ji1Pz)fq
"where 1=1" 是表示选择全部 "where 1=2"全部不选, QxuhGA
如: >d"3<S ;b
if @strWhere !='' G+xt5n.%
begin X"gCRn%tn
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere EN{]Qb06A
end ^D^4
YJz
else W?yd#j
begin ?Xdak|?i
set @strSQL = 'select count(*) as Total from [' + @tblName + ']' LMi:%i%\
end
~>O)
我们可以直接写成 iovfo2!hD
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere Zwcy4>8
2、收缩数据库 2!&&|Mh}
--重建索引 /525w^'pd
DBCC REINDEX
Ol"3a|
DBCC INDEXDEFRAG CT0l!J~5m~
--收缩数据和日志 J"=1/,AS
DBCC SHRINKDB ,B4VT 96*
DBCC SHRINKFILE -jgysBw+Xb
3、压缩数据库 l4n)#?Q?
dbcc shrinkdatabase(dbname) h)~=Dm
4、转移数据库给新用户以已存在用户权限 5@*'2rO&!
exec sp_change_users_login 'update_one','newname','oldname' yC
77c=
go K{n{KB&_&
5、检查备份集 #;n+YM">:
RESTORE VERIFYONLY from disk='E:\dvbbs.bak' G?f\>QSZ
6、修复数据库 q$1PG+-
ALTER DATABASE [dvbbs] SET SINGLE_USER Z_\C*^
GO ?JL7=o
X
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK J=.`wZQkS
GO ^pn(=4
ALTER DATABASE [dvbbs] SET MULTI_USER tiN?/
GO b:qY gg
7、日志清除 ^[%%r3"$C
SET NOCOUNT ON V8eB$in
DECLARE @LogicalFileName sysname, S'oGt&Z<
@MaxMinutes INT, Z/rP"|EuQ
@NewSize INT 1B),A~Ip
USE tablename -- 要操作的数据库名 Ii7QJ:^
SELECT @LogicalFileName = 'tablename_log', -- 日志文件名 y_xnai
@MaxMinutes = 10, -- Limit on time allowed to wrap log. aP'"G^F
@NewSize = 1 -- 你想设定的日志文件的大小(M) 0]D0{6x8
-- Setup / initialize 8|E'>+ D_-
DECLARE @OriginalSize int K)TrZ 2
SELECT @OriginalSize = size *'ZB*>
FROM sysfiles Z3[S]jC
WHERE name = @LogicalFileName zP6.xp3
SELECT 'Original Size of ' + db_name() + ' LOG is ' + Vh}SCUof'
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + Sq:0w
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' iC
iZJ"
FROM sysfiles JdZ+Hp3.
WHERE name = @LogicalFileName GUsl PnG
CREATE TABLE DummyTrans 6<K6Y5<6
(DummyColumn char (8000) not null) iH^z:%dP
DECLARE @Counter INT, eNiaM6(J
@StartTime DATETIME, [r/k% <
@TruncLog VARCHAR(255) 29XL$v],
SELECT @StartTime = GETDATE(), Kx_h1{
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' r\nx=
DBCC SHRINKFILE (@LogicalFileName, @NewSize) fDx9iHGv
EXEC (@TruncLog) 5k|9gICyd*
-- Wrap the log if necessary. i-yy/y-N
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired @
P|LLG'
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName) OFje+S
AND (@OriginalSize * 8 /1024) > @NewSize 1Bxmm#
BEGIN -- Outer loop. r!
Ay:r
SELECT @Counter = 0 Y.^=]-n,
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) dMR3)CO
BEGIN -- update lI>SUsQFfm
INSERT DummyTrans VALUES ('Fill Log') a<]B B$~
DELETE DummyTrans g/13~UM\
SELECT @Counter = @Counter + 1 I(=V}s2
END QRLt9L
EXEC (@TruncLog) OT'[:|x ;
END C"IKt
SELECT 'Final Size of ' + db_name() + ' LOG is ' + |lv|!]qAma
CONVERT(VARCHAR(30),size) + ' 8K pages or ' + XD"_Iq!
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' d#2$!z#
FROM sysfiles ')GSAY7
WHERE name = @LogicalFileName .f+TZDUO
DROP TABLE DummyTrans )E+'*e{cK
SET NOCOUNT OFF %'0TXr$
8、说明:更改某个表 1>L(ul(qGF
exec sp_changeobjectowner 'tablename','dbo' 4Vq%N
9、存储更改全部表 ,^icPQSwc
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch 6"dD2WV/
@OldOwner as NVARCHAR(128), klUQkz |<a
@NewOwner as NVARCHAR(128) eW|^tH
AS %4HRW;IU
DECLARE @Name as NVARCHAR(128) Z4IgBn(Z_}
DECLARE @Owner as NVARCHAR(128) NWxUn.Gy9
DECLARE @OwnerName as NVARCHAR(128) aZbw]0q@o
DECLARE curObject CURSOR FOR l3 DYg
select 'Name' = name, 1#1 riM -
'Owner' = user_name(uid) u+{a8=
from sysobjects ZoArQ(YFy
where user_name(uid)=@OldOwner O#Wh
TDF"
order by name &HSq(te
OPEN curObject vzmc}y G
FETCH NEXT FROM curObject INTO @Name, @Owner x`6<m!d`
WHILE(@@FETCH_STATUS=0) ]vuwkn+)
BEGIN _ 84ut
if @Owner=@OldOwner XV^1tX>f{
begin Hty0qr3
set @OwnerName = @OldOwner + '.' + rtrim(@Name) A/`%/0e
exec sp_changeobjectowner @OwnerName, @NewOwner %\i9p]=
end z5TuGYb<
-- select @name,@NewOwner,@OldOwner %6_AM
FETCH NEXT FROM curObject INTO @Name, @Owner qTQBt}
END Z(!00^
close curObject o6//IOZ
deallocate curObject "W(Q%1!Wi
GO jv&!Kw.Ug
10、SQL SERVER中直接循环写入数据 fxT-j s#S
declare @i int J:skJ.Wx
set @i=1 I[n^{8gz
while @i<30 U T="2*3gz
begin S]E.KLR?[;
insert into test (userid) values(@i) I"KN"v^
set @i=@i+1 +>4;Z d!@d
end } CfqG?)
小记存储过程中经常用到的本周,本月,本年函数 f|sFlUu&
Dateadd(wk,datediff(wk,0,getdate()),-1) <I"S#M7-s
Dateadd(wk,datediff(wk,0,getdate()),6) a@R]X5[O
Dateadd(mm,datediff(mm,0,getdate()),0) xZV1k~C
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0)) u_rdmyq$x/
Dateadd(yy,datediff(yy,0,getdate()),0) hdVdcnM
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) <jed!x
上面的SQL代码只是一个时间段 dXnl'pFS
Dateadd(wk,datediff(wk,0,getdate()),-1) Gm\/Y:U
Dateadd(wk,datediff(wk,0,getdate()),6) Gdg"gi!4
就是表示本周时间段. Ge<nxl<Bd
下面的SQL的条件部分,就是查询时间段在本周范围内的: @]ao"ui@/
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6) : "1XPr
而在存储过程中 +o9":dl
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1) ~,*b }O
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6) @'GGm#<