SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。 G 3+.H
ujDd1Bxf?
o>).Cj
一、基础 _K`wG}YIE
1、说明:创建数据库 RTvqCp
CREATE DATABASE database-name HTVuStM8
2、说明:删除数据库 00G%gQXk,
drop database dbname S/}2; \Xm
3、说明:备份sql server b=g8eMm
--- 创建 备份数据的 device GQ t8p[!
USE master d:ARf
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' O-ew%@_
--- 开始 备份 H2&@shOOQJ
BACKUP DATABASE pubs TO testBack N^#ZJoR
4、说明:创建新表 M}`B{]lLz
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) DNOueU
根据已有的表创建新表: !Z`j2
e}
A:create table tab_new like tab_old (使用旧表创建新表) aUzBV\Yd}
B:create table tab_new as select col1,col2... from tab_old definition only w&$`cD
5、说明:删除新表 1_o],?Q
drop table tabname xe#FUS
3
6、说明:增加一个列 bP8Sj16q
Alter table tabname add column col type nc~F_i=
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 s:OFVlC%\
7、说明:添加主键: Alter table tabname add primary key(col) o}$XH,-9&
说明:删除主键: Alter table tabname drop primary key(col) aK&b{d
8、说明:创建索引:create [unique] index idxname on tabname(col....) j K!Au
删除索引:drop index idxname '= _/ 1F*q
注:索引是不可更改的,想更改必须删除重新建。 NiWa7 /Hr
9、说明:创建视图:create view viewname as select statement NMW#AZVd
删除视图:drop view viewname kjW+QT?T&
10、说明:几个简单的基本的sql语句 DQNnNsP:M-
选择:select * from table1 where 范围 3
*d"B tg
插入:insert into table1(field1,field2) values(value1,value2) ?{\nf7Y
删除:delete from table1 where 范围 ^$%S &W
更新:update table1 set field1=value1 where 范围 M9Cv
wMi
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料! 8I-u2Y$Sr
排序:select * from table1 order by field1,field2 [desc] `NnUyQ;T
总数:select count as totalcount from table1 Usr@uI#{J
求和:select sum(field1) as sumvalue from table1 TkE 8D
n
平均:select avg(field1) as avgvalue from table1 Gn\_+Pj$
最大:select max(field1) as maxvalue from table1 /mXBvY
最小:select min(field1) as minvalue from table1 bBu,#Mc
@PN#p"KaT
[DJ flCR&
s8QMewU
11、说明:几个高级查询运算词 D;oe2E{I
P7J>+cm
$"`- ^
A: UNION 运算符 E'v_#FLvR
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 {kp-h2I,
B: EXCEPT 运算符 p`mS[bxv!
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 ~3UQ|j
C: INTERSECT 运算符 {p)",)td
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 b^ L
\>3
注:使用运算词的几个查询结果行必须是一致的。 B||*.`3gN
12、说明:使用外连接 CEXyrs<
A、left outer join: 3b*cU}go
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 =7-9[ {
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 e8y;.D[2
B:right outer join: j;%-fvd;
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 oE<`VY|
C:full outer join: Wc,_RN-
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 QZ4v/Ou
x1Lb*3Fe
+~'865 {
二、提升 ICuF %
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) L=c!:p|7)
法一:select * into b from a where 1<>1 aY3^C q(r
法二:select top 0 * into b from a 6$fHtJD:
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) j;']cWe
insert into b(a, b, c) select d,e,f from b; 2]I4M[|&z
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) $9]m=S
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件 UUSq$~Ct
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..
u*e.yN
4、说明:子查询(表名1:a 表名2:b) @L>q(Kg
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) &/mA7Vf>eR
5、说明:显示文章、提交人和最后回复时间 nS/)P4z
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b d1T,eJ}
6、说明:外连接查询(表名1:a 表名2:b) B,M(@5wz
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c UV5Ie!\nm
7、说明:在线视图查询(表名1:a ) cYFiJJLG]
select * from (SELECT a,b,c FROM a) T where t.a > 1; j H19k}D
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 Acnl^x7Y1
select * from table1 where time between time1 and time2 +IrLDsd
select a,b,c, from table1 where a not between 数值1 and 数值2 aF)1Nm[
9、说明:in 的使用方法 lFa02p0
select * from table1 where a [not] in ('值1','值2','值4','值6') z8{a(nK P
10、说明:两张关联表,删除主表中已经在副表中没有的信息 nFE4qm
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) F4It/
11、说明:四表联查问题: W^fuScG)c
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 ..... F\fWvXdW
12、说明:日程安排提前五分钟提醒 7Ok;Lt!x
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 2}YOcnB
13、说明:一条sql 语句搞定数据库分页 0%,!jW{`
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 pV.Av
14、说明:前10条记录 Nqw&< x+
select top 10 * form table1 where 范围 >fe-d#!{
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) umD!2
w
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) Fp@TCPe#
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 6^uq?
(select a from tableA ) except (select a from tableB) except (select a from tableC) {8 8 )~
17、说明:随机取出10条数据 eyefW n&
select top 10 * from tablename order by newid() kdCUORMK
18、说明:随机选择记录 fYp'&Btb]x
select newid() GMMp|WV|
19、说明:删除重复记录 +hn+K1
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) }~#pEX~j*
20、说明:列出数据库里所有的表名 Em?d*z
select name from sysobjects where type='U' JXCCTUO
21、说明:列出表里的所有的 ~3WM5 fv
select name from syscolumns where id=object_id('TableName') "[vu6 `m?
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 y|CP;:f;
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 EPS={w$'s
显示结果: :{qv~&+C
type vender pcs ~vs}.kb
电脑 A 1 sW)Zi
电脑 A 1 ld3-C55
光盘 B 2 ~(x;5{
光盘 A 2 `jzTmt
手机 B 3 MxWy*|J}
手机 C 3 bSsh^Z
23、说明:初始化表table1 RMd[Yr2e
TRUNCATE TABLE table1 ?dD&p8{
24、说明:选择从10到15的记录 +u!0rLb
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc XS`M-{f`
GN-mrQo
fNb`X
i7ISX>%
三、技巧 K3m]%m2\
1、1=1,1=2的使用,在SQL语句组合时用的较多 5nv<^>[J
"where 1=1" 是表示选择全部 "where 1=2"全部不选, G:<`moKgL
如: .{ 44a$)
if @strWhere !='' *F
?8c
begin U"q/rcA
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere Qi_>Mg`x
end U Z.=aQ}M
else (rkyW z
begin O<96/a'
set @strSQL = 'select count(*) as Total from [' + @tblName + ']' RRmLd/(
end =:D aS`~V
我们可以直接写成 -QOw8vm
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere {LX.iH9}l
2、收缩数据库 [QMu2
--重建索引 Sl-v W
DBCC REINDEX 4Fp0ZVT
DBCC INDEXDEFRAG &C_'p {G
--收缩数据和日志 !,[C]Q1
DBCC SHRINKDB qtiz a~u
DBCC SHRINKFILE ?"zY"*>4
3、压缩数据库 0GB:GBhZ
dbcc shrinkdatabase(dbname) Swp;HW7x
4、转移数据库给新用户以已存在用户权限 |AcRIq
exec sp_change_users_login 'update_one','newname','oldname' fQL"O}Z
go g0>,%b
5、检查备份集 YhOlxON
RESTORE VERIFYONLY from disk='E:\dvbbs.bak' WA]c=4S
6、修复数据库 m>4ahue$
ALTER DATABASE [dvbbs] SET SINGLE_USER q6_u@:3u
GO j'%$XvI
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK z|asa*
GO 8'<-:KG
ALTER DATABASE [dvbbs] SET MULTI_USER Eq$&qV-?(
GO w4W_iaU
7、日志清除 vz^<YZMu
SET NOCOUNT ON }Z{=|rVE
DECLARE @LogicalFileName sysname, Ggl~nxz
@MaxMinutes INT, BZud)l24
@NewSize INT Y2d;E.DH8
USE tablename -- 要操作的数据库名 .q[SI$qO/
SELECT @LogicalFileName = 'tablename_log', -- 日志文件名 uHAT#\m:
@MaxMinutes = 10, -- Limit on time allowed to wrap log. "*LD 3
@NewSize = 1 -- 你想设定的日志文件的大小(M) bHg,1y)UC
-- Setup / initialize dFH$l
DECLARE @OriginalSize int Fx5d:!]:$?
SELECT @OriginalSize = size 8<.C3m
6h
FROM sysfiles F;gx%[$GX
WHERE name = @LogicalFileName KN7^:cC
SELECT 'Original Size of ' + db_name() + ' LOG is ' + K$ M^gh0
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + qw@puw@D
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' UNPezHaz
FROM sysfiles 2zVJ vn7
WHERE name = @LogicalFileName 1AG=%F|.
CREATE TABLE DummyTrans ,hq)1u
(DummyColumn char (8000) not null) AZa6Cw
DECLARE @Counter INT, Kv.>Vf.T}_
@StartTime DATETIME, .so[I
@TruncLog VARCHAR(255) q4}PM[K?=\
SELECT @StartTime = GETDATE(), Qtbbb3m;
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' fO0(Z
DBCC SHRINKFILE (@LogicalFileName, @NewSize) Q3|T':l4
EXEC (@TruncLog) GP&vLt51
-- Wrap the log if necessary. NZ/yBOD(
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired J9\a{c;.
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName) Pcu#lWC$
AND (@OriginalSize * 8 /1024) > @NewSize $aN-Y?U%
BEGIN -- Outer loop. N@Y ljz|
SELECT @Counter = 0 TF 'U
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) <$ F\Nk|x
BEGIN -- update g.'yZvaP
INSERT DummyTrans VALUES ('Fill Log')
fv`O4
DELETE DummyTrans x9x E&
SELECT @Counter = @Counter + 1 87:!C5e}
END 5aln>1x>hn
EXEC (@TruncLog) tZ `z
END ,WvY$_#xW%
SELECT 'Final Size of ' + db_name() + ' LOG is ' + <Q?a=4
CONVERT(VARCHAR(30),size) + ' 8K pages or ' + p/U+0f
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' yaG= j
FROM sysfiles .&9 i
WHERE name = @LogicalFileName dbOdq
DROP TABLE DummyTrans FXzFHU/dP
SET NOCOUNT OFF z I+\Oll#Q
8、说明:更改某个表 H ,+?
t
exec sp_changeobjectowner 'tablename','dbo' xdf82)
9、存储更改全部表 =JKv:</.G
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch mt5KbA>nU
@OldOwner as NVARCHAR(128), cs1l~bl
@NewOwner as NVARCHAR(128) 1gmt2>#v%
AS U5-@2YcH
DECLARE @Name as NVARCHAR(128) d'/TdVM
DECLARE @Owner as NVARCHAR(128) J|X
6j&-
DECLARE @OwnerName as NVARCHAR(128) $ &P>r
DECLARE curObject CURSOR FOR q^A+<d
select 'Name' = name, }|5VRJA
'Owner' = user_name(uid) Wm);C~Le
from sysobjects $KLD2BAL
where user_name(uid)=@OldOwner mwY
IJy[
order by name J?Dq>%+^
OPEN curObject K]j0_~3s
FETCH NEXT FROM curObject INTO @Name, @Owner ,RgB$TcE
WHILE(@@FETCH_STATUS=0) g8w2Vz2/
BEGIN )ZBY* lk9
if @Owner=@OldOwner YKE46q;J
begin ^2$ lJ
set @OwnerName = @OldOwner + '.' + rtrim(@Name) ^=:9)CNw(
exec sp_changeobjectowner @OwnerName, @NewOwner -jn WZ5.
end x5QaM.+=J
-- select @name,@NewOwner,@OldOwner ^S)cjH`P
FETCH NEXT FROM curObject INTO @Name, @Owner Pt&(npjN,
END 'yV?*a
close curObject b8%C*r7
deallocate curObject WBN w~|DO]
GO ^-rfvc
10、SQL SERVER中直接循环写入数据 qwK2WE%T
declare @i int \EKU*5\Hp>
set @i=1 CBDG./
while @i<30 #fJ] o_
begin rQEyD
insert into test (userid) values(@i) /;tPNp{!dw
set @i=@i+1 wWSdTLX
end ZxlAk+<]
小记存储过程中经常用到的本周,本月,本年函数 aB]m*~
Dateadd(wk,datediff(wk,0,getdate()),-1) f m(e3]
Dateadd(wk,datediff(wk,0,getdate()),6) hFk3[zTy
Dateadd(mm,datediff(mm,0,getdate()),0) \=0Vuz
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0)) <`jLY)sw
Dateadd(yy,datediff(yy,0,getdate()),0) t\RF=BbJJ
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) _[Vf547vS
上面的SQL代码只是一个时间段 $8p7 D?Y
Dateadd(wk,datediff(wk,0,getdate()),-1) ?W(6
Dateadd(wk,datediff(wk,0,getdate()),6) K]U;?h&CZc
就是表示本周时间段. 8[|UgI,>z
下面的SQL的条件部分,就是查询时间段在本周范围内的: 4n
%?YQ[t
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6) /sr 2mt-Q
而在存储过程中 u(OW gbA3
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1) HLBkR>e
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6) ?%VI{[y#>