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

[转贴]精妙SQL语句收集

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

SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。 Dh~Z 8!*  
ti}G/*4  
! tPHT  
一、基础 ~u+|NtF  
1、说明:创建数据库 ygS vYMC  
CREATE DATABASE database-name JwM Fu5@  
2、说明:删除数据库 9o|#R&0  
drop database dbname ;|H(_J=6k  
3、说明:备份sql server 8bP4  
--- 创建 备份数据的 device c3G&)gU4q  
USE master oq3{q  
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' *&sXC@^@^  
--- 开始 备份 l<YCX[%E  
BACKUP DATABASE pubs TO testBack #RWHk  
4、说明:创建新表 kFsq23Ne  
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) Mh;rhQ  
根据已有的表创建新表: P|{Et=R`1  
A:create table tab_new like tab_old (使用旧表创建新表) *zn=l+c  
B:create table tab_new as select col1,col2... from tab_old definition only ]53'\TH  
5、说明:删除新表 .vJ t&@NO  
drop table tabname @E5 }v  
6、说明:增加一个列 UOtrq=y  
Alter table tabname add column col type jXALN  
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 P<GHX~nB  
7、说明:添加主键: Alter table tabname add primary key(col) 8 y+Nl&"V  
说明:删除主键: Alter table tabname drop primary key(col) @mu2,%  
8、说明:创建索引:create [unique] index idxname on tabname(col....) k9iXVYQ.;r  
删除索引:drop index idxname $bi@,&t;  
注:索引是不可更改的,想更改必须删除重新建。 *Ul L\  
9、说明:创建视图:create view viewname as select statement zA?]AL(+YW  
删除视图:drop view viewname sB>ZN3ptH^  
10、说明:几个简单的基本的sql语句 UZq1qn@+  
选择:select * from table1 where 范围 &}/h[v_#'  
插入:insert into table1(field1,field2) values(value1,value2) OlI{VszR  
删除:delete from table1 where 范围 1=X"|`<!  
更新:update table1 set field1=value1 where 范围 aA/.EAc7  
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料! WJN}d-S=^  
排序:select * from table1 order by field1,field2 [desc] [6Nw)r(a(  
总数:select count as totalcount from table1 b 7%O[  
求和:select sum(field1) as sumvalue from table1 "t\gkJyK  
平均:select avg(field1) as avgvalue from table1 "TgE@bC  
最大:select max(field1) as maxvalue from table1 :$"L;"  
最小:select min(field1) as minvalue from table1 .0zNt  
:x<'>)6  
s*0PJ\E2  
>S:>_&I`I  
11、说明:几个高级查询运算词 cjel6 nj  
aj:B+}1  
A+Xk=k5<  
A: UNION 运算符 k)a-odNrb  
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 7>`VZ?  
B: EXCEPT 运算符 dq{wFI)  
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 )KLsa`RV:  
C: INTERSECT 运算符 '~ {xn  
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 W l+[{#  
注:使用运算词的几个查询结果行必须是一致的。 "7k 82dw  
12、说明:使用外连接 UHEn+Tc>  
A、left outer join: M9/c8zZ  
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 0` {6~p  
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 9O+><x[i  
B:right outer join: De(\ <H#  
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 T&]J3TFJ  
C:full outer join: ~$8t/c  
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 v3i]z9`  
y2U^7VrO  
@L-3&~=  
二、提升 '$3]U5KOwK  
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) R{5xb  
法一:select * into b from a where 1<>1 bJo)rM :m  
法二:select top 0 * into b from a b$f@.L  
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) |@x^5Ab$T  
insert into b(a, b, c) select d,e,f from b; WUM&Lq k"  
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) oT4A|M  
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件 Dg$Z5`%k8  
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. wW~y?A"{2  
4、说明:子查询(表名1:a 表名2:b) ]Fc<% wzp  
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) "Z&-:1tP{9  
5、说明:显示文章、提交人和最后回复时间 @,<@y>m7  
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b nl)!)t=n  
6、说明:外连接查询(表名1:a 表名2:b) g{zvks~it  
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c mZ^z%+Ca|  
7、说明:在线视图查询(表名1:a ) kgX"LQh;[G  
select * from (SELECT a,b,c FROM a) T where t.a > 1; KV Vo_9S'  
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 >xU$)uE&  
select * from table1 where time between time1 and time2 I6x  
select a,b,c, from table1 where a not between 数值1 and 数值2 tSVN}~1\  
9、说明:in 的使用方法 y\DR,$Py  
select * from table1 where a [not] in ('值1','值2','值4','值6') 37hs/=x  
10、说明:两张关联表,删除主表中已经在副表中没有的信息 oh k.;  
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) BitP?6KX  
11、说明:四表联查问题: )Jx+R ;Z  
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 ..... S`oADy  
12、说明:日程安排提前五分钟提醒 Une,Y4{u  
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 7cGc`7  
13、说明:一条sql 语句搞定数据库分页 sw.cw}1  
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 }Km+5'G'U  
14、说明:前10条记录 U{vt9t  
select top 10 * form table1 where 范围 ,GB~Cmc1<Q  
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) RKu'WD?sdH  
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) ]Q Y:t:-  
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 >+iJ(jqq  
(select a from tableA ) except (select a from tableB) except (select a from tableC) "+oP((9  
17、说明:随机取出10条数据 [Bn C_^[W  
select top 10 * from tablename order by newid() '?Mt*%J@=$  
18、说明:随机选择记录 .E'Tfa  
select newid() si:p98[w  
19、说明:删除重复记录 !}Sf?n P#  
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) v=kQ / h  
20、说明:列出数据库里所有的表名 E8_j?X1  
select name from sysobjects where type='U' N/wUP  
21、说明:列出表里的所有的 q]%eLfC(  
select name from syscolumns where id=object_id('TableName') x=1Iuc;&3  
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 f{ ;L"*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 4+rr3 $AY  
显示结果: dQX<X}  
type vender pcs H =Y7#{}  
电脑 A 1 }HO3D.HE^  
电脑 A 1 > -P UY  
光盘 B 2 ?T]` X  
光盘 A 2 05 P#gs`<  
手机 B 3 Z>0a?=1[  
手机 C 3 Z~&$s  
23、说明:初始化表table1 (OA-Mgyc  
TRUNCATE TABLE table1 q1rBSlzN  
24、说明:选择从10到15的记录 /y8=r"'G  
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc 7Cx*Ts$  
!V<c:6"  
g+g0iS  
3X &'hz@  
三、技巧 =t[hsl  
1、1=1,1=2的使用,在SQL语句组合时用的较多 9%+Nzo(Fd  
"where 1=1" 是表示选择全部  "where 1=2"全部不选, N*J!<vY"  
如: u'Od~x^z  
if @strWhere !='' 9%{V?r]k  
begin 29a~B<e7s  
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere XH^X4W  
end $w,O[PIi  
else ua!i3]18  
begin h/'b(9fS  
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'  c@eQSy  
end 0m3:!#\  
我们可以直接写成 49('pq?D  
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere Fe r&X  
2、收缩数据库 &c?q#-^)\+  
--重建索引 I_?+;<n  
DBCC REINDEX U?@ s`.  
DBCC INDEXDEFRAG fGZZ['E  
--收缩数据和日志 yj:<3_-C*  
DBCC SHRINKDB |:H 9#=  
DBCC SHRINKFILE o\TXW qt  
3、压缩数据库 sJI" m'r=Z  
dbcc shrinkdatabase(dbname) AVn?86ri  
4、转移数据库给新用户以已存在用户权限 M%yeI{m  
exec sp_change_users_login 'update_one','newname','oldname' OON]E3yy  
go 9$ VudE>;  
5、检查备份集 V4["+Y  
RESTORE VERIFYONLY from disk='E:\dvbbs.bak' (h8RthQt  
6、修复数据库 Kia34 ~W  
ALTER DATABASE [dvbbs] SET SINGLE_USER `@_j Do  
GO .RazjXAY  
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK 8I>'x f  
GO a)o-6  
ALTER DATABASE [dvbbs] SET MULTI_USER qsA`\%]H  
GO xYLTz8g=  
7、日志清除 hL?"!  
SET NOCOUNT ON e) \PW1b  
DECLARE @LogicalFileName sysname, b41f7t=  
        @MaxMinutes INT,  T)Uhp  
        @NewSize INT ! %~P[;.  
USE    tablename            -- 要操作的数据库名 gN/kNck  
SELECT  @LogicalFileName = 'tablename_log',  -- 日志文件名 |//D|-2  
@MaxMinutes = 10,              -- Limit on time allowed to wrap log. fb=[gK#*,  
        @NewSize = 1                  -- 你想设定的日志文件的大小(M) P&sn IJ  
-- Setup / initialize )yTBtYw3  
DECLARE @OriginalSize int a_T3<  
SELECT @OriginalSize = size EGL7z`nt  
  FROM sysfiles >)j`Q1Qc\  
  WHERE name = @LogicalFileName t/vw%|AS  
SELECT 'Original Size of ' + db_name() + ' LOG is ' + V* I2  
        CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + VF bso3q<j  
        CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' :Z R5<Y>  
  FROM sysfiles ,hVDGif  
  WHERE name = @LogicalFileName Y& p ~8  
CREATE TABLE DummyTrans UhX)?'J  
  (DummyColumn char (8000) not null) 1sIPhOIys  
DECLARE @Counter  INT, -;Ij ,  
        @StartTime DATETIME, /)J]m  
        @TruncLog  VARCHAR(255) ,]LsX"u  
SELECT  @StartTime = GETDATE(), KsDovy<  
        @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' C}=9m A  
DBCC SHRINKFILE (@LogicalFileName, @NewSize) ])9|j  
EXEC (@TruncLog) VkD}gJY  
-- Wrap the log if necessary. L!LhH  
WHILE    @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired VBN=xg}  
      AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)  ]Vm:iF#5P  
      AND (@OriginalSize * 8 /1024) > @NewSize  PNB E  
  BEGIN -- Outer loop. /=@V5)  
    SELECT @Counter = 0 oXgi#(y  
    WHILE  ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) }8Yu"P${Y  
      BEGIN -- update s= bP@[Gj  
        INSERT DummyTrans VALUES ('Fill Log')  w s([bS2h  
        DELETE DummyTrans O$(#gB'B  
        SELECT @Counter = @Counter + 1 )qeed-{  
      END  ,382O$C  
    EXEC (@TruncLog)  |@Ze{\  
  END  "KKw\i  
SELECT 'Final Size of ' + db_name() + ' LOG is ' + j2`%sBo  
        CONVERT(VARCHAR(30),size) + ' 8K pages or ' + hkDew0k  
        CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' J,D^fVIw  
  FROM sysfiles 2I>`{#fV  
  WHERE name = @LogicalFileName mIW/x/I  
DROP TABLE DummyTrans .H}#,pQ}l  
SET NOCOUNT OFF uhvn1"  
8、说明:更改某个表 zrL+:/t  
exec sp_changeobjectowner 'tablename','dbo' \qkb8H  
9、存储更改全部表 q+U&lw|"w  
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch V)Ze> Pp  
@OldOwner as NVARCHAR(128), Lk]W?  
@NewOwner as NVARCHAR(128) 2v`Q;%7O  
AS =Bos>;dl  
DECLARE @Name  as NVARCHAR(128) 9P&{Xhs7  
DECLARE @Owner  as NVARCHAR(128) b6d}<b9#  
DECLARE @OwnerName  as NVARCHAR(128) ^ pNA_s!S  
DECLARE curObject CURSOR FOR Zq{TY)PI]  
select 'Name'  = name, mCSt.n~  
  'Owner'  = user_name(uid) a49t/  
from sysobjects rCd*'Qg  
where user_name(uid)=@OldOwner #b@ sV$  
order by name P*/ig0_fM  
OPEN  curObject o]aMhSol  
FETCH NEXT FROM curObject INTO @Name, @Owner 30b dcDm,  
WHILE(@@FETCH_STATUS=0) fS]Z`U"  
BEGIN    jE2EoQ i,  
if @Owner=@OldOwner ]92=PA>75  
begin |& _(I  
  set @OwnerName = @OldOwner + '.' + rtrim(@Name) w3FEX$`_  
  exec sp_changeobjectowner @OwnerName, @NewOwner q"u,r6ED  
