SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。 M(S:&GOU
fN>o465I6
H6*d#!
一、基础 l23#"gGb
1、说明:创建数据库 -`B|$ W
CREATE DATABASE database-name #2&_WM!
2、说明:删除数据库 V4Ql6vg_f
drop database dbname .t0Q>:}&b
3、说明:备份sql server 5>JrTO5
--- 创建 备份数据的 device t8 #&bUX
USE master h4S,(*V$!
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' qI"@ PI!s
--- 开始 备份 pVPCxP
BACKUP DATABASE pubs TO testBack }0|,*BkI
m
4、说明:创建新表 o|AV2FM)
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 'cT R<LVo
根据已有的表创建新表: ep Eg6
A:create table tab_new like tab_old (使用旧表创建新表) 3j(GcR9
B:create table tab_new as select col1,col2... from tab_old definition only NS;,(v{*N
5、说明:删除新表 &aaXw?/zr
drop table tabname 9dr\=e6) C
6、说明:增加一个列 c63DuHA*C
Alter table tabname add column col type r+;op_
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 TB4|dj-%
7、说明:添加主键: Alter table tabname add primary key(col) *obBo6!zM
说明:删除主键: Alter table tabname drop primary key(col) kA{[k
8、说明:创建索引:create [unique] index idxname on tabname(col....) @]t} bF]
删除索引:drop index idxname {?17Zth
注:索引是不可更改的,想更改必须删除重新建。 m49GCo k+
9、说明:创建视图:create view viewname as select statement xf?*fm?m
删除视图:drop view viewname u!];RHOp|
10、说明:几个简单的基本的sql语句 {xp/1?Mo*
选择:select * from table1 where 范围 yNP
M-
插入:insert into table1(field1,field2) values(value1,value2) #)2'I`_E
删除:delete from table1 where 范围 lphQZ{8
更新:update table1 set field1=value1 where 范围 |[;9$Vn
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料! gh|TlvnA
排序:select * from table1 order by field1,field2 [desc] aRdzXq#x
总数:select count as totalcount from table1 DZ
|0CB~
求和:select sum(field1) as sumvalue from table1 7/w)^&8
平均:select avg(field1) as avgvalue from table1 iVLfAN @
最大:select max(field1) as maxvalue from table1 #TM+Vd$
最小:select min(field1) as minvalue from table1 J1T_wA_
&xo,49`!
anjU3j
x}$SB%9/
11、说明:几个高级查询运算词 ) RS*MEgA
Va"Q1 *"
+]
>o@
A: UNION 运算符 3,=97Si=
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 OaY.T
B: EXCEPT 运算符 oOlqlv
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 sa$CCQ
C: INTERSECT 运算符 eW,{E)x:
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 /]zn8d
注:使用运算词的几个查询结果行必须是一致的。 ^pruQp1X
12、说明:使用外连接 T^> ST
A、left outer join: 3oc p4x`[
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 Fcz7
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 jR[VPm=
B:right outer join: mQdF+b1o
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 MwbXZb{#"=
C:full outer join: 'c7C*6;a
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 Wu3or"lcw*
vqO d`_)
/9T.]H~
二、提升 3m%oXT
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) 5My4a9
法一:select * into b from a where 1<>1 qF'lh
法二:select top 0 * into b from a c\A
4-08
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) +~xY}
insert into b(a, b, c) select d,e,f from b; U )kl!
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) O|%03q(
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件 b9nTg
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. 4z<nJOEh[
4、说明:子查询(表名1:a 表名2:b) 4JQd/;
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) XhEZTg;
5、说明:显示文章、提交人和最后回复时间 WH|TdU$V
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b ZHu"&&
6、说明:外连接查询(表名1:a 表名2:b) ;] v{3m
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c Wo)$*?
7、说明:在线视图查询(表名1:a ) 'q>2WP|UY9
select * from (SELECT a,b,c FROM a) T where t.a > 1; /q1k)4?E
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 _[)f<`!g_V
select * from table1 where time between time1 and time2 HSwC4y}
select a,b,c, from table1 where a not between 数值1 and 数值2 "w7{,HP
9、说明:in 的使用方法 R+sv? 4k
select * from table1 where a [not] in ('值1','值2','值4','值6') ,9,cN-/a
10、说明:两张关联表,删除主表中已经在副表中没有的信息 }H#C<:A
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) Q|KD$2rB
11、说明:四表联查问题: Z
FIy
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 ..... ?)NgODU
12、说明:日程安排提前五分钟提醒 !NqLBrcv 0
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 *.us IH2
13、说明:一条sql 语句搞定数据库分页 u.yYE,9
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 -HwqR Ys
14、说明:前10条记录 2CMWJi
select top 10 * form table1 where 范围 f;D(X/"f]
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) a``/x_EZMn
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) 8Y"R@'~
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 Xr."C(`w
(select a from tableA ) except (select a from tableB) except (select a from tableC) r S>@>8k2,
17、说明:随机取出10条数据 ^O.` P
select top 10 * from tablename order by newid() 9y'To JZ6
18、说明:随机选择记录 Y sDai<
select newid() A&N$=9.N1
19、说明:删除重复记录 ~%eZQgqA*
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) j'x@P+A
20、说明:列出数据库里所有的表名 \E
{'|
select name from sysobjects where type='U' |.OS7Gt?
21、说明:列出表里的所有的 w-];!;%
select name from syscolumns where id=object_id('TableName') [jz@d\k$_
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 r}:Dg
fn
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 qXprD.; }
显示结果: vYybQ&E/
type vender pcs w1EB>!<;tj
电脑 A 1 }0Q
T5
电脑 A 1 9=J 3T66U
光盘 B 2 !a4`SjOgu
光盘 A 2 m2%n:
手机 B 3 ~OMo$qt`lP
手机 C 3 xyP0haE
23、说明:初始化表table1 u+9)B 6O1
TRUNCATE TABLE table1 n5 <B*
24、说明:选择从10到15的记录 ta@fNS4
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc 8Ow#W5_3|
Jt:)(&-t
|['SiO$)
DoNN;^H
三、技巧 D;h JK-Y
1、1=1,1=2的使用,在SQL语句组合时用的较多 e#vGrLs.
"where 1=1" 是表示选择全部 "where 1=2"全部不选, RA!8AS?
如: HqI[]T@
if @strWhere !='' BI<(]`FP;s
begin B~E>=85z
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere g*-}9~
end >[N6_*K]
else ac,<+y7A
begin J|@O4g
set @strSQL = 'select count(*) as Total from [' + @tblName + ']' q&&uX-ez5W
end m2l0`l~T8
我们可以直接写成 ? <w[ZWytm
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere *&5./WEOH
2、收缩数据库 J[UTn'M8]
--重建索引 ^U^K\rq 1u
DBCC REINDEX pf#R]
DBCC INDEXDEFRAG BwYR"
--收缩数据和日志 =y^g*9}_
DBCC SHRINKDB "HLh3L~
DBCC SHRINKFILE S] 4RGWn
3、压缩数据库 DG=_E\"#
dbcc shrinkdatabase(dbname) -aDBdZ;y
4、转移数据库给新用户以已存在用户权限 cef:>>6_
exec sp_change_users_login 'update_one','newname','oldname' :4>LtfA
go lrgvY>E0
5、检查备份集
=T$2Qo8
RESTORE VERIFYONLY from disk='E:\dvbbs.bak' FC4hvO(/m
6、修复数据库 oMxpdG3y-
ALTER DATABASE [dvbbs] SET SINGLE_USER SIzA0
GO :FixLr!q
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK {!t6&
A
GO C?rb}(m
ALTER DATABASE [dvbbs] SET MULTI_USER +p-S36K~,7
GO 6f
J5Y
iQ
7、日志清除 _Ry
SET NOCOUNT ON 'l1cuAP!+
DECLARE @LogicalFileName sysname, c ;'7o=rr
@MaxMinutes INT, 6a6N$v"
@NewSize INT P!/:yWd
USE tablename -- 要操作的数据库名 WhL"-f
SELECT @LogicalFileName = 'tablename_log', -- 日志文件名 &qV_|f;
@MaxMinutes = 10, -- Limit on time allowed to wrap log. i;#AW($+a
@NewSize = 1 -- 你想设定的日志文件的大小(M) ,27=i>>
-- Setup / initialize zENo2#{_N
DECLARE @OriginalSize int )7F$:*e
SELECT @OriginalSize = size mW."lzIl
FROM sysfiles Csm23QLsg)
WHERE name = @LogicalFileName ."j*4
SELECT 'Original Size of ' + db_name() + ' LOG is ' + zQtx!k=
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + z"!=A}i
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' 0urM@/j+
FROM sysfiles y|%lw%cSe
WHERE name = @LogicalFileName ! ?m8UE
CREATE TABLE DummyTrans zh4m`}p
(DummyColumn char (8000) not null) L;'v,s
DECLARE @Counter INT, .Tc?9X~4
@StartTime DATETIME, 7=4V1FS6i
@TruncLog VARCHAR(255) ":^cb =
SELECT @StartTime = GETDATE(), ;4(FS
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' Q#I?nBin
DBCC SHRINKFILE (@LogicalFileName, @NewSize) 7/Mhz{o;W
EXEC (@TruncLog) n4EZy<~m
-- Wrap the log if necessary. 4Bq4d.0
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired !%YV0O0
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName) K-7i4
~
AND (@OriginalSize * 8 /1024) > @NewSize UyOoyyd.
BEGIN -- Outer loop. mr`EcO0
SELECT @Counter = 0 j*1O(p+
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) ON$-g_s>)
BEGIN -- update B ? D|B
INSERT DummyTrans VALUES ('Fill Log') [3hOc/]s
DELETE DummyTrans CFx$r_!~
SELECT @Counter = @Counter + 1 n5 jzVv
END GwZ(3
EXEC (@TruncLog) \YsYOFc|
END t>%J3S>'ZV
SELECT 'Final Size of ' + db_name() + ' LOG is ' + 3+ r8yiY
CONVERT(VARCHAR(30),size) + ' 8K pages or ' + 4O3-PU>N
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' sMAu*
FROM sysfiles 97(*-e= e
WHERE name = @LogicalFileName ~uz 4
DROP TABLE DummyTrans RgT|^|ZA
SET NOCOUNT OFF \LpR7D
8、说明:更改某个表 4&([<gyR<
exec sp_changeobjectowner 'tablename','dbo' o@KK/f
9、存储更改全部表 4q\bnt
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch <;Bv6.Z
@OldOwner as NVARCHAR(128), ]J7.d$7T
@NewOwner as NVARCHAR(128) rSvQarT
AS !z]2+
DECLARE @Name as NVARCHAR(128) &*N;yW""f
DECLARE @Owner as NVARCHAR(128) O
o+pi$W
DECLARE @OwnerName as NVARCHAR(128) 7}e73
DECLARE curObject CURSOR FOR B#K{Y$!v
select 'Name' = name, na1*^S`[
'Owner' = user_name(uid) >FabmIcC
from sysobjects L^0s
where user_name(uid)=@OldOwner Qs5^kddz=
order by name 3B5GsI
OPEN curObject Yq?FiE0
FETCH NEXT FROM curObject INTO @Name, @Owner >3a<#s{%
WHILE(@@FETCH_STATUS=0) a.yCd/
BEGIN sox0:9Oqnf
if @Owner=@OldOwner s8/y|HN^
begin 0qj:v"~Q
set @OwnerName = @OldOwner + '.' + rtrim(@Name) =k\V~8XZ
exec sp_changeobjectowner @OwnerName, @NewOwner ZCAdCKX|
end BB694
-- select @name,@NewOwner,@OldOwner W5^m[,GU'
FETCH NEXT FROM curObject INTO @Name, @Owner ;5bzXW#U
END aIl}|n"
close curObject %9!,PeRe
deallocate curObject {m)$ b
GO .MzVc42<
10、SQL SERVER中直接循环写入数据 Az}.Z'LJ
declare @i int 1@)kNg)*$
set @i=1 #MyR:V*a
while @i<30 ]c.1&OB7o
begin x9s7:F
insert into test (userid) values(@i) (|EnRk-E
set @i=@i+1 t0 1@h_WS
end G98P<cyD
小记存储过程中经常用到的本周,本月,本年函数 I$Bu6x!
Dateadd(wk,datediff(wk,0,getdate()),-1) w@&4dau
Dateadd(wk,datediff(wk,0,getdate()),6) WPmH4L>T
Dateadd(mm,datediff(mm,0,getdate()),0) c&{1Z&Y
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0)) S4m??B
Dateadd(yy,datediff(yy,0,getdate()),0) %MQU&H9[
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) *f[nge&.
上面的SQL代码只是一个时间段 a5/6DK>
Dateadd(wk,datediff(wk,0,getdate()),-1) Kyz!YB
Dateadd(wk,datediff(wk,0,getdate()),6) mIK-a{?G
就是表示本周时间段. F%t_9S,)O
下面的SQL的条件部分,就是查询时间段在本周范围内的: OR &'
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6) eD4qh4|u.
而在存储过程中 .$r=:k_d
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1) INi9`M.h
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6) _(K )(&