SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。 ? {F{;r
]y)Q!J )Q
baoD(0d
一、基础 c| '
w
1、说明:创建数据库 }GnwY97
CREATE DATABASE database-name gCVryB@z2
2、说明:删除数据库 Y"eEkT\
drop database dbname `Xcirfp
3、说明:备份sql server QI!i
--- 创建 备份数据的 device #S+Z$DQD
USE master L8vOB I7N
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' -#A:`/22
--- 开始 备份 c;I, O
BACKUP DATABASE pubs TO testBack +MO E
4、说明:创建新表 M\+* P,i
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 8xI`jE"1
根据已有的表创建新表: W)SjQp6
A:create table tab_new like tab_old (使用旧表创建新表) mf|pNiQ,
B:create table tab_new as select col1,col2... from tab_old definition only -05U%l1e
5、说明:删除新表 TL)O-
drop table tabname mg+k'Myo+
6、说明:增加一个列 ~HUZ#rUHm>
Alter table tabname add column col type 9 K
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 )3muPMaY
7、说明:添加主键: Alter table tabname add primary key(col) $
A-b vL
说明:删除主键: Alter table tabname drop primary key(col) F}rPY:
8、说明:创建索引:create [unique] index idxname on tabname(col....) 4W\,y_Q o
删除索引:drop index idxname ]Bb7(JX
注:索引是不可更改的,想更改必须删除重新建。 mKg@W;0ML
9、说明:创建视图:create view viewname as select statement ke.7Zp2.R
删除视图:drop view viewname GZ0aOpUWVq
10、说明:几个简单的基本的sql语句 WY)^1Gb$ux
选择:select * from table1 where 范围 s"0b%0?A
插入:insert into table1(field1,field2) values(value1,value2) o;-<|W>
删除:delete from table1 where 范围 }Pg'
vJW
更新:update table1 set field1=value1 where 范围 0v"&G<J
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料! Wc#:f8dr
排序:select * from table1 order by field1,field2 [desc] Ha ZFxh-(
总数:select count as totalcount from table1 bEr.nF
求和:select sum(field1) as sumvalue from table1 %f[Ep 3D
平均:select avg(field1) as avgvalue from table1 de-0?6
最大:select max(field1) as maxvalue from table1 8tWE=8<
最小:select min(field1) as minvalue from table1 ~%q7Vmk9
|r~
uos
iM64,wnA
.:;fAJPf
11、说明:几个高级查询运算词 %7`d/dgR
Wm6dQQ;Bj
)hL^+Nn bR
A: UNION 运算符 !J.rM5K
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 d0C8*ifFO
B: EXCEPT 运算符 Y%vP#>h
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 ixOw=!@
C: INTERSECT 运算符 r2G*!qK*1
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 Z[,`"}}hv=
注:使用运算词的几个查询结果行必须是一致的。 135Par5v
12、说明:使用外连接 U
\Dca&=
A、left outer join: -Q`Cq|s
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 'rV2Bt,
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 "zZ&n3=@
B:right outer join: dV$!JTsd
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 x9`ZO<L$
C:full outer join: 2uo8j F.h
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 YbvX$/zGu
5|WOBOh>`&
owMuT^x?
二、提升 /;UTC)cJ
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) Ry%YM,K3
法一:select * into b from a where 1<>1
l/ V&s<
法二:select top 0 * into b from a HRRngk#lV
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) f0F#Yi{fw
insert into b(a, b, c) select d,e,f from b; VA]ZR+m
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) @bQ!zCI
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件 k`IrZHMw
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. E2yz=7sv5
4、说明:子查询(表名1:a 表名2:b) CSL4P)
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) UIw?;:Y
5、说明:显示文章、提交人和最后回复时间 $T)d!$
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b ]]V^:"ne
6、说明:外连接查询(表名1:a 表名2:b) DM/hcY$MW
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c z`9l<Q/
7、说明:在线视图查询(表名1:a ) p[P[#IeL
select * from (SELECT a,b,c FROM a) T where t.a > 1; aT/KT,!
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 HU3Vv<lz
select * from table1 where time between time1 and time2 |7S:l9;
select a,b,c, from table1 where a not between 数值1 and 数值2 c20|Cx2m
9、说明:in 的使用方法 ArdJ."
select * from table1 where a [not] in ('值1','值2','值4','值6') JE%i-UVH+;
10、说明:两张关联表,删除主表中已经在副表中没有的信息 '?L%F{g/9
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) ) hPVX()O!
11、说明:四表联查问题: s{% fi*
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 ..... wL|7mMM,
12、说明:日程安排提前五分钟提醒 hd=j56P5P
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 = P8~n2V
13、说明:一条sql 语句搞定数据库分页 IgiqFV{
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 w\v&3T
14、说明:前10条记录 \1khyF'
select top 10 * form table1 where 范围 ]*h&hsS0
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) h=wf>^l
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
`QAh5r"
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 HU.1":.;
(select a from tableA ) except (select a from tableB) except (select a from tableC) Oylp:_<aT
17、说明:随机取出10条数据 R^?PAHE7
select top 10 * from tablename order by newid() r?XDvU
18、说明:随机选择记录 C_89YFn+
select newid() 8ok7|DJ
19、说明:删除重复记录 z5I^0'
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) Lj-{t% }
20、说明:列出数据库里所有的表名 6NKF'zh
select name from sysobjects where type='U' 8|_K
21、说明:列出表里的所有的 z7$}#)Z7
select name from syscolumns where id=object_id('TableName') g BH?l/
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 c; d"XiA
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 $u-lo|
显示结果: 1o)=GV1
type vender pcs X!?wL0n
电脑 A 1 yL4 -4
电脑 A 1 nvwDx*[qN
光盘 B 2 J4&XPr9
光盘 A 2 |7Yvq%E
手机 B 3 \Qb>:
手机 C 3 \6jF{
23、说明:初始化表table1 t-a`.y
TRUNCATE TABLE table1 (T`q++
24、说明:选择从10到15的记录 iPJ9Gh7
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc ^$?7H>=_ha
d<)s@Ntgm
TyyRj4>
f@#w{W,3
三、技巧 l+'`BBh*]
1、1=1,1=2的使用,在SQL语句组合时用的较多 JiUT\y
"where 1=1" 是表示选择全部 "where 1=2"全部不选, dnLo(<{<U
如: N+[}Gb"8q
if @strWhere !='' N)Qlkz$X
begin ^w ]1qjGw
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere paUyS 1i
end O\:;q*]
else lP-kZA!
begin orK +B4
set @strSQL = 'select count(*) as Total from [' + @tblName + ']' S So~.)J
end @b>YkJDk
我们可以直接写成 q8tP29
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere {!>E9Px
2、收缩数据库 _;%.1H{N
--重建索引 R\i]O
DBCC REINDEX fa/P%9db
DBCC INDEXDEFRAG C!oksI
--收缩数据和日志 {[rO2<MkA#
DBCC SHRINKDB c@)p Ki#W
DBCC SHRINKFILE L)j]~^P$-
3、压缩数据库 8p3ZF@c~t
dbcc shrinkdatabase(dbname) aslNlH 6
4、转移数据库给新用户以已存在用户权限 _g^E%@'W
exec sp_change_users_login 'update_one','newname','oldname' oa?!50d
go x*k65WO\
5、检查备份集 FDZeIj9uF
RESTORE VERIFYONLY from disk='E:\dvbbs.bak' /,-h%gj
6、修复数据库 #.RG1-L
ALTER DATABASE [dvbbs] SET SINGLE_USER Nt?2USTs-
GO 'bbV<?):
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK nDwq!LEx%5
GO ,Uv{dG
ALTER DATABASE [dvbbs] SET MULTI_USER 19pND
m2H1
GO Gl dH SCy
7、日志清除 k,yc>3P;U
SET NOCOUNT ON U`HXsq
p}
DECLARE @LogicalFileName sysname, /[p?_EX@
@MaxMinutes INT, #%9oQ6nO
@NewSize INT *tIdp`xT/T
USE tablename -- 要操作的数据库名 m[//_TFf]
SELECT @LogicalFileName = 'tablename_log', -- 日志文件名 UA1]o5K
@MaxMinutes = 10, -- Limit on time allowed to wrap log. ^/ULh,w!fP
@NewSize = 1 -- 你想设定的日志文件的大小(M)
)@sJTAK
-- Setup / initialize RcKQER
DECLARE @OriginalSize int m&(%&}g
SELECT @OriginalSize = size f/$-Nl.
FROM sysfiles 3W%f#d$`
WHERE name = @LogicalFileName 00$ @0
SELECT 'Original Size of ' + db_name() + ' LOG is ' + vCYSm 0
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + qBf wN 1
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' )F=JkG
FROM sysfiles 1 P(&GYc
WHERE name = @LogicalFileName Ew)n~!s
CREATE TABLE DummyTrans H'j_<R N
(DummyColumn char (8000) not null) 401/33yBJ
DECLARE @Counter INT, 60.[t9pk6
@StartTime DATETIME, d;*OO xQV
@TruncLog VARCHAR(255) jb#1&L14
SELECT @StartTime = GETDATE(), 5#N"WHz!
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' v ^ FV
t
DBCC SHRINKFILE (@LogicalFileName, @NewSize) O?+tY
y?
EXEC (@TruncLog) mgJ]@s}9
-- Wrap the log if necessary. ;C7BoHB9
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired Rh05W_?Js
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName) 2^k^"<h5j
AND (@OriginalSize * 8 /1024) > @NewSize Dohl,d
BEGIN -- Outer loop. uyS^W'fF
SELECT @Counter = 0 {7j6$.7J$&
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) 3N)Ycf8
BEGIN -- update /*mFP.en
INSERT DummyTrans VALUES ('Fill Log') @U 7#, G
DELETE DummyTrans BXKlO(7
SELECT @Counter = @Counter + 1 8iII)+
END 5yO#N2jY\
EXEC (@TruncLog) 3> n2
END pGZl.OI
SELECT 'Final Size of ' + db_name() + ' LOG is ' + 2Mv)0%,c
CONVERT(VARCHAR(30),size) + ' 8K pages or ' + cP$wI;P
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' GA%"w=M\
FROM sysfiles Azdz3/
WHERE name = @LogicalFileName P|!/mu]
DROP TABLE DummyTrans 6_ 33*/>=c
SET NOCOUNT OFF BIHHRCe:@n
8、说明:更改某个表 \]~kyy
exec sp_changeobjectowner 'tablename','dbo' ePPp)=
9、存储更改全部表 2\$WP-)%
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch l>[QrRXiSN
@OldOwner as NVARCHAR(128), ouu-wQ|(mM
@NewOwner as NVARCHAR(128) :_I
wc=
AS a{%52B"
DECLARE @Name as NVARCHAR(128) &)fhlp5
DECLARE @Owner as NVARCHAR(128) d=c1WK
DECLARE @OwnerName as NVARCHAR(128) P_^|KEz
DECLARE curObject CURSOR FOR /S2p ``E+
select 'Name' = name, ~Q{[fy=
'Owner' = user_name(uid) !)l%EJngL
from sysobjects z_[3IAZ
where user_name(uid)=@OldOwner hhh: rmEZl
order by name q:D0$YY0
OPEN curObject o q'J*6r
FETCH NEXT FROM curObject INTO @Name, @Owner 5Qm.ECXV
WHILE(@@FETCH_STATUS=0) y:^>(l #;
BEGIN m`1}O"<&i
if @Owner=@OldOwner r~Is,.zZ}
begin <*~BG)b
set @OwnerName = @OldOwner + '.' + rtrim(@Name) H*:r>Lm=
exec sp_changeobjectowner @OwnerName, @NewOwner I1}{~@
end EFT02#F_f
-- select @name,@NewOwner,@OldOwner ,*O{jc`(
FETCH NEXT FROM curObject INTO @Name, @Owner WMdz+^\(
END <or>bo^
close curObject {XVf|zM,
deallocate curObject }fa%JN %E
GO n79DS(t
10、SQL SERVER中直接循环写入数据 g)zn.]
declare @i int eA~_)-Z-
set @i=1 eiNk]KXAYX
while @i<30 h#6 jUQ
begin ngH~4HyT
insert into test (userid) values(@i) a_}BTkfHa
set @i=@i+1 T/spUlWu
end 9DP75 ti
小记存储过程中经常用到的本周,本月,本年函数 wYS
KtG~/S
Dateadd(wk,datediff(wk,0,getdate()),-1) "YdDaj</
Dateadd(wk,datediff(wk,0,getdate()),6) |WwFE|<
Dateadd(mm,datediff(mm,0,getdate()),0) dBD4ogo1
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0)) .AmM%I4K
Dateadd(yy,datediff(yy,0,getdate()),0) xa%ktn
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) 6jy n,GU
上面的SQL代码只是一个时间段 j}x
O34
Dateadd(wk,datediff(wk,0,getdate()),-1) e>i8 =U`;
Dateadd(wk,datediff(wk,0,getdate()),6) {1-CfQ0
8
就是表示本周时间段. O]4
x;`)
下面的SQL的条件部分,就是查询时间段在本周范围内的: :R _#'i
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6) +ouy]b0`t
而在存储过程中 >i#_)th"U!
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1) '%|20j
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6) \"sSS.'