SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。 DO`
K_B
^lud2x$O^C
.fY1?$*6c
一、基础 [#hpWNez(>
1、说明:创建数据库 NCR4n_
CREATE DATABASE database-name !W4A9Th
2、说明:删除数据库 O9?t,1
drop database dbname A/ZZ[B-
3、说明:备份sql server Vb yGr~t
--- 创建 备份数据的 device +GqK$B(x7
USE master AqnDsr!
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' b&BkT%aA(G
--- 开始 备份 6Lj=%&
BACKUP DATABASE pubs TO testBack \]uD"Jqv#
4、说明:创建新表 #}Y$+FtO
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) &\),V 1"
根据已有的表创建新表: BPs|qb-
A:create table tab_new like tab_old (使用旧表创建新表) jGy%O3/
B:create table tab_new as select col1,col2... from tab_old definition only N1/)Fk-z
5、说明:删除新表 ldk (zAB.
drop table tabname R!{^qHb
6、说明:增加一个列 jeLRS8];
Alter table tabname add column col type B?n
6o|8
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 {| ~
7、说明:添加主键: Alter table tabname add primary key(col) $23*:)&J4
说明:删除主键: Alter table tabname drop primary key(col) pn"TFapJA
8、说明:创建索引:create [unique] index idxname on tabname(col....) Sp/t[\,'
删除索引:drop index idxname %EV\nwn6
注:索引是不可更改的,想更改必须删除重新建。 \vwsRT 1
9、说明:创建视图:create view viewname as select statement eYNu78u
删除视图:drop view viewname 6bPoC$<Z
10、说明:几个简单的基本的sql语句 w1U2cbCr/
选择:select * from table1 where 范围 wzX(]BG
插入:insert into table1(field1,field2) values(value1,value2) w(Jf;[o
删除:delete from table1 where 范围 pV:;!+
更新:update table1 set field1=value1 where 范围 E/+H~YzO
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料! "}ibH{$lM
排序:select * from table1 order by field1,field2 [desc] B}S!l>.z
总数:select count as totalcount from table1 K!~j}z*
求和:select sum(field1) as sumvalue from table1 QiO4fS'~W
平均:select avg(field1) as avgvalue from table1 r:N =?X`N
最大:select max(field1) as maxvalue from table1 d ? Uj3G
最小:select min(field1) as minvalue from table1 $mgamWNE8w
@2(7
ZxI
[l#
8}dy
[u*-~(
11、说明:几个高级查询运算词 0ndk=V
,jH<i.2R
3T1t !q4/5
A: UNION 运算符 6="Qwrk
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 0SS,fs<w3
B: EXCEPT 运算符 vX?MB
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 Lsu_f'p0
C: INTERSECT 运算符 >%6a$r~@
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 qe^d6
注:使用运算词的几个查询结果行必须是一致的。 fG dT2}gd
12、说明:使用外连接 80m<OW1
A、left outer join: ;[nomxu|?
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 D@W[Nd5MJ
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 M$J{clr
B:right outer join: +>b m~6
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 KYw~(+gHv2
C:full outer join: 0c}pg:XT
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 t .\<Q#bN#
Cj/J&PDQ
v;6O# ta'
二、提升 9f=L'{
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) x)}.@\&%
法一:select * into b from a where 1<>1 &JUHm_wd&S
法二:select top 0 * into b from a qe/dWJBa
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) LOO<)XFJ
insert into b(a, b, c) select d,e,f from b; {^8->V
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) WR|n> i@m
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件 , B90r7K:
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. s8:-*VR9
4、说明:子查询(表名1:a 表名2:b) 78~;j1^6u
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) Xmb001
5、说明:显示文章、提交人和最后回复时间 s2f6;Yc
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b reP)&Fo
6、说明:外连接查询(表名1:a 表名2:b) t GS>f>i
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c t/$:g9V%FA
7、说明:在线视图查询(表名1:a ) s2Rg-:7
select * from (SELECT a,b,c FROM a) T where t.a > 1; g$/C-j4A[
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 Yq~$pVgf
select * from table1 where time between time1 and time2 Qxb%P<`u
select a,b,c, from table1 where a not between 数值1 and 数值2 y@Gl'@-O
9、说明:in 的使用方法 3*(w=;y
select * from table1 where a [not] in ('值1','值2','值4','值6') h4,g pV>t
10、说明:两张关联表,删除主表中已经在副表中没有的信息 q9
SV<qg
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) B+VD53 V
11、说明:四表联查问题: aw\0\'}
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 ..... )swu~Wb}U@
12、说明:日程安排提前五分钟提醒 1XppC[))
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 !+EE*-c1c
13、说明:一条sql 语句搞定数据库分页 F=g+R~F
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 n9H4~[JiC
14、说明:前10条记录 ITssBB9
select top 10 * form table1 where 范围 'g5 Gdn
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) UG !+&ii|
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) "L9yG:
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 xfzGixA
(select a from tableA ) except (select a from tableB) except (select a from tableC) < C1Jim
17、说明:随机取出10条数据 S"<"e\\}"_
select top 10 * from tablename order by newid() uN;]Fv@Z
18、说明:随机选择记录 Ss~yy0
select newid() k>.n[`>$6|
19、说明:删除重复记录 hU|TP3*
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) gm8FmjZtf
20、说明:列出数据库里所有的表名 'kb|!
select name from sysobjects where type='U' -\|S=<
g
21、说明:列出表里的所有的 K@<%Vc>L(
select name from syscolumns where id=object_id('TableName') 3;%dn\
D
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 360b`zS
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 %G`GdG}T
显示结果: ^'G,sZ6'Nh
type vender pcs o4t6NDa
电脑 A 1 ix+sT|>
电脑 A 1 AZH=r S`
光盘 B 2 ]EWEW*'j
光盘 A 2 w D}g\{P
手机 B 3 /idrbc
手机 C 3 rtn.^HF
23、说明:初始化表table1 al1Nmc#
TRUNCATE TABLE table1 hk.vBbhs
24、说明:选择从10到15的记录 5Tg[-tl
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc ozOvpi:k3%
O<>cuW(l
&_dM2lj{
_&R lR
三、技巧 #qDMUN*i
1、1=1,1=2的使用,在SQL语句组合时用的较多 TbQ5
"where 1=1" 是表示选择全部 "where 1=2"全部不选, Y;"rJxHD
如: kSUpEV+/
if @strWhere !='' cii!
WCu
begin V`& O`
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere i"RBk%
end (x!Tb2mlk
else ;r3Xh)k;
begin e.'6q
($3
set @strSQL = 'select count(*) as Total from [' + @tblName + ']' !mIr_d2"
end jU2vnGw_
我们可以直接写成 MO-7yp:K
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere o>jM4sk$
2、收缩数据库 Ad)::9K?J
--重建索引 ?}ly`Js
DBCC REINDEX "CY#_)
DBCC INDEXDEFRAG _Squ%z:D
--收缩数据和日志 b-OniMq~
DBCC SHRINKDB w#!b #TNc
DBCC SHRINKFILE _^MkC}8
3、压缩数据库 FQe82tfV+
dbcc shrinkdatabase(dbname) 1+ib(MJ<:#
4、转移数据库给新用户以已存在用户权限 hM "6-60
exec sp_change_users_login 'update_one','newname','oldname' AI,Jy%62/
go AD>X'J
u8
5、检查备份集 zI{~;`tzN
RESTORE VERIFYONLY from disk='E:\dvbbs.bak' [4
y7tjar^
6、修复数据库 rE?Fp
ALTER DATABASE [dvbbs] SET SINGLE_USER ,LodP%%UV
GO kNk$[Yfs
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK Hw1:zro
GO 8nE}RD7bx
ALTER DATABASE [dvbbs] SET MULTI_USER 0K'^g0G
GO $I|6v
7、日志清除 r7Zx<c
SET NOCOUNT ON =-%10lOI
DECLARE @LogicalFileName sysname, PD$'
~2
@MaxMinutes INT, | IB4-p
@NewSize INT P}~nL
USE tablename -- 要操作的数据库名 f >$V:e([
SELECT @LogicalFileName = 'tablename_log', -- 日志文件名 EPiZe-
@MaxMinutes = 10, -- Limit on time allowed to wrap log. jt`\n1q)
@NewSize = 1 -- 你想设定的日志文件的大小(M) 60z8U#upM
-- Setup / initialize hCpcX"wND
DECLARE @OriginalSize int _ K Ix7
SELECT @OriginalSize = size T*{nf
FROM sysfiles A+41JMH
WHERE name = @LogicalFileName c-oIP~,
SELECT 'Original Size of ' + db_name() + ' LOG is ' + uW0D m#
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + d}^G790
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' W|CZA
FROM sysfiles W,fXHYst
WHERE name = @LogicalFileName 6%a:^f]
CREATE TABLE DummyTrans @8eQ|.q]Q
(DummyColumn char (8000) not null) <c.8f;1F
DECLARE @Counter INT, gGE&}EoLU
@StartTime DATETIME, "ph<V,lg
@TruncLog VARCHAR(255) SX]uIkw
SELECT @StartTime = GETDATE(), 5j~1%~,#
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' 1LVO0lT
DBCC SHRINKFILE (@LogicalFileName, @NewSize) zff<#yK1
EXEC (@TruncLog) H;c3 x"
-- Wrap the log if necessary. vf;&0j&`
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired TD-o-*mO
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName) v}sk %f
AND (@OriginalSize * 8 /1024) > @NewSize 2(i|n=
BEGIN -- Outer loop. ?k$'po*Eq
SELECT @Counter = 0 sd&^lpH
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
$5\+QW
BEGIN -- update ac!!1lwA
INSERT DummyTrans VALUES ('Fill Log') 9Q>85IiT
DELETE DummyTrans F3e1&aK6{
SELECT @Counter = @Counter + 1
8/s?Gz
END _b"K,[0o
EXEC (@TruncLog) pD17r}%
END 6wq>&P5
SELECT 'Final Size of ' + db_name() + ' LOG is ' + +SNjU"x
CONVERT(VARCHAR(30),size) + ' 8K pages or ' + 6~^ M<E
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' |*(R$t X
FROM sysfiles MqjdW
WHERE name = @LogicalFileName VT [TE
DROP TABLE DummyTrans -?p4"[
SET NOCOUNT OFF bbs'>D3
8、说明:更改某个表 :Z&<5
exec sp_changeobjectowner 'tablename','dbo' W <u,S
9、存储更改全部表 CB^.N>'
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch xi[\2g+
@OldOwner as NVARCHAR(128), N?2C*|%f
@NewOwner as NVARCHAR(128) u';9zk/$
AS T#GTNk!v
DECLARE @Name as NVARCHAR(128) u*$]Bx
DECLARE @Owner as NVARCHAR(128) l i)
5o
DECLARE @OwnerName as NVARCHAR(128) UY(\T8
DECLARE curObject CURSOR FOR Qs,4PPEg
select 'Name' = name, LYO2L1u)
'Owner' = user_name(uid) 2EiE5@
from sysobjects $X,dQ]M
where user_name(uid)=@OldOwner TW6F9}'f&
order by name xmi@
XL@t
OPEN curObject gy Ey=@L
FETCH NEXT FROM curObject INTO @Name, @Owner CUnBi? Mi
WHILE(@@FETCH_STATUS=0) b\S~uFq6
BEGIN ~L4L|q 7
if @Owner=@OldOwner TPVB{
107
begin ]j0/.pG
set @OwnerName = @OldOwner + '.' + rtrim(@Name) $38)_{
exec sp_changeobjectowner @OwnerName, @NewOwner ,c,@WQ2:-
end PiN^/#D
-- select @name,@NewOwner,@OldOwner E N rcIZ
FETCH NEXT FROM curObject INTO @Name, @Owner m "96%sB
END 8d7 NESYl
close curObject Y_<-.?jf
deallocate curObject ..7"<"uH
GO ^^B~v<uK
10、SQL SERVER中直接循环写入数据 ly#jl5wmT
declare @i int =O3)tm;
set @i=1 yoH,4,! G
while @i<30 [@_W-rA
begin .(99f#2M:
insert into test (userid) values(@i) d7S?"JpV
set @i=@i+1 &y&HxV
end m/3,;P.6
小记存储过程中经常用到的本周,本月,本年函数 #$
4g&8
Dateadd(wk,datediff(wk,0,getdate()),-1) `|2g&Vn
Dateadd(wk,datediff(wk,0,getdate()),6) c2gi3
Dateadd(mm,datediff(mm,0,getdate()),0) F*T$n"^
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0)) Ab6R ?mUM
Dateadd(yy,datediff(yy,0,getdate()),0) wC?$P
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) /gn!="J
上面的SQL代码只是一个时间段 @b!W8c 6
Dateadd(wk,datediff(wk,0,getdate()),-1) *-*SCA`E^=
Dateadd(wk,datediff(wk,0,getdate()),6) G@txX
'
就是表示本周时间段. ~@DdN5
下面的SQL的条件部分,就是查询时间段在本周范围内的: !t+ 3DMPn
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6) @N]]Cf>x
而在存储过程中 Lg~ll$
U
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1) O-huC:zZh
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6) m}7Nu