SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。 C9mzg
-Y8ks7
S#h'\/S
一、基础 T018)WrhL
1、说明:创建数据库 c
BHL,
CREATE DATABASE database-name
'9 *|N=
2、说明:删除数据库 &:DCtjK
drop database dbname y*}vG}e%
3、说明:备份sql server /NW>;J}C
--- 创建 备份数据的 device &,N3uy;Gc
USE master (~G5t(+
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' gVa+.x]
--- 开始 备份 3|K=%jr[
BACKUP DATABASE pubs TO testBack Q"_T2fl]vP
4、说明:创建新表 K$<`4#i
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 5%QC
][,
根据已有的表创建新表: 4+5OR&kxZ
A:create table tab_new like tab_old (使用旧表创建新表) hJ;f1dZ7}
B:create table tab_new as select col1,col2... from tab_old definition only s!@=rq
5、说明:删除新表 {UdcX~\~
drop table tabname AB2mt:^
6、说明:增加一个列 \ W
'i0+
Alter table tabname add column col type (:?5 i`
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 t +3
7、说明:添加主键: Alter table tabname add primary key(col) >[|GC/C
说明:删除主键: Alter table tabname drop primary key(col) lrs0^@.+
8、说明:创建索引:create [unique] index idxname on tabname(col....) ;]gsJ9FK<
删除索引:drop index idxname :F^$"~(,
注:索引是不可更改的,想更改必须删除重新建。 ~KAp\!,
9、说明:创建视图:create view viewname as select statement d; mmM\3]
删除视图:drop view viewname 8! H8[J
10、说明:几个简单的基本的sql语句 ASKAgU"h
选择:select * from table1 where 范围 X,WQ'|rC
插入:insert into table1(field1,field2) values(value1,value2) <JL\?)}n
删除:delete from table1 where 范围 ! fi &@k
更新:update table1 set field1=value1 where 范围 9h:jFhsA9
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料! Lp:Nw4 _
排序:select * from table1 order by field1,field2 [desc] nDHHYp
总数:select count as totalcount from table1 H.YIv50E
求和:select sum(field1) as sumvalue from table1 4|>
rwQ~t
平均:select avg(field1) as avgvalue from table1 p^KlH=1n.6
最大:select max(field1) as maxvalue from table1 Rwc[:6;fn
最小:select min(field1) as minvalue from table1 I&TTr7
"x#]i aDjf
L_THU4^j
mL:m;>JJ n
11、说明:几个高级查询运算词 DKy>]Hca
~\IF9!
$ \Q<K@{
A: UNION 运算符 /h}P Eu3y
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 I.^X 2
B: EXCEPT 运算符 pqyWv;
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 aBXYri
C: INTERSECT 运算符 ;cv.f>Cm
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 FOOQ'o[}
注:使用运算词的几个查询结果行必须是一致的。 2{A;du%&
12、说明:使用外连接 ,|T*|2Gm
A、left outer join: M82.khm~jM
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 {S5RK-ax
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 T@;! yz}Pf
B:right outer join: NuC-qG#
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 Nb~,`bu,2
C:full outer join: |av*!i5Q
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 oLgg
e>L5.~i
z.eJEK
二、提升
xS=_yO9-
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) <8u>_o6
法一:select * into b from a where 1<>1 0JmFQ^g(
法二:select top 0 * into b from a R%>jJ[4\[
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
b8rp8'M)
insert into b(a, b, c) select d,e,f from b; 8[8|*8xqs
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) oN *SRaAp
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件 cC^W2\
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. 9@:BK;Fi
4、说明:子查询(表名1:a 表名2:b) QCeMKjCmY
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) H@K#|A=a
5、说明:显示文章、提交人和最后回复时间 y,MPGW_
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b <RhOjZgyZ
6、说明:外连接查询(表名1:a 表名2:b) F(#ha J$>
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c Ct4LkmD
7、说明:在线视图查询(表名1:a ) lVP9=
select * from (SELECT a,b,c FROM a) T where t.a > 1; 2>F\&
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 KMUK`tbaI
select * from table1 where time between time1 and time2 fv|]= e
select a,b,c, from table1 where a not between 数值1 and 数值2 QB!jLlg(
9、说明:in 的使用方法 `TUZZz
select * from table1 where a [not] in ('值1','值2','值4','值6') 'S =sj}X
10、说明:两张关联表,删除主表中已经在副表中没有的信息 1TKEm9j]u
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) hHcJN
11、说明:四表联查问题: P+[QI
U
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 ..... T!MZ+Ph`F
12、说明:日程安排提前五分钟提醒 d; 9*l!CF
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 3\;v5D:
13、说明:一条sql 语句搞定数据库分页 d)N^PJ/
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 ZB-QABn
14、说明:前10条记录 /+>)"D6'
select top 10 * form table1 where 范围 ZTN(irK
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) +`ai1-vw
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) ZAMeqPt
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 DW#Bfo
(select a from tableA ) except (select a from tableB) except (select a from tableC) 3)}(M
17、说明:随机取出10条数据 W%TQYR
select top 10 * from tablename order by newid() !_qskDc-
18、说明:随机选择记录 w#oGX
select newid() G 0hYFc u
19、说明:删除重复记录 @&;(D!_&
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) zJ5hvDmC
20、说明:列出数据库里所有的表名 vkJ)FEar
select name from sysobjects where type='U' }i(qt&U;
21、说明:列出表里的所有的 5?Bc
Y;
select name from syscolumns where id=object_id('TableName') ]fj- `==
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 ^V[/(Lq
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 )CJES!!
W
显示结果: M&r2:Whk
type vender pcs LIF|bE9kd
电脑 A 1 jAXR`D
电脑 A 1 cv2]*
光盘 B 2 2gt+l?O<PS
光盘 A 2 <$%ql'=
手机 B 3 9z:K1
手机 C 3 :Zza)>l
23、说明:初始化表table1 kBo;h.[l
TRUNCATE TABLE table1 -LTKpN`[@
24、说明:选择从10到15的记录 Pg`JQC|
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc 9 CB\n
]bm=LA
"f4<B-9<$
a5|@R<iF
三、技巧 >-M ]:=L
1、1=1,1=2的使用,在SQL语句组合时用的较多 #b'N}2'p#V
"where 1=1" 是表示选择全部 "where 1=2"全部不选, %,/lqc Fo
如: $_sYfU9
if @strWhere !='' jo}1u_OJ
begin .jA\f:u#
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere Z^+rQ.%n"&
end joqWh!kv7U
else D?^Y`G$.
begin (ew}
gJ
set @strSQL = 'select count(*) as Total from [' + @tblName + ']' A^ViDP
end Y&K <{\vE
我们可以直接写成 @xS]!1-
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere [F+,YV%t
2、收缩数据库 _-O cc=Z
--重建索引 &iqw!
ud
DBCC REINDEX B8 H75sz
DBCC INDEXDEFRAG k^%2_H
--收缩数据和日志 bHE7yv [
DBCC SHRINKDB \7Qb229?
DBCC SHRINKFILE 'f+NW&
3、压缩数据库 dy2rkV.z
dbcc shrinkdatabase(dbname) NgVR,G|1
4、转移数据库给新用户以已存在用户权限 R(G\wqHUT3
exec sp_change_users_login 'update_one','newname','oldname' v8m`jxII64
go ?sXG17~Bm
5、检查备份集 iCP~O
RESTORE VERIFYONLY from disk='E:\dvbbs.bak' Pz%~ST
6、修复数据库 &+01+-1hW
ALTER DATABASE [dvbbs] SET SINGLE_USER 9cG<hX9`F
GO ^]>aHz9
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK l'6d4
DZ
GO !77NG4B
ALTER DATABASE [dvbbs] SET MULTI_USER )MSZ2)(
GO +6l]] *H
7、日志清除 H=p`T+
SET NOCOUNT ON )#C
mQXgG
DECLARE @LogicalFileName sysname, zT[6eZ8m
@MaxMinutes INT, w^HjZV
@NewSize INT Qqc]aVRF
USE tablename -- 要操作的数据库名 e4\dpvL
SELECT @LogicalFileName = 'tablename_log', -- 日志文件名 ^2S# Uk
@MaxMinutes = 10, -- Limit on time allowed to wrap log. Z(e^ iH
@NewSize = 1 -- 你想设定的日志文件的大小(M) ?qmp_2:WU
-- Setup / initialize _'!kuE,*1
DECLARE @OriginalSize int :U'Cor
H
SELECT @OriginalSize = size e)@3m.
FROM sysfiles X:EEPGE
WHERE name = @LogicalFileName 7C7>y/uS
SELECT 'Original Size of ' + db_name() + ' LOG is ' + Q9c)k{QZ
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + #H~_K}Ks
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' \S ."?!U
FROM sysfiles P|xG\3@Z
WHERE name = @LogicalFileName O)]v;9oER
CREATE TABLE DummyTrans UV AJxqz%}
(DummyColumn char (8000) not null) /[=E0_t+
DECLARE @Counter INT, BI/&dKM
@StartTime DATETIME, I4=Xb^Ux
@TruncLog VARCHAR(255) =rFN1M/n{E
SELECT @StartTime = GETDATE(),
|yKud
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' &;c>O
DBCC SHRINKFILE (@LogicalFileName, @NewSize) 1/;o
EXEC (@TruncLog) vWjnI*6T#
-- Wrap the log if necessary. D#Kuo$
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired ^zr^ N?a
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName) n?xTkkr0
AND (@OriginalSize * 8 /1024) > @NewSize tU@zhGb
BEGIN -- Outer loop. nlc.u}#
SELECT @Counter = 0 -tLO.JK<
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
c5% 6Y2W0
BEGIN -- update C&<~f#lB
INSERT DummyTrans VALUES ('Fill Log') pHC/(6?
DELETE DummyTrans .c+9P<VmC}
SELECT @Counter = @Counter + 1 @?kJ).
END #_JYh?
EXEC (@TruncLog) Q@S-f:!
END $IX\O
SELECT 'Final Size of ' + db_name() + ' LOG is ' + 3n]79+w@z
CONVERT(VARCHAR(30),size) + ' 8K pages or ' + *
F4UAQzYb
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' nP3 E
FROM sysfiles UvJ;A
WHERE name = @LogicalFileName h6v07 7qG
DROP TABLE DummyTrans `<frgXu64
SET NOCOUNT OFF [f/I2
8、说明:更改某个表 B&0;4
exec sp_changeobjectowner 'tablename','dbo' =&nW~<- v
9、存储更改全部表 @'6"7g
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch /=: j9FF
@OldOwner as NVARCHAR(128), nw6pV%
@NewOwner as NVARCHAR(128) =9wy/c$
AS WsGths+[
DECLARE @Name as NVARCHAR(128) l\OLyQ
DECLARE @Owner as NVARCHAR(128) Dw6 fmyJ:
DECLARE @OwnerName as NVARCHAR(128) F3Maqr y
DECLARE curObject CURSOR FOR E4z)Mr#
select 'Name' = name, 6.WceWBR
'Owner' = user_name(uid) bHE2,;o
from sysobjects <vV_%uoM
where user_name(uid)=@OldOwner |nUl\WRd\
order by name %aRT>_6"
OPEN curObject -NJ!g/ >mM
FETCH NEXT FROM curObject INTO @Name, @Owner 7[pBUDA
WHILE(@@FETCH_STATUS=0) YHXLv#8
BEGIN nz]&a1"&
if @Owner=@OldOwner i)a%!1Ar
begin i3$$,W!
set @OwnerName = @OldOwner + '.' + rtrim(@Name) 2JGL;U$
exec sp_changeobjectowner @OwnerName, @NewOwner iUi>y.}"P
end |{>ER,<-
-- select @name,@NewOwner,@OldOwner }<a^</s
FETCH NEXT FROM curObject INTO @Name, @Owner Smw QET<H
END !69&Ld
close curObject zi@]83SS#
deallocate curObject &7e)O=
GO /] ^#b
10、SQL SERVER中直接循环写入数据 GL$De,V
declare @i int X{xBYZv4
set @i=1 #%0Bx3uM
while @i<30 KLW n?`
begin }_9,w;M$
insert into test (userid) values(@i) 942lSyix
set @i=@i+1 =q7Z qP
end j=RRfFg)
小记存储过程中经常用到的本周,本月,本年函数 as yZe
Dateadd(wk,datediff(wk,0,getdate()),-1) {i0SS
Dateadd(wk,datediff(wk,0,getdate()),6)
]:M0Kj&h
Dateadd(mm,datediff(mm,0,getdate()),0) H,unpZ(
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0)) I#F!N6;
Dateadd(yy,datediff(yy,0,getdate()),0) Q4*?1`IsR
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) dP?Ge}
上面的SQL代码只是一个时间段 fxaJZz$o
Dateadd(wk,datediff(wk,0,getdate()),-1) Z<[<n0o1
Dateadd(wk,datediff(wk,0,getdate()),6) \JEXX4%
就是表示本周时间段. 4`m~FNVS
下面的SQL的条件部分,就是查询时间段在本周范围内的: G2bDf-1ew
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6) x!LQxoNF
而在存储过程中 aT!'}GjL
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1) nfSbM3D]h
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6) nn/?fIZN4