SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。 sR>>l3H
;tVd+[8
u"(NN9s
一、基础 )^ZC'[93
1、说明:创建数据库 3<+ZA-2
CREATE DATABASE database-name Anu:
2、说明:删除数据库 l0`bseN<
drop database dbname @vyEN.K%mm
3、说明:备份sql server 3N-
'{c6]U
--- 创建 备份数据的 device b@8z+,_
USE master l+>Y
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' L(K 5f7\
--- 开始 备份 NQ;X|$!zH
BACKUP DATABASE pubs TO testBack }|2A6^FH.
4、说明:创建新表 L&)e}"
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) xWXLk )A
根据已有的表创建新表: s|A[HQUtJ
A:create table tab_new like tab_old (使用旧表创建新表) 1E
/G+pm
B:create table tab_new as select col1,col2... from tab_old definition only ^pd7nr~Y
5、说明:删除新表 }DM W,+3
drop table tabname B !,&{[D
6、说明:增加一个列 f~\H|E8(
Alter table tabname add column col type "5<!
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 Qt{){uE
7、说明:添加主键: Alter table tabname add primary key(col) i6k6l%
说明:删除主键: Alter table tabname drop primary key(col) TMY. z
8、说明:创建索引:create [unique] index idxname on tabname(col....)
l$\B>u,>
删除索引:drop index idxname M0xhcU_
注:索引是不可更改的,想更改必须删除重新建。 J/K~8sc
9、说明:创建视图:create view viewname as select statement XZ]ji9'
删除视图:drop view viewname 0+op|bdj
10、说明:几个简单的基本的sql语句 Z;a)P.l.>
选择:select * from table1 where 范围 xBc|rqge
插入:insert into table1(field1,field2) values(value1,value2) dWkQ NFKF
删除:delete from table1 where 范围 BK4S$B
更新:update table1 set field1=value1 where 范围 3%(r,AD
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料! ;@ixrj0u
排序:select * from table1 order by field1,field2 [desc] >Rt:8uurAG
总数:select count as totalcount from table1 OYt_i'Q
求和:select sum(field1) as sumvalue from table1 5PZ7-WJ/
平均:select avg(field1) as avgvalue from table1 P HOngn
最大:select max(field1) as maxvalue from table1 y[.lfW?)
最小:select min(field1) as minvalue from table1 Xwo+iZ(a
s<# BxN
O&aD]~|
DoFe:+_U3
11、说明:几个高级查询运算词 mxF+Fp~
lMu9Dp
~<<32t'S:
A: UNION 运算符 TA/hj>rV
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 T^#d;A
B: EXCEPT 运算符 HAI)+J
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 KzV|::S^
C: INTERSECT 运算符 >Tl/3{V
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 &x\)] i2f
注:使用运算词的几个查询结果行必须是一致的。 a@jM%VZ
12、说明:使用外连接
`ql8y '
A、left outer join: C}<e3BXc
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 `lOW7Z}
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 5lD`qY
B:right outer join: <)a$5"AP
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 |-{e!&
C:full outer join: BNE:,I*&
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 QnBWZUI
3GKKC9C6
\F`>zY2$%
二、提升 bcwb'D\a
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) SC%HHu\l
法一:select * into b from a where 1<>1 zj2y=A|Y
法二:select top 0 * into b from a QQN6\(;-
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) 8$]SvfX
insert into b(a, b, c) select d,e,f from b; *a\x!c"
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) z.RM85 ?T
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件 l$j~p=S$F
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. YU6|/
<8
4、说明:子查询(表名1:a 表名2:b) b|k^
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) p|nPu*R-\
5、说明:显示文章、提交人和最后回复时间 vv2[t
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b "2-D[rYZ
6、说明:外连接查询(表名1:a 表名2:b) r
^*D8
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c _i7yyt;h
7、说明:在线视图查询(表名1:a ) XSN=0N!GB
select * from (SELECT a,b,c FROM a) T where t.a > 1; `5oXf
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 @>$qb|j
select * from table1 where time between time1 and time2 E>-I
|X"L1
select a,b,c, from table1 where a not between 数值1 and 数值2 GY@:[u.&
9、说明:in 的使用方法 seAPVzWUU
select * from table1 where a [not] in ('值1','值2','值4','值6') tMP"9JE,
10、说明:两张关联表,删除主表中已经在副表中没有的信息 x%H,ta%
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) *v(Q-FW
11、说明:四表联查问题: l?_Fy_fBt
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 ..... XABP}|aWK
12、说明:日程安排提前五分钟提醒 |%|Vlu
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 6hR `sE
13、说明:一条sql 语句搞定数据库分页 F?FfRzZ[
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 #b)`as?!1
14、说明:前10条记录 [+W<;iep
select top 10 * form table1 where 范围 LDU4 D
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) ~;]zEq-hG
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) -CFy
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 ^^!G{*F
(select a from tableA ) except (select a from tableB) except (select a from tableC) G `3{Q7k
17、说明:随机取出10条数据 cVMRSp
select top 10 * from tablename order by newid() Ylu\]pr9|C
18、说明:随机选择记录 6XCFL-o-
select newid() !wEe<],
19、说明:删除重复记录 3HcduJntl
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
O<|pw
20、说明:列出数据库里所有的表名 9Qu(RbDqC
select name from sysobjects where type='U' :t "_I
21、说明:列出表里的所有的 Qa:[iF
select name from syscolumns where id=object_id('TableName') s3@mk\?qMe
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 4:**d[|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=ON95ja
显示结果: 2v@B7r4}
type vender pcs 2)0J@r'
电脑 A 1 tEo-Mj5:
电脑 A 1 :HrFbq
光盘 B 2 ?tqJkL#
光盘 A 2 S#y GqN0i
手机 B 3 [MbbL
手机 C 3 \ %MsG
23、说明:初始化表table1 /uR/,R++
TRUNCATE TABLE table1 [iO8R-N8d
24、说明:选择从10到15的记录 PrfG
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc 0&CXR=U5
y4I Qa.F
z'1%%.r;FM
{{M/=WqC
三、技巧 |`o1B;lc
1、1=1,1=2的使用,在SQL语句组合时用的较多 +zLw%WD[l
"where 1=1" 是表示选择全部 "where 1=2"全部不选, xb0,dZb
如: C'gv#!Q
if @strWhere !='' kkb+qo
begin /hVwrt(
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere 1(>2tEjYT
end 3}mg7KV&
else ir{
4k
begin I
2OQ
set @strSQL = 'select count(*) as Total from [' + @tblName + ']' wWf_d jd
end coPdyw'9&
我们可以直接写成 yoF*yUls^E
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere 5|pF*8*
2、收缩数据库 _&s pMf
--重建索引 )wD/<7;
DBCC REINDEX P,-5af*;
DBCC INDEXDEFRAG y`7<c5zD
--收缩数据和日志 bE2O[B
DBCC SHRINKDB ao .vB']T
DBCC SHRINKFILE 6~W@$SP,F
3、压缩数据库 ]'Ho)Q
dbcc shrinkdatabase(dbname) ~$[fG}C.K
4、转移数据库给新用户以已存在用户权限 8c9<kGm$E
exec sp_change_users_login 'update_one','newname','oldname' -+Yark
go )YAU|sCAi$
5、检查备份集 ?r8hl.Z>
RESTORE VERIFYONLY from disk='E:\dvbbs.bak' 0pEM0M
6、修复数据库 Lq;iR
ALTER DATABASE [dvbbs] SET SINGLE_USER 7_)38
GO $^?VyHXvY
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK whHuV*K}
GO q%$p56\?3
ALTER DATABASE [dvbbs] SET MULTI_USER U{[YCs fk
GO Rj>A",
7、日志清除 jg{2Sxf!c
SET NOCOUNT ON yOKzw~;0%
DECLARE @LogicalFileName sysname, >ZG$8y 'j
@MaxMinutes INT, G?XA",AC
@NewSize INT Xa?igbgAwx
USE tablename -- 要操作的数据库名 ['pO=ho
SELECT @LogicalFileName = 'tablename_log', -- 日志文件名 !yrh50tD
@MaxMinutes = 10, -- Limit on time allowed to wrap log. vF'>?O?
@NewSize = 1 -- 你想设定的日志文件的大小(M) ' F9gp!s8~
-- Setup / initialize oS9Od8
DECLARE @OriginalSize int &}2@pu[S?7
SELECT @OriginalSize = size _<sN54
FROM sysfiles mR
XRuK
WHERE name = @LogicalFileName &V<f;PF(I
SELECT 'Original Size of ' + db_name() + ' LOG is ' + il!B={
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + 2=8PA/
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' ^5TVm>F@3
FROM sysfiles Vym0|cW
WHERE name = @LogicalFileName $m*Gu:#xm&
CREATE TABLE DummyTrans a*.#Zgy:lK
(DummyColumn char (8000) not null) kI@<H<
DECLARE @Counter INT, GxG~J4
@StartTime DATETIME, G&1bhi52
@TruncLog VARCHAR(255) 9oO~UP!ag
SELECT @StartTime = GETDATE(), K@cWg C
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' Ow4(1eE_
DBCC SHRINKFILE (@LogicalFileName, @NewSize) 3Z*o5@RI
EXEC (@TruncLog) W9tZX5V1
-- Wrap the log if necessary. { ,c*OR
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired 0!lWxS0#=
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName) <n#X~}i)
AND (@OriginalSize * 8 /1024) > @NewSize a oU"
BEGIN -- Outer loop. m<>BxX
SELECT @Counter = 0 T~Bj],k_
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) (,QWK08
BEGIN -- update BPt? 3tC
INSERT DummyTrans VALUES ('Fill Log') #*_!Xc9f
DELETE DummyTrans -q{N1?tcy
SELECT @Counter = @Counter + 1 !f52JQyh
END ug2W{D
EXEC (@TruncLog) `{Q'iydU
END OQ?N_zs,
SELECT 'Final Size of ' + db_name() + ' LOG is ' + |H_WY#
CONVERT(VARCHAR(30),size) + ' 8K pages or ' + \2a;z<(
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' GK'p$`oJm
FROM sysfiles o&%v"#H2
WHERE name = @LogicalFileName 04;s@\yX4
DROP TABLE DummyTrans Z*mbhod
SET NOCOUNT OFF AK&>3D
8、说明:更改某个表 ~YCH5,
exec sp_changeobjectowner 'tablename','dbo' ,7)hrA$(
9、存储更改全部表 a6DR' BC
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch yFDeYPZP
@OldOwner as NVARCHAR(128), [I4MK%YQ
@NewOwner as NVARCHAR(128) wT":
AS |JYb4J4Ni
DECLARE @Name as NVARCHAR(128) ,/b!Xm:
DECLARE @Owner as NVARCHAR(128) =#W:z.w
DECLARE @OwnerName as NVARCHAR(128) lRg?||1ik
DECLARE curObject CURSOR FOR r@zT!.sc!
select 'Name' = name, &Z]}rn
'Owner' = user_name(uid) %hYgG;22
from sysobjects U0j>u*yE
where user_name(uid)=@OldOwner eP>_CrJb
order by name YQG
l8E'
OPEN curObject H"AL@=
FETCH NEXT FROM curObject INTO @Name, @Owner /ie&uWy
WHILE(@@FETCH_STATUS=0) P1LOj
BEGIN <6 Rec^QF
if @Owner=@OldOwner 8Zsaq1S
begin \~%+)a%%
set @OwnerName = @OldOwner + '.' + rtrim(@Name) zs#-E_^%M
exec sp_changeobjectowner @OwnerName, @NewOwner !9/`PcNIpy
end d%'#-w'
-- select @name,@NewOwner,@OldOwner `Fr ,,Q81\
FETCH NEXT FROM curObject INTO @Name, @Owner 2\1+M)
END {HEWU<5
close curObject AtCT
deallocate curObject OmWEa
GO
p)/e;q^
10、SQL SERVER中直接循环写入数据 mv8H:T
declare @i int %BkE %ZcZ
set @i=1 ch0^g8@Q[
while @i<30 a`w=0]1&*
begin X|hYZR
insert into test (userid) values(@i) wCLniCt
set @i=@i+1 z U[pn)pe
end mgx|5Otg
小记存储过程中经常用到的本周,本月,本年函数 h76j|1gI
Dateadd(wk,datediff(wk,0,getdate()),-1) 6L8nw+mEK
Dateadd(wk,datediff(wk,0,getdate()),6) }?Y -I>
w
Dateadd(mm,datediff(mm,0,getdate()),0) jJiuq#;T3
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0)) Ln,<|,fZN
Dateadd(yy,datediff(yy,0,getdate()),0) _r3Y$^!U
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) 9/0H,qZc
上面的SQL代码只是一个时间段 a^J(TW/
Dateadd(wk,datediff(wk,0,getdate()),-1) *J[P#y
Dateadd(wk,datediff(wk,0,getdate()),6) 2PSExK57
就是表示本周时间段. Sr6'$8#>Y
下面的SQL的条件部分,就是查询时间段在本周范围内的: ^;PjO|mD
Z
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6) ZNw|5u^N
而在存储过程中 g.9C>>tj
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1) g3kbsi7_:
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6) vf3) T;X>