end v,jB(B^|Z  
-- select @name,@NewOwner,@OldOwner ^+O97<#6C  
FETCH NEXT FROM curObject INTO @Name, @Owner eQJyO9$G  
END 59H~qE1Md  
close curObject TU^s!Tj  
deallocate curObject a,eEP43dn  
GO 5l]qhi3f  
10、SQL SERVER中直接循环写入数据 d Z x  
declare @i int h* V~.H  
set @i=1 %&!B2z}  
while @i<30 %']`t-N8  
begin ]\F}-I[  
  insert into test (userid) values(@i) T~~K~a \8  
  set @i=@i+1 /0r6/ _5-.  
end 7 b 8pWM  
小记存储过程中经常用到的本周,本月,本年函数 `V{'GF&[  
Dateadd(wk,datediff(wk,0,getdate()),-1) ,S?M;n?z_  
Dateadd(wk,datediff(wk,0,getdate()),6) :'sMrf_EA  
Dateadd(mm,datediff(mm,0,getdate()),0) <f;X s(  
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0)) EMf"rGXu(  
Dateadd(yy,datediff(yy,0,getdate()),0) sOm&7A?  
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) %:8XZf  
上面的SQL代码只是一个时间段 fJ;1ii~  
Dateadd(wk,datediff(wk,0,getdate()),-1) KMXd  
Dateadd(wk,datediff(wk,0,getdate()),6) FO)`&s"&2  
就是表示本周时间段. ?>q5Abp[  
下面的SQL的条件部分,就是查询时间段在本周范围内的: \R,8xID_t  
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6) WQv`%%G2>  
而在存储过程中 ,f$ftn\~j/  
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1) pDt45   
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6) Wb;D9Z  
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

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