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

[转贴]精妙SQL语句收集

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

SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。 rTiuQdvo  
w8@|b}  
"@|V.d@  
一、基础 k <Sa<  
1、说明:创建数据库 :[?o7%"  
CREATE DATABASE database-name 'GO..m"G  
2、说明:删除数据库 2/gj@>dt  
drop database dbname T`DlOi]Z_  
3、说明:备份sql server rca"q[,  
--- 创建 备份数据的 device F(n))`(  
USE master ",@g  
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' Xg#([}b  
--- 开始 备份 ]6 7wk  
BACKUP DATABASE pubs TO testBack |,~A9  
4、说明:创建新表 L}pFb@  
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) *)SgdC/f  
根据已有的表创建新表: n>+W]I&E  
A:create table tab_new like tab_old (使用旧表创建新表) `\uv+^x{  
B:create table tab_new as select col1,col2... from tab_old definition only pKlT.<X7  
5、说明:删除新表 S|h  m  
drop table tabname z4UQ:z@  
6、说明:增加一个列 `^h##WaXap  
Alter table tabname add column col type @G{DOxE*  
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 iiFKt(  
7、说明:添加主键: Alter table tabname add primary key(col) AiI# "  
说明:删除主键: Alter table tabname drop primary key(col) ~Q\ZDMTK  
8、说明:创建索引:create [unique] index idxname on tabname(col....) Q$5:P&  
删除索引:drop index idxname (ZSSp1R v  
注:索引是不可更改的,想更改必须删除重新建。 '0]_8Sy&  
9、说明:创建视图:create view viewname as select statement cuk}VZ  
删除视图:drop view viewname AUpC HG7  
10、说明:几个简单的基本的sql语句 At|tk  
选择:select * from table1 where 范围 laJ%fBWmbi  
插入:insert into table1(field1,field2) values(value1,value2) w~-d4MNM  
删除:delete from table1 where 范围 6$.Xj\zl  
更新:update table1 set field1=value1 where 范围 |hyr(7  
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料! hfc!M2/w  
排序:select * from table1 order by field1,field2 [desc] @Ec9Do>  
总数:select count as totalcount from table1 >#|Q,hVU5  
求和:select sum(field1) as sumvalue from table1 daNIP1Qn  
平均:select avg(field1) as avgvalue from table1 /;ITnG  
最大:select max(field1) as maxvalue from table1 "Y0[rSz,UW  
最小:select min(field1) as minvalue from table1 |0%UM}  
Jxp'.oo[  
nuA!Jln_  
J#WPXE+Ds  
11、说明:几个高级查询运算词 Kf5p* AI  
_kLoDju%  
C#0Wo  
A: UNION 运算符 ]<= t  
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 sVnu Sm  
B: EXCEPT 运算符 #nhAW  
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 g?M69~G$:x  
C: INTERSECT 运算符 r!uAofIi_  
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 &|;!St]!M  
注:使用运算词的几个查询结果行必须是一致的。 U#4W"1~iX  
12、说明:使用外连接 ".Ug A\0  
A、left outer join: wQ.zj`?$(  
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 Zt=X %M|aw  
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 9q{dRS[A  
B:right outer join: |7fBiVo  
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 XITQB|C??$  
C:full outer join: *?'T8yf^  
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 B9-=.2.WU  
,:,|A/U  
9] \vw  
二、提升 5+Ut]AL5  
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) \ed(<e>  
法一:select * into b from a where 1<>1 NQD b;5:  
法二:select top 0 * into b from a  i9"1  
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) 3!x)LUWfWY  
insert into b(a, b, c) select d,e,f from b; )9->]U@  
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) (*]Y<ve  
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件 hn .fX:}  
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. mqw.v$>  
4、说明:子查询(表名1:a 表名2:b) aQ. \!&U  
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) ha 5\T'  
5、说明:显示文章、提交人和最后回复时间 WG n1pW  
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b jnY4(B   
6、说明:外连接查询(表名1:a 表名2:b) 8uiQm;W  
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c PGGJpD?  
7、说明:在线视图查询(表名1:a ) JTJ4a8DE  
select * from (SELECT a,b,c FROM a) T where t.a > 1; Az[z} r4  
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 ,-Gw#!0  
select * from table1 where time between time1 and time2 L|?tcic  
select a,b,c, from table1 where a not between 数值1 and 数值2 Q1yTDJ(2  
9、说明:in 的使用方法 C5z4%,`f  
select * from table1 where a [not] in ('值1','值2','值4','值6') i/Z5/(zF  
10、说明:两张关联表,删除主表中已经在副表中没有的信息 70~]J8T+u  
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) na)_8r~  
11、说明:四表联查问题: m|[ Hhw=f  
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 ..... |/$#G0X;H  
12、说明:日程安排提前五分钟提醒 3u<2~!sR  
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 ZW"J]"A  
13、说明:一条sql 语句搞定数据库分页 $mlcaH  
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 #'P&L>6 ;  
14、说明:前10条记录 ^;d;b<  
select top 10 * form table1 where 范围 /_8V+@im  
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) G39t'^ZK*#  
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) v\vn}/>*d  
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 8iRQPV-"_  
(select a from tableA ) except (select a from tableB) except (select a from tableC) fkM4u<R^  
17、说明:随机取出10条数据 Tj:F Qnx  
select top 10 * from tablename order by newid() 9q?gmAn.  
18、说明:随机选择记录 }$ der  
select newid() e{=$4F  
19、说明:删除重复记录  o~B=[  
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)  "(xu  
20、说明:列出数据库里所有的表名 AXFVsZH"zi  
select name from sysobjects where type='U' 0OXd*  
21、说明:列出表里的所有的 :&MiO3#+  
select name from syscolumns where id=object_id('TableName') 04:Dbt~=?p  
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 4Ki'r&L\  
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 y\x<!_&D  
显示结果: Cpl)byb  
type vender pcs qI}Zg)q]  
电脑 A 1 sr4K-|@  
电脑 A 1 ORNE>6J H  
光盘 B 2 ~7v^7;tT  
光盘 A 2 2bmppDk  
手机 B 3 _4+1c5Q!  
手机 C 3 ,7aqrg  
23、说明:初始化表table1 }V{, kK  
TRUNCATE TABLE table1  I g`#U~  
24、说明:选择从10到15的记录 p%BO:%v  
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc r\zK>GVm_  
0#G"{M  
M6>l%[  
a%kj)ah  
三、技巧 @gd-lcMYW  
1、1=1,1=2的使用,在SQL语句组合时用的较多 UOyP6ej  
"where 1=1" 是表示选择全部  "where 1=2"全部不选, +x`tvo  
如: Dqki}k~{  
if @strWhere !='' 9I9)5`d|Jn  
begin Y+E@afsKs  
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere rqIt}(J  
end Z(s} #-  
else `&o|=  
begin  Cfi5r|S  
set @strSQL = 'select count(*) as Total from [' + @tblName + ']' R9HRbVBJf  
end "3K0 wR5  
我们可以直接写成 <"-sN  
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere |67UN U  
2、收缩数据库 *m7e>]-  
--重建索引 ZISR]xay  
DBCC REINDEX ;-3M  
DBCC INDEXDEFRAG W$y?~2  
--收缩数据和日志 aPbHrk*/  
DBCC SHRINKDB uo0(W3Q *  
DBCC SHRINKFILE 3jQ |C=   
3、压缩数据库 I^o^@C  
dbcc shrinkdatabase(dbname) 975KRnj  
4、转移数据库给新用户以已存在用户权限 rpvm].4  
exec sp_change_users_login 'update_one','newname','oldname' L:31toGK  
go _T1e##Sq,  
5、检查备份集 '{|87kI  
RESTORE VERIFYONLY from disk='E:\dvbbs.bak' Cs$g]&a  
6、修复数据库 t6tqv  
ALTER DATABASE [dvbbs] SET SINGLE_USER #(7OvW+y  
GO ]b[ 3 th*  
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK }.Ug`7%G  
GO %V$^CWOy  
ALTER DATABASE [dvbbs] SET MULTI_USER hX^XtIC=  
GO R75sK(oS  
7、日志清除 54k Dez  
SET NOCOUNT ON >+1bTt/-F  
DECLARE @LogicalFileName sysname, TnC'<zm9 !  
        @MaxMinutes INT, x@/ !H<y  
        @NewSize INT S +He  
USE    tablename            -- 要操作的数据库名 SXhJz=h  
SELECT  @LogicalFileName = 'tablename_log',  -- 日志文件名 v K$W)(Z  
@MaxMinutes = 10,              -- Limit on time allowed to wrap log. dCinbAQ  
        @NewSize = 1                  -- 你想设定的日志文件的大小(M)  d00r&Mc  
-- Setup / initialize 9O|m# &wa]  
DECLARE @OriginalSize int @? t)UE  
SELECT @OriginalSize = size b_B4  
  FROM sysfiles L U7.  
  WHERE name = @LogicalFileName (* p |Kzu  
SELECT 'Original Size of ' + db_name() + ' LOG is ' + hfY2pG9N  
        CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + ! _QU-  
        CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' 6K,AQ.=V2  
  FROM sysfiles )t|M)zJ  
  WHERE name = @LogicalFileName _H-Lt{k  
CREATE TABLE DummyTrans :5dq<>~  
  (DummyColumn char (8000) not null) ,Rf<6/A  
DECLARE @Counter  INT, 7 `|- K  
        @StartTime DATETIME, (LnKaf8  
        @TruncLog  VARCHAR(255) \X(.%5xC  
SELECT  @StartTime = GETDATE(), Wg#>2)>  
        @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' <h^vl-L>  
DBCC SHRINKFILE (@LogicalFileName, @NewSize) 0s(G*D2%6  
EXEC (@TruncLog) 8garRB{  
-- Wrap the log if necessary. ~;MRQE  
WHILE    @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired lwV#j}G  
      AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)  f>Ge Em~  
      AND (@OriginalSize * 8 /1024) > @NewSize  + 5 05  
  BEGIN -- Outer loop. G-Y8<mEh  
    SELECT @Counter = 0 Baq&>]  
    WHILE  ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) s01n[jQ  
      BEGIN -- update 5YRa2#d  
        INSERT DummyTrans VALUES ('Fill Log')  AH;h#dT  
        DELETE DummyTrans F&ux9zP  
        SELECT @Counter = @Counter + 1 T8v>J4@t  
      END  1>n@`M8}  
    EXEC (@TruncLog)  IF<jq\M  
  END  z+;+c$X  
SELECT 'Final Size of ' + db_name() + ' LOG is ' + XXO   
        CONVERT(VARCHAR(30),size) + ' 8K pages or ' + huO_ARwK'  
        CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' -(Yq$5Zc&  
  FROM sysfiles aC;OFINK  
  WHERE name = @LogicalFileName y3d`$'7H>  
DROP TABLE DummyTrans C}7Sh6  
SET NOCOUNT OFF JVN0];IL}  
8、说明:更改某个表 7%C6gU!r  
exec sp_changeobjectowner 'tablename','dbo' 6L8wsz CW  
9、存储更改全部表 0DGXMO$;  
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch T$SGf.-  
@OldOwner as NVARCHAR(128), }LOAT$]XI  
@NewOwner as NVARCHAR(128) ?v6xa Vg:  
AS {>90d(j  
DECLARE @Name  as NVARCHAR(128) [/'W#x  
DECLARE @Owner  as NVARCHAR(128) oB+drDp8U  
DECLARE @OwnerName  as NVARCHAR(128) x2 l~aw#?  
DECLARE curObject CURSOR FOR e~xN[Q\0]  
select 'Name'  = name, *M09Y'5]  
  'Owner'  = user_name(uid) xM[m(m  
from sysobjects Zhf+u r  
where user_name(uid)=@OldOwner 4v Ug:'DM  
order by name yH irm|o  
OPEN  curObject u1rT:\G1  
FETCH NEXT FROM curObject INTO @Name, @Owner y4+Km*am,W  
WHILE(@@FETCH_STATUS=0) Oo$i,|$$  
BEGIN    usU5q>1  
if @Owner=@OldOwner | X! d*4  
begin nzU^G)  
  set @OwnerName = @OldOwner + '.' + rtrim(@Name) ]e!9{\X,*  
  exec sp_changeobjectowner @OwnerName, @NewOwner Y'0H2B8  
end dxsPX =\:  
-- select @name,@NewOwner,@OldOwner |%Pd*yZA  
FETCH NEXT FROM curObject INTO @Name, @Owner CnN PziB  
END ~8Z)e7 j  
close curObject uvi+#4~G  
deallocate curObject ,-D3tleu`  
GO Ns Pt1_ Y8  
10、SQL SERVER中直接循环写入数据 n' &:c}zKO  
declare @i int `-IX"rf  
set @i=1 lx(kbSxF  
while @i<30 :hC+r=!I  
begin T:dV[3  
  insert into test (userid) values(@i) "|`euxYV  
  set @i=@i+1 )17CG*K1  
end )k$ +T%  
小记存储过程中经常用到的本周,本月,本年函数 V_^p?Fi #  
Dateadd(wk,datediff(wk,0,getdate()),-1) M] 7#  
Dateadd(wk,datediff(wk,0,getdate()),6) /GRkQ",  
Dateadd(mm,datediff(mm,0,getdate()),0) WTbq)D(&[_  
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0)) E&9BeU a#  
Dateadd(yy,datediff(yy,0,getdate()),0) 22$M6Qof]n  
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) {%gMA?b|"  
上面的SQL代码只是一个时间段 zb.dVK`7N-  
Dateadd(wk,datediff(wk,0,getdate()),-1) d#NG]V/   
Dateadd(wk,datediff(wk,0,getdate()),6) G*^4+^Vz?  
就是表示本周时间段. GUSEbIz):  
下面的SQL的条件部分,就是查询时间段在本周范围内的: )H8Rfn?  
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6) Dn~c  
而在存储过程中 yH/m@#  
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1) _TEjB:9eY  
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6) MfQ 9d9  
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

您目前还是游客,请 登录注册
欢迎提供真实交流,考虑发帖者的感受
认证码:
验证问题:
3+5=?,请输入中文答案:八 正确答案:八