SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。 "7?t)FOo
MHNe>C-!q
H%~Q?4
一、基础 6JWGu/A
1、说明:创建数据库 8GW ut=D
CREATE DATABASE database-name SW=aHM
2、说明:删除数据库 )"-fHW+fy
drop database dbname :}y| 4*z
3、说明:备份sql server ]
?9t -
--- 创建 备份数据的 device O,]_ tp
USE master :H3(w| T/
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' QqjTLuN
--- 开始 备份 <>&89E%j'
BACKUP DATABASE pubs TO testBack c&A]pLn+x
4、说明:创建新表 z0;9SZ9
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 4)E|&)-fu8
根据已有的表创建新表: }8
\|1@09
A:create table tab_new like tab_old (使用旧表创建新表) uegb;m
B:create table tab_new as select col1,col2... from tab_old definition only #!Ze\fOC
5、说明:删除新表 mf~Lzp
drop table tabname 2|
$k`I,
6、说明:增加一个列 !`Xt8q\r
Alter table tabname add column col type oc =tI@W
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 s8yCC#H"
7、说明:添加主键: Alter table tabname add primary key(col) "&Ff[O*
说明:删除主键: Alter table tabname drop primary key(col) F\Y,JUn[G
8、说明:创建索引:create [unique] index idxname on tabname(col....) |zb`&tv}
删除索引:drop index idxname
sxt`0oE
注:索引是不可更改的,想更改必须删除重新建。 R;.d/U|av
9、说明:创建视图:create view viewname as select statement 9g4QVo|
删除视图:drop view viewname ;h~?ko
10、说明:几个简单的基本的sql语句 LEA;dSf
选择:select * from table1 where 范围 Kj=;>u
插入:insert into table1(field1,field2) values(value1,value2) 8`DO[Z
删除:delete from table1 where 范围 pB[%:w/@l:
更新:update table1 set field1=value1 where 范围 Q{8qm<0g
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料! SUo^c1)G
排序:select * from table1 order by field1,field2 [desc] +=Yk-nJ
总数:select count as totalcount from table1 <gR`)YF7
求和:select sum(field1) as sumvalue from table1 8 `o{b"l+
平均:select avg(field1) as avgvalue from table1 C*$|#.l
最大:select max(field1) as maxvalue from table1 V!H(;Tuuo
最小:select min(field1) as minvalue from table1 ]}/mFY?7
O<bDU0s{M
z,M'Tr.1|
n~9 i^
11、说明:几个高级查询运算词 nxD'r
tb:
FBcm;cjH
A: UNION 运算符 M,ppCHy/$
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 ?C
FS}v
B: EXCEPT 运算符 l~ CZW*/
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 I>d I[U
C: INTERSECT 运算符 Wf_CR(
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 |}%(6<
注:使用运算词的几个查询结果行必须是一致的。 v?FhG
b~1
12、说明:使用外连接 Euqjxz
A、left outer join: #!wsD7;
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 9N<*S'Z
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 zLo;.X[Y
B:right outer join: _jiQL66pY
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 `3]Rg0g&Xe
C:full outer join: tx gvVQ
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 NYGmLbq
uSH>$;a
/cM 5
二、提升 ^zKt{a
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) a4Ls^
法一:select * into b from a where 1<>1 2\DTJ`Y,
法二:select top 0 * into b from a (y%%6#bd
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) `:V}1ioX5
insert into b(a, b, c) select d,e,f from b; uAc@ Z-
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) jC#`PA3m=
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件 5XI;<^n2
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. QCVsVG!sN
4、说明:子查询(表名1:a 表名2:b) ,I/2.Q})[
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) <g]
ou
YHZ
5、说明:显示文章、提交人和最后回复时间 +}kO;\
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b 4 0p3Rv
6、说明:外连接查询(表名1:a 表名2:b) %3ou^mcj
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c 7s0)3HR}
7、说明:在线视图查询(表名1:a ) z7|
s%&
select * from (SELECT a,b,c FROM a) T where t.a > 1; |*Of^IkG0
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 -mE
select * from table1 where time between time1 and time2
{VS''Lv
select a,b,c, from table1 where a not between 数值1 and 数值2 ?e"Wu+q~L
9、说明:in 的使用方法 pCz@(:0
select * from table1 where a [not] in ('值1','值2','值4','值6') t1G1(F#&%
10、说明:两张关联表,删除主表中已经在副表中没有的信息 "w(N62z/
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) 83\o(
11、说明:四表联查问题: B>{|'z?%>
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 ..... FLVbkW-G.
12、说明:日程安排提前五分钟提醒 PbbXi
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 |= tJ|
13、说明:一条sql 语句搞定数据库分页 f37ji
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 20$F$YYuk
14、说明:前10条记录 c*Eok?O
select top 10 * form table1 where 范围 @47[vhE
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) )>-77\
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) J'I1,5(
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 %~][?Y ><
(select a from tableA ) except (select a from tableB) except (select a from tableC) cxAViWsf
17、说明:随机取出10条数据 TP{>O%b
select top 10 * from tablename order by newid() S`ax*`
18、说明:随机选择记录 'bZMh9|
select newid() YgO aZqN
19、说明:删除重复记录 *?EO n -
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) (~q#\
20、说明:列出数据库里所有的表名 - 3C* P
select name from sysobjects where type='U' R;0W+!fE
21、说明:列出表里的所有的 ZMdM_i?
select name from syscolumns where id=object_id('TableName') UOn! Y@
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 7( yXsVq
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 }f<fgY
显示结果: [?Mc4uT{
type vender pcs C/{nr-V3u
电脑 A 1 *p" "YEN
电脑 A 1 `G_(xN7O
光盘 B 2 Es.toOH$S
光盘 A 2 73'U#@g6
手机 B 3 X_vI0YX9
手机 C 3 3*CzXK>`M&
23、说明:初始化表table1 7JxE|G
TRUNCATE TABLE table1 #[gcg]6c
24、说明:选择从10到15的记录 WF+bN#YJ
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc B
rez&3[
8O"x;3I9
kHt!S9r
f}L>&^I)
三、技巧 u@GRN`yn
1、1=1,1=2的使用,在SQL语句组合时用的较多 nQ:ml
"where 1=1" 是表示选择全部 "where 1=2"全部不选, *,O
:>Z5I
如: +O;OSZ
if @strWhere !='' X{0ax.
begin }}kS~
w-#
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere a)I=U[
end `ENlV9
else 7V9%)%=h|
begin nu\
set @strSQL = 'select count(*) as Total from [' + @tblName + ']' wJapGc!
end GVjv**U
我们可以直接写成 D=i0e8D!+
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere d[s;a.
2、收缩数据库 1?/5A|?V4+
--重建索引 {{^Mr)]5K
DBCC REINDEX ?F?\uC2)'
DBCC INDEXDEFRAG j\XX:uU_
--收缩数据和日志 S(g<<Te
DBCC SHRINKDB "i!2=A8k
DBCC SHRINKFILE &LCUoTzj
3、压缩数据库 2 ||KP|5@
dbcc shrinkdatabase(dbname) R-g>W
4、转移数据库给新用户以已存在用户权限 M!xm1-,[
exec sp_change_users_login 'update_one','newname','oldname' DiZ!c"$
go 7i-W*Mb:
5、检查备份集 q#mFN/.(+
RESTORE VERIFYONLY from disk='E:\dvbbs.bak' gE-w]/1zD5
6、修复数据库 [JX}1%NA
ALTER DATABASE [dvbbs] SET SINGLE_USER M9uH&CD6U
GO H$k![K6Uj
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK ?=/}Ft
GO JL"
3#p}
ALTER DATABASE [dvbbs] SET MULTI_USER afxj[;p!
GO zxk??0]/
7、日志清除 j6&zRFX
SET NOCOUNT ON G/LXUhuif
DECLARE @LogicalFileName sysname, hO+O0=$}wN
@MaxMinutes INT, -(4E
@NewSize INT |x _-I#H
USE tablename -- 要操作的数据库名 _|^&eT-u
SELECT @LogicalFileName = 'tablename_log', -- 日志文件名 d&[M8(
@MaxMinutes = 10, -- Limit on time allowed to wrap log. *pcbwd!/
@NewSize = 1 -- 你想设定的日志文件的大小(M) ZaukMEq
-- Setup / initialize oW
yN:Qh
DECLARE @OriginalSize int b6LC$"t0
SELECT @OriginalSize = size E]HND.`*>
FROM sysfiles D+*uKldS;
WHERE name = @LogicalFileName gTmUK{y'
SELECT 'Original Size of ' + db_name() + ' LOG is ' + c~^]jqid]
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + >6.[i@RmWU
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' Xa? 6#
FROM sysfiles )+jK0E1
WHERE name = @LogicalFileName g9FVb7In_
CREATE TABLE DummyTrans Ov~S2?E8
(DummyColumn char (8000) not null) 5CH-:|(;=
DECLARE @Counter INT, S`GXiwk
@StartTime DATETIME, C$AIP\j-
)
@TruncLog VARCHAR(255) 3]:p!Y`$
SELECT @StartTime = GETDATE(), By51dk7
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' S5*~r@8h
DBCC SHRINKFILE (@LogicalFileName, @NewSize) c{]r{FAx9o
EXEC (@TruncLog) ;EE&~&*w
-- Wrap the log if necessary. :oon}_MdRd
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired M0;t%*1
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName) gJcXdv=]2
AND (@OriginalSize * 8 /1024) > @NewSize {E3<GeHw4
BEGIN -- Outer loop. {.' ,%)
SELECT @Counter = 0 ,<^tsCI
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) 4t%:O4
3e
BEGIN -- update t]u(jX)
INSERT DummyTrans VALUES ('Fill Log') 7tf81*e
DELETE DummyTrans 7(|3 OR+
SELECT @Counter = @Counter + 1 bgzT3KZ
END '1kj:Np
EXEC (@TruncLog) :N+#4rtgUY
END 5KC\1pei
SELECT 'Final Size of ' + db_name() + ' LOG is ' + $8X tI
CONVERT(VARCHAR(30),size) + ' 8K pages or ' + Dvq*XI5
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' gT5Ji~xI
FROM sysfiles TQ 5MKqR$
WHERE name = @LogicalFileName RB% fA%d
DROP TABLE DummyTrans s5zGg]0
SET NOCOUNT OFF RIVL 0Ig
8、说明:更改某个表 DiYJlD&
exec sp_changeobjectowner 'tablename','dbo' t_zY0{|P
9、存储更改全部表 }]39
iK`w
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch v8'`gY
@OldOwner as NVARCHAR(128), y3@x*_K8
@NewOwner as NVARCHAR(128) (Q h7bfd
AS A&}nRP9
DECLARE @Name as NVARCHAR(128) r0?hX
DECLARE @Owner as NVARCHAR(128) p~d)2TC4#
DECLARE @OwnerName as NVARCHAR(128) }VGI Y>v
DECLARE curObject CURSOR FOR vS J<
select 'Name' = name, Z68Wf5@to&
'Owner' = user_name(uid) 9
.&Or4>
from sysobjects :,}:c%-^"
where user_name(uid)=@OldOwner nuQLq^e
order by name _#^A:a^e8
OPEN curObject R.2KYhp,
FETCH NEXT FROM curObject INTO @Name, @Owner rmg";(I
WHILE(@@FETCH_STATUS=0) |S>J<]H
p
BEGIN cO=UswIkwO
if @Owner=@OldOwner =-Q
begin %)6:eIS
set @OwnerName = @OldOwner + '.' + rtrim(@Name) zfr (dQ
exec sp_changeobjectowner @OwnerName, @NewOwner ?%za:{
end r"u(!~R
-- select @name,@NewOwner,@OldOwner 'Qs3
FETCH NEXT FROM curObject INTO @Name, @Owner %:be{Y6
END 6(<~1{
X%
close curObject ]=86[A-2N
deallocate curObject UTK.tg
GO ;qVEI/
10、SQL SERVER中直接循环写入数据 >;' 1k'
declare @i int ;@ll
set @i=1 m)[wZP*e
while @i<30 h@>rjeY@
begin G5QgnxwP2
insert into test (userid) values(@i) /nMqEHCyg
set @i=@i+1 Vm1 c-,)3
end )ejXeg
小记存储过程中经常用到的本周,本月,本年函数 &PQ{e8w
Dateadd(wk,datediff(wk,0,getdate()),-1) ;5oH6{7_Z
Dateadd(wk,datediff(wk,0,getdate()),6) WJFTy+bD
Dateadd(mm,datediff(mm,0,getdate()),0) c9g \7L,Z
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0)) r/q1&*T
Dateadd(yy,datediff(yy,0,getdate()),0) YZ%f7BUk
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) MlC-Aad(
上面的SQL代码只是一个时间段 9
<kkzy
Dateadd(wk,datediff(wk,0,getdate()),-1) jXDzjt94J
Dateadd(wk,datediff(wk,0,getdate()),6)
Uhx2 _
就是表示本周时间段. kDpZnXP
下面的SQL的条件部分,就是查询时间段在本周范围内的: ^%*{:0'
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6) 73sAZa|
而在存储过程中 @qhg[= @
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1) y1"^S
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6) 0&rH 9