SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。 s0k`p<q
qT`k*i?
9Bw|(J
一、基础 5
({t4dm
1、说明:创建数据库 .MJofE;Jn
CREATE DATABASE database-name ^w c"&;=c|
2、说明:删除数据库 EuyXgK>g
drop database dbname OG~6L4"
3、说明:备份sql server 37|&?||
--- 创建 备份数据的 device ak |WW]R
USE master z2QP)150
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' s1h/}
--- 开始 备份 [N#,K02mk
BACKUP DATABASE pubs TO testBack 49dd5ddr
4、说明:创建新表 b#hDHSdZ,
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) lMg+R<$~I
根据已有的表创建新表: j+["JXy
A:create table tab_new like tab_old (使用旧表创建新表) @++.FEf
B:create table tab_new as select col1,col2... from tab_old definition only 1M
781
5、说明:删除新表 ZGYr$C~
drop table tabname &'}/f5s|
6、说明:增加一个列 ~nG(5:A5g/
Alter table tabname add column col type Y!gCMLL
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 0^RXGN
7、说明:添加主键: Alter table tabname add primary key(col) A#95&kJpy
说明:删除主键: Alter table tabname drop primary key(col) !`M|C?b
8、说明:创建索引:create [unique] index idxname on tabname(col....) fvF?{k> ~}
删除索引:drop index idxname t`,`6@d
注:索引是不可更改的,想更改必须删除重新建。 P%(O|
9、说明:创建视图:create view viewname as select statement t<|NLk.
删除视图:drop view viewname S7L=#+Z
10、说明:几个简单的基本的sql语句 !=:$lzS^
选择:select * from table1 where 范围 oze&
插入:insert into table1(field1,field2) values(value1,value2) vDxe/x%
删除:delete from table1 where 范围 s!}ne"&0
更新:update table1 set field1=value1 where 范围 "t_-f7fS7
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料! 86mp=6@
排序:select * from table1 order by field1,field2 [desc] ?`#/ 8PN
总数:select count as totalcount from table1 <-D0u?8
求和:select sum(field1) as sumvalue from table1 OSf}Q=BL
平均:select avg(field1) as avgvalue from table1 }t%!9hr5D
最大:select max(field1) as maxvalue from table1 DFd%9*N
最小:select min(field1) as minvalue from table1 NF0%}II&xK
o)2W`i &
)8UWhl=
AbYqf%~7`l
11、说明:几个高级查询运算词 .On|uC)!
5_z33,q2
OPx`u
A: UNION 运算符 iIq)~e/ Z
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 +[tE ^`-F
B: EXCEPT 运算符 lAJxr8 .
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 *?Kr*]dnLl
C: INTERSECT 运算符 :C65-[PSdO
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 A0q|J/T
注:使用运算词的几个查询结果行必须是一致的。 `P3>S(Tgy
12、说明:使用外连接 Qe5U<3{JZ
A、left outer join: j"|=C$Kn/
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 !/3B3cG
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 !cAyTl(_
B:right outer join: \&i P`v`K
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 D0#x
Lh
C:full outer join: !H irhDN
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 0 rXx RQ
[5MJwRM^!;
P5#r,:zL
二、提升 F>-B3x
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) .G)(0z("s
法一:select * into b from a where 1<>1 Q'YH>oGh^
法二:select top 0 * into b from a '=G|Sq^aO
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) f/Hm{<BY
insert into b(a, b, c) select d,e,f from b; 0;:.B
j
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) Wr3mQU
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件 [I$BmGQ
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. u*tN)f3
4、说明:子查询(表名1:a 表名2:b) :SGF45>B@
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) 9lW;Nk*j:
5、说明:显示文章、提交人和最后回复时间 Yl#Rib
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b j
S?xk
6、说明:外连接查询(表名1:a 表名2:b) KOp162X>r
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c #P?6@\
7、说明:在线视图查询(表名1:a ) >9(hUH
select * from (SELECT a,b,c FROM a) T where t.a > 1; ~D5\O6mU-
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 OQ>x5?um
select * from table1 where time between time1 and time2 mysetv&5
select a,b,c, from table1 where a not between 数值1 and 数值2 Rx);7j/5
9、说明:in 的使用方法 nZ@&2YPlem
select * from table1 where a [not] in ('值1','值2','值4','值6') ]zQo>W$
10、说明:两张关联表,删除主表中已经在副表中没有的信息 w[!^;#
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) gUpb4uN
11、说明:四表联查问题: #z2rzM@/:
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 ..... IuOgxm~Y
12、说明:日程安排提前五分钟提醒 bLQ ^fH4ww
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 I*IhwJFl/
13、说明:一条sql 语句搞定数据库分页 7_mw%|m6@
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 =RAh|e
14、说明:前10条记录 ALNc'MW!
select top 10 * form table1 where 范围 -Gw$#!
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) o_D?t-XH
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) Jnna$6G)B
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 ni6{pK4Wqm
(select a from tableA ) except (select a from tableB) except (select a from tableC) zSSB>D
17、说明:随机取出10条数据 @*Wh
select top 10 * from tablename order by newid() `KK>~T_$J
18、说明:随机选择记录 1Lg-.-V
select newid() y6IXd W
19、说明:删除重复记录 g|<]B$yN#
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) -x'z
XvWZ
20、说明:列出数据库里所有的表名 839IRM@'5
select name from sysobjects where type='U' qZh1`\G
21、说明:列出表里的所有的 %ix)8+Eb
select name from syscolumns where id=object_id('TableName') DVK)2La
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 C#t'Y*
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 3v
mjCm
显示结果: N^pJS6cJkl
type vender pcs <oWB0%
电脑 A 1 DWID$w
电脑 A 1 &/uu)v
光盘 B 2 &%s8L\?
光盘 A 2 &p}$J)q
手机 B 3 l411a9o
手机 C 3 VsN pHQG]
23、说明:初始化表table1 YQpSlCCo
3
TRUNCATE TABLE table1 h~p>re
24、说明:选择从10到15的记录 o4%y>d)
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc g"?Y+j
59%tXiO
wmTq` XH)
l"!Ko G7
三、技巧 p8\zG|b5
1、1=1,1=2的使用,在SQL语句组合时用的较多 PC[c/CoD
"where 1=1" 是表示选择全部 "where 1=2"全部不选, B';6r4I-
如: XP1~d>j
if @strWhere !='' XvE9b5}
begin QR
Ei7@t
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere 5Pd"h S
end .9"Y_/0
else V\{tmDE
begin h-m\% |D
set @strSQL = 'select count(*) as Total from [' + @tblName + ']' )*Q-.Je/U
end KM!k$;my
我们可以直接写成 Fb4`|
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere UY <e&Npo
2、收缩数据库 FI<q@HF
--重建索引 x,otFp
DBCC REINDEX ~,BIf+\XF
DBCC INDEXDEFRAG :sP!p`dl
--收缩数据和日志 3Ezy %7
DBCC SHRINKDB jWY$5Vq<H
DBCC SHRINKFILE ?APeR,"V
3、压缩数据库 13+<Q \
dbcc shrinkdatabase(dbname) `"@g8PWe
4、转移数据库给新用户以已存在用户权限 }Y*VAnY6;
exec sp_change_users_login 'update_one','newname','oldname' u_'!_T L
go 4lM8\Lr
5、检查备份集 S3@|Q\*r
RESTORE VERIFYONLY from disk='E:\dvbbs.bak' TU GNq
6、修复数据库 hBFP1u/E'
ALTER DATABASE [dvbbs] SET SINGLE_USER |<Gl91
GO 9{$<0,?
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK rS?pWTg"8
GO *JaqTI,e
ALTER DATABASE [dvbbs] SET MULTI_USER Qhw^S*
GO %<\6TZr
7、日志清除 !Yw3 d
SET NOCOUNT ON TD9;kN1`
DECLARE @LogicalFileName sysname, Xu>r~^w=S
@MaxMinutes INT, r)1'ePI"
@NewSize INT
WJ
d%2pO]
USE tablename -- 要操作的数据库名 s-RQMK}H
SELECT @LogicalFileName = 'tablename_log', -- 日志文件名 ~j#]tElb
@MaxMinutes = 10, -- Limit on time allowed to wrap log. :T._ba3|
@NewSize = 1 -- 你想设定的日志文件的大小(M) v\,N 5
-- Setup / initialize ,i0b)=!o
DECLARE @OriginalSize int ~\cO"(y5:O
SELECT @OriginalSize = size f_imyzP
FROM sysfiles 581e+iC~<H
WHERE name = @LogicalFileName js8{]04y
SELECT 'Original Size of ' + db_name() + ' LOG is ' + b.@P%`@a.
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + E!Zx#XP1
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' 0z[dlHi
FROM sysfiles tBm_YP[
WHERE name = @LogicalFileName ?0
m\(#
CREATE TABLE DummyTrans vNeCpf
(DummyColumn char (8000) not null) .!6>oL/iF
DECLARE @Counter INT, tU^kQR!
@StartTime DATETIME, +4,2<\fX
@TruncLog VARCHAR(255) "
beQZG
SELECT @StartTime = GETDATE(), +R\vgE68
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' sT/c_^y
DBCC SHRINKFILE (@LogicalFileName, @NewSize) u1~9{"P*
EXEC (@TruncLog) Khe!g1=&X
-- Wrap the log if necessary. &tZG
@
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired L3p`
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName) 78Aa|AJU
AND (@OriginalSize * 8 /1024) > @NewSize UDc$"a}ds{
BEGIN -- Outer loop. {\z({Wlb]
SELECT @Counter = 0 &%2*Wu;
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) "&/]@)TPz
BEGIN -- update Qf|U0
INSERT DummyTrans VALUES ('Fill Log') nZ_v/?O
DELETE DummyTrans ,j?.4{rHJ
SELECT @Counter = @Counter + 1 SR8qt z/V
END #k$)i[aI-
EXEC (@TruncLog) X/;p-KX
END 6AP~]e 8
SELECT 'Final Size of ' + db_name() + ' LOG is ' + ?6k}ii!c
CONVERT(VARCHAR(30),size) + ' 8K pages or ' + %"X-&1vV
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' %+F"QI1~0
FROM sysfiles W>=o*{(YO
WHERE name = @LogicalFileName M@(^AK{mU
DROP TABLE DummyTrans K YkS9_yF
SET NOCOUNT OFF i `0v#P
8、说明:更改某个表 t9_E$w^U
exec sp_changeobjectowner 'tablename','dbo' mCz,2K|^~
9、存储更改全部表 ph}j[Co
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch 8$c bVMjh
@OldOwner as NVARCHAR(128), kwud?2E
@NewOwner as NVARCHAR(128) 7P B)'Wl"6
AS m3^/:<
DECLARE @Name as NVARCHAR(128) r{seb E\
;
DECLARE @Owner as NVARCHAR(128) @[6,6:h|
DECLARE @OwnerName as NVARCHAR(128) ,zQOZ'^
DECLARE curObject CURSOR FOR M('d-Q{B7L
select 'Name' = name, `Ci4YDaz;k
'Owner' = user_name(uid) fRvAKz|rL
from sysobjects kL90&nP
where user_name(uid)=@OldOwner L!'k !k
order by name A;J MV+2N
OPEN curObject >m'x8xB=
FETCH NEXT FROM curObject INTO @Name, @Owner 7$k8%lI;>
WHILE(@@FETCH_STATUS=0) mF09U(ci
BEGIN a{!r`>I\f
if @Owner=@OldOwner 3SBZ>
begin o:Zd1"Z
set @OwnerName = @OldOwner + '.' + rtrim(@Name) d vOJW".
exec sp_changeobjectowner @OwnerName, @NewOwner i1oKrRv
end M0c9pE
-- select @name,@NewOwner,@OldOwner o+?rI
p
FETCH NEXT FROM curObject INTO @Name, @Owner UkfB^hA
END +<.\5+
close curObject -#29xRPk
deallocate curObject w#
*1 /N
GO %@R~DBS
10、SQL SERVER中直接循环写入数据 XMRNuEU
declare @i int Z?^"\u-
set @i=1 @ 2_<,;$
while @i<30 6e25V4e?I
begin eV6o3u:9
insert into test (userid) values(@i) Hwm?#6\5
set @i=@i+1 jko"MfJ
end p{=QGrxB*
小记存储过程中经常用到的本周,本月,本年函数 cE{ =(OQ
Dateadd(wk,datediff(wk,0,getdate()),-1) M]HgIL@9#
Dateadd(wk,datediff(wk,0,getdate()),6) Fvxu>BK
Dateadd(mm,datediff(mm,0,getdate()),0) 8V$3b?]
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0)) L7mz#CMWf
Dateadd(yy,datediff(yy,0,getdate()),0) nMoWOP'
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) pGIe=Um0W
上面的SQL代码只是一个时间段 [rreFSy#@
Dateadd(wk,datediff(wk,0,getdate()),-1) h7;bclU
Dateadd(wk,datediff(wk,0,getdate()),6) ^*^/]vM
就是表示本周时间段. uO >x:*^8
下面的SQL的条件部分,就是查询时间段在本周范围内的: 'FzN[% K"
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6) sl/)|~3!8
而在存储过程中 \m@Y WO?L
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1) uu%?K@Qq
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6) hxC!+ArVe