社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 社区论坛任务 迷你宠物
  • 4596阅读
  • 0回复

[转贴]精妙SQL语句收集

级别: 店掌柜
发帖
5692
铜板
103378
人品值
1520
贡献值
26
交易币
0
好评度
5373
信誉值
0
金币
0
所在楼道

SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。 rD 3v$B  
[_EZhq  
K  &N  
一、基础 ;~m8;8)  
1、说明:创建数据库 ]>5/PD,wWy  
CREATE DATABASE database-name a .k.n<  
2、说明:删除数据库 X}Ai -D  
drop database dbname rX2.i7i,  
3、说明:备份sql server yb\_zE\  
--- 创建 备份数据的 device )"7iJb<E  
USE master #Lh;CSS  
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' !Dn,^  
--- 开始 备份 iv J@=pd)B  
BACKUP DATABASE pubs TO testBack *RJG!t*t  
4、说明:创建新表 KW pVw!  
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) *`5.|{<j{  
根据已有的表创建新表: 8p 'L#Q.  
A:create table tab_new like tab_old (使用旧表创建新表) pmyXLT  
B:create table tab_new as select col1,col2... from tab_old definition only LTQ"8  
5、说明:删除新表 #lL^?|M  
drop table tabname )q8pk2  
6、说明:增加一个列 rZ}:Z'`  
Alter table tabname add column col type #A JDWelD  
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 a%JuC2  
7、说明:添加主键: Alter table tabname add primary key(col) V^bwXr4f  
说明:删除主键: Alter table tabname drop primary key(col) - M4J JV(  
8、说明:创建索引:create [unique] index idxname on tabname(col....) Nk? ^1n$  
删除索引:drop index idxname *av<E  
注:索引是不可更改的,想更改必须删除重新建。 z!ZtzD]cb  
9、说明:创建视图:create view viewname as select statement <lPm1/8  
删除视图:drop view viewname y.mda:$~=  
10、说明:几个简单的基本的sql语句 /T0F"e)Ci  
选择:select * from table1 where 范围 FrGgga$  
插入:insert into table1(field1,field2) values(value1,value2) PUMXOTu]  
删除:delete from table1 where 范围 PR#exm&  
更新:update table1 set field1=value1 where 范围 3nO]Ge"w'n  
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料! o,\$ZxSlm  
排序:select * from table1 order by field1,field2 [desc] pP&7rRhw  
总数:select count as totalcount from table1 U)] oO  
求和:select sum(field1) as sumvalue from table1 l*Gvf_UH  
平均:select avg(field1) as avgvalue from table1 &N^9JxN?8  
最大:select max(field1) as maxvalue from table1 +SR+gE\s0  
最小:select min(field1) as minvalue from table1  dVtG/0  
4yy>jXDG  
g[' ^L +hd  
q$d>(vb q  
11、说明:几个高级查询运算词 C!<Ou6}!b  
@e.C"@G  
_YhES-Ff  
A: UNION 运算符 |.: q  
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 Cgk<pky1  
B: EXCEPT 运算符 MS~(D.@ZS  
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 -V77C^()8d  
C: INTERSECT 运算符 f643#1  
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 {L{o]Ii?g  
注:使用运算词的几个查询结果行必须是一致的。 J5K^^RUR  
12、说明:使用外连接 %v M-mbX  
A、left outer join: XJ;57n-?  
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 ( Y[Q,  
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 Ko<:Z)PS  
B:right outer join: `,<BCu  
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 `KoV_2|  
C:full outer join: me$Z~/Akm  
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 I{ C SH  
{UI+$/v#  
n:?a$Ldgm  
二、提升 g wRZ%.Cn  
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) =4YhG;%  
法一:select * into b from a where 1<>1 Rsm^Z!sn  
法二:select top 0 * into b from a &jJL"gq"  
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) L ca}J&x]^  
insert into b(a, b, c) select d,e,f from b; AO4U}?  
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) $t[FH&c(  
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件 `Y$4 H,8L  
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. s2V:cMXFn  
4、说明:子查询(表名1:a 表名2:b) & '`g#N  
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) iOghb*aW  
5、说明:显示文章、提交人和最后回复时间 Dw.J2>uj  
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b -`h)$&,  
6、说明:外连接查询(表名1:a 表名2:b) H/ HMm{4  
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c ITI)soa~  
7、说明:在线视图查询(表名1:a ) ""G'rN_=Bi  
select * from (SELECT a,b,c FROM a) T where t.a > 1; U?Zq6_M&  
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 \!ZTL1b8t  
select * from table1 where time between time1 and time2 +~$ ]} %  
select a,b,c, from table1 where a not between 数值1 and 数值2 )Nw8O{\  
9、说明:in 的使用方法 j</: WRA`]  
select * from table1 where a [not] in ('值1','值2','值4','值6') .|70;  
10、说明:两张关联表,删除主表中已经在副表中没有的信息 %5n_ p^xp  
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) [}=B8#Jl-C  
11、说明:四表联查问题: G9cUD[GB  
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 ..... !*N@ZL&X  
12、说明:日程安排提前五分钟提醒 ]w8(&,PP  
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 |u<7?)mp  
13、说明:一条sql 语句搞定数据库分页 hL{KRRf>  
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 yNBfUj -L  
14、说明:前10条记录 ea 'D td  
select top 10 * form table1 where 范围 Bj;'qB>3  
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) ~B?y{  
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) '-~~-}= sJ  
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 / zPO  
(select a from tableA ) except (select a from tableB) except (select a from tableC) z Rr*7G  
17、说明:随机取出10条数据 m-#2n? z-  
select top 10 * from tablename order by newid() ( Erc3Ac8  
18、说明:随机选择记录 JK5gQ3C[  
select newid() Wh*uaad7  
19、说明:删除重复记录 VpDbHAg  
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) 9W2Vo [(  
20、说明:列出数据库里所有的表名 ggR.4&<  
select name from sysobjects where type='U' )3EY;  
21、说明:列出表里的所有的 Kn1a>fLaJ_  
select name from syscolumns where id=object_id('TableName') /y}xX  
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 '5$b-x6F  
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 )Ql%r?(F+  
显示结果: /*mI<[xb  
type vender pcs E:nF$#<'N  
电脑 A 1 + cN8Y}V  
电脑 A 1 *z8\Lnv~k  
光盘 B 2 2P0*NQ   
光盘 A 2 eeB{c.#  
手机 B 3 /PIcqg  
手机 C 3 4H&+dR I"  
23、说明:初始化表table1 _q-*7hCQ`  
TRUNCATE TABLE table1 h2d(?vOT  
24、说明:选择从10到15的记录 VMWf>ZU  
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc $ddCTS^  
4,DeHJjAlE  
}pkzH'$HJ  
oCz/HQoBk  
三、技巧 .?$gpM?i  
1、1=1,1=2的使用,在SQL语句组合时用的较多 k9L;!TH~1K  
"where 1=1" 是表示选择全部  "where 1=2"全部不选, Ysv" 6b}  
如: 'D1xh~  
if @strWhere !='' >z@0.pN]7  
begin Q\Vgl(;lX  
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere sXFZWj }\  
end \'O"~W  
else 5nx1i  
begin }N52$L0[  
set @strSQL = 'select count(*) as Total from [' + @tblName + ']' Qo|\-y-#  
end qIT@g"%}t  
我们可以直接写成 7@W>E;go  
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere p4Z(^+Aa  
2、收缩数据库 3!_XEN[  
--重建索引 f3y=Wxk[  
DBCC REINDEX G18b$z  
DBCC INDEXDEFRAG |2A:eI8 ^  
--收缩数据和日志 3ckclO\|>  
DBCC SHRINKDB 'LDQgC*%  
DBCC SHRINKFILE 7b+6%fV  
3、压缩数据库 P]C<U aW'!  
dbcc shrinkdatabase(dbname) d&>^&>?$zh  
4、转移数据库给新用户以已存在用户权限 %8v\FS  
exec sp_change_users_login 'update_one','newname','oldname' [dz _R  
go I7 ]8Y=xf  
5、检查备份集 '~ 47)fN  
RESTORE VERIFYONLY from disk='E:\dvbbs.bak' Zv{'MIv&v  
6、修复数据库 <F'\lA9  
ALTER DATABASE [dvbbs] SET SINGLE_USER *{5fq_  
GO gjlx~.0d  
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK /yZcDK4  
GO Q+{n-? :  
ALTER DATABASE [dvbbs] SET MULTI_USER Q/Rqa5LI:  
GO #w=~lq)9  
7、日志清除 yB!dp;gM{  
SET NOCOUNT ON BTxrp  
DECLARE @LogicalFileName sysname, `WS&rmq&'  
        @MaxMinutes INT, B33\?Yj)  
        @NewSize INT /gas2k==^  
USE    tablename            -- 要操作的数据库名 l U]nd[x  
SELECT  @LogicalFileName = 'tablename_log',  -- 日志文件名 @ N m@]q  
@MaxMinutes = 10,              -- Limit on time allowed to wrap log. # f\rt   
        @NewSize = 1                  -- 你想设定的日志文件的大小(M) [#iz/q~}  
-- Setup / initialize 0n'_{\yz  
DECLARE @OriginalSize int  ~$J2g  
SELECT @OriginalSize = size !<F3d`a  
  FROM sysfiles w32y3~  
  WHERE name = @LogicalFileName ! d gNtI@  
SELECT 'Original Size of ' + db_name() + ' LOG is ' + y1#1Ne_  
        CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + $:^td/p J  
        CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' 7j{?aza  
  FROM sysfiles 19] E 5'AI  
  WHERE name = @LogicalFileName  Fk;Rfqq  
CREATE TABLE DummyTrans @(lh%@hO  
  (DummyColumn char (8000) not null) 'N(R_q6MW  
DECLARE @Counter  INT, {.]7!ISl5  
        @StartTime DATETIME, 'c~4+o4co  
        @TruncLog  VARCHAR(255) pK4)yu+  
SELECT  @StartTime = GETDATE(), [N'h%1]\  
        @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' lLIA w$  
DBCC SHRINKFILE (@LogicalFileName, @NewSize) 1E$|~   
EXEC (@TruncLog) "Y.y:Vv;  
-- Wrap the log if necessary. to&m4+5?6  
WHILE    @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired H"F29Pu2  
      AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)  (V@HR9?W)  
      AND (@OriginalSize * 8 /1024) > @NewSize  dF2RH)Ud  
  BEGIN -- Outer loop. J~- 4C)  
    SELECT @Counter = 0 C9;kpqNG#u  
    WHILE  ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) d d;T-wa}  
      BEGIN -- update "Rl}VeDY  
        INSERT DummyTrans VALUES ('Fill Log')  @%SQFu@FJ  
        DELETE DummyTrans LIrb6g&xj_  
        SELECT @Counter = @Counter + 1 {xB3S_,8  
      END  :E?V.  
    EXEC (@TruncLog)  S,=|AD  
  END  fc@A0Hf  
SELECT 'Final Size of ' + db_name() + ' LOG is ' + 4GM6)"#d  
        CONVERT(VARCHAR(30),size) + ' 8K pages or ' + DV{=n C  
        CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' )`}:8y?  
  FROM sysfiles ;wD)hNLAvR  
  WHERE name = @LogicalFileName wA.\i  
DROP TABLE DummyTrans =\d?'dII:  
SET NOCOUNT OFF i mM_H;-X  
8、说明:更改某个表 Ap !lQ>p  
exec sp_changeobjectowner 'tablename','dbo' J8D,ZfPN`d  
9、存储更改全部表 .|=\z9_7S8  
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch L%5%T;0'~  
@OldOwner as NVARCHAR(128), 92-I~ !d  
@NewOwner as NVARCHAR(128) FPTK`Gd0  
AS |K~Nw&rZ]  
DECLARE @Name  as NVARCHAR(128) mV m Gg,  
DECLARE @Owner  as NVARCHAR(128) xLn%hxm?,  
DECLARE @OwnerName  as NVARCHAR(128) YbLW/E\T  
DECLARE curObject CURSOR FOR q'11^V!0  
select 'Name'  = name, ,[;G|et  
  'Owner'  = user_name(uid) BORA(,  
from sysobjects G / 5%.Bf@  
where user_name(uid)=@OldOwner  C.QO#b  
order by name B\n[.(].r  
OPEN  curObject L8n|m!MOD  
FETCH NEXT FROM curObject INTO @Name, @Owner "h ^Z  
WHILE(@@FETCH_STATUS=0) 5:U so{  
BEGIN    tI{_y  
if @Owner=@OldOwner {^\r`V p  
begin /Q )\+  
  set @OwnerName = @OldOwner + '.' + rtrim(@Name) h.fq,em+H  
  exec sp_changeobjectowner @OwnerName, @NewOwner \di=  
end )_NO4`ejs/  
-- select @name,@NewOwner,@OldOwner \(T /O~b2  
FETCH NEXT FROM curObject INTO @Name, @Owner ;=UsAB]  
END rN{ c7/|  
close curObject i@CxI<1'  
deallocate curObject [8*)8jP3  
GO W'.m'3#z  
10、SQL SERVER中直接循环写入数据 { BHO/q3  
declare @i int t0I{q0  
set @i=1 lHIM}~#;nd  
while @i<30 8.~kK<)!  
begin :j`s r  
  insert into test (userid) values(@i) -!9G0h&i|  
  set @i=@i+1 '%`:+]!  
end l lsfTrp  
小记存储过程中经常用到的本周,本月,本年函数 snikn&  
Dateadd(wk,datediff(wk,0,getdate()),-1) 'P}0FktP`  
Dateadd(wk,datediff(wk,0,getdate()),6) ,v&(YOd  
Dateadd(mm,datediff(mm,0,getdate()),0)  RX5dO%  
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0)) A+)`ZTuO  
Dateadd(yy,datediff(yy,0,getdate()),0) Hq 188<  
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) Xs?o{]Fe  
上面的SQL代码只是一个时间段 C6y&#uX\  
Dateadd(wk,datediff(wk,0,getdate()),-1) :a)u&g@G  
Dateadd(wk,datediff(wk,0,getdate()),6) NgCvVWto  
就是表示本周时间段. &! ?eL  
下面的SQL的条件部分,就是查询时间段在本周范围内的: *WT`o>  
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6) 1sH& sGy7  
而在存储过程中 6MkP |vr6  
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1) J)C/u{o  
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6) O0y_Lm\  
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

简单生活
执著追求
别笑我浅溥,天真的以为用一腔真诚就能感动这个冷漠的世界。
也别说我幼稚,竟想用不长的人生去诠释繁杂的红尘。
然而除了真诚,我还能给你什么,的确我真的一无所有!

描述
快速回复

您目前还是游客,请 登录注册
温馨提示:欢迎交流讨论,请勿纯表情、纯引用!
认证码:
验证问题:
10+5=?,请输入中文答案:十五