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

[转贴]精妙SQL语句收集

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

SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。 5S? yj  
Sx"I]N  
d!:SoZ  
一、基础 `y#C%9#  
1、说明:创建数据库 \nWpV7TSN  
CREATE DATABASE database-name p'4P2   
2、说明:删除数据库 A&'%ou  
drop database dbname &O,$l3 P  
3、说明:备份sql server ZB%~>  
--- 创建 备份数据的 device T1&H!  
USE master :JIPF=]fc  
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' t} M3F-NZ  
--- 开始 备份 J|IDnCK  
BACKUP DATABASE pubs TO testBack do,X{\  
4、说明:创建新表 LfApVUm  
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) DPx,qM#h5O  
根据已有的表创建新表: J;`~ !g  
A:create table tab_new like tab_old (使用旧表创建新表) A{%;Hd`0/  
B:create table tab_new as select col1,col2... from tab_old definition only -`UlntEdZ:  
5、说明:删除新表 s`YuH <8  
drop table tabname F! e`i-xt  
6、说明:增加一个列 TbVL71c  
Alter table tabname add column col type ^'4uTbxP_!  
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 m~eWQ_a]C@  
7、说明:添加主键: Alter table tabname add primary key(col) h6N}sLM{0  
说明:删除主键: Alter table tabname drop primary key(col) ~B@o?8D]  
8、说明:创建索引:create [unique] index idxname on tabname(col....) z-G (!]:  
删除索引:drop index idxname Sq,ty{j2%  
注:索引是不可更改的,想更改必须删除重新建。 Qg!*=<b  
9、说明:创建视图:create view viewname as select statement zY+Et.lg]^  
删除视图:drop view viewname 3(&F.&C$$  
10、说明:几个简单的基本的sql语句 EYG E#C; d  
选择:select * from table1 where 范围 B_2>Yt"  
插入:insert into table1(field1,field2) values(value1,value2) Z B&Uhi  
删除:delete from table1 where 范围 Rp*t"HSaAW  
更新:update table1 set field1=value1 where 范围 ^nF$<#a  
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料! jYz3(mM'J  
排序:select * from table1 order by field1,field2 [desc] )}!'VIe^!  
总数:select count as totalcount from table1 T7~v40jn|  
求和:select sum(field1) as sumvalue from table1 AUde_ 1hi  
平均:select avg(field1) as avgvalue from table1  )S;ps  
最大:select max(field1) as maxvalue from table1 "r"An"  
最小:select min(field1) as minvalue from table1 ~7a BeD  
 &7&*As  
6DW|O<k^j  
R <\Yg3m8  
11、说明:几个高级查询运算词 9m4rNvb  
{;DZ@2|  
Dys"|,F  
A: UNION 运算符 2*YXm>|1  
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 pNFIO t:(  
B: EXCEPT 运算符 jt--w"|-r  
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 -RQQ|:O$  
C: INTERSECT 运算符 ;%alZ  
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 j//wh1  
注:使用运算词的几个查询结果行必须是一致的。 )d u{ZWr  
12、说明:使用外连接 p9WskYpm  
A、left outer join: vh8Kd' y  
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 ]#.&f]6l  
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 &X,)+ b=  
B:right outer join: %iC63)(M  
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 y03a\K5[KQ  
C:full outer join: O Zm[i H  
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 D  .R  
s'Gy+h.  
}{oBKm9_p  
二、提升 _PXo'*j  
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) guXpHF=  
法一:select * into b from a where 1<>1 {OrE1WHB  
法二:select top 0 * into b from a RsfT Ub)<  
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) 5udoZ >T  
insert into b(a, b, c) select d,e,f from b; F$ p*G][  
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) z.HNb$;  
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件 _ D}b  
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. RpP[ymMZJ  
4、说明:子查询(表名1:a 表名2:b) k.[) R@0%  
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) NOp=/  
5、说明:显示文章、提交人和最后回复时间 6G$tYfX  
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b xH#a|iT?(  
6、说明:外连接查询(表名1:a 表名2:b) RyWOiQk;  
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c Yj/nzTVJ[  
7、说明:在线视图查询(表名1:a ) !DL53DQ#  
select * from (SELECT a,b,c FROM a) T where t.a > 1; nY-9 1q?Y  
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 Ytwv=;h-  
select * from table1 where time between time1 and time2 fZ:rz;tM  
select a,b,c, from table1 where a not between 数值1 and 数值2 p!QneeA`&X  
9、说明:in 的使用方法 QfWu~[  
select * from table1 where a [not] in ('值1','值2','值4','值6') GSnHxs)  
10、说明:两张关联表,删除主表中已经在副表中没有的信息 v^_]W3K  
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) bvS\P!m\c  
11、说明:四表联查问题: C,vc aC?  
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 ..... ,<r3Z$G  
12、说明:日程安排提前五分钟提醒 "sX?wTag  
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 SJ7=<y}[d  
13、说明:一条sql 语句搞定数据库分页 <?Izfl6  
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 ~<[5uZIo  
14、说明:前10条记录 KqUSTR1e[  
select top 10 * form table1 where 范围 @/NZ>.  
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) SSbK[aR  
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) T4Gw\Z%  
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 4qXRDsbCf  
(select a from tableA ) except (select a from tableB) except (select a from tableC) '=G Ce%A  
17、说明:随机取出10条数据 Rn_W|"  
select top 10 * from tablename order by newid() lT!$\E$1   
18、说明:随机选择记录 7"NJraQ6  
select newid() :fKz^@mY4  
19、说明:删除重复记录 YkAWKCOni  
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) q.sQ Z]ty9  
20、说明:列出数据库里所有的表名 Bp{`%86S E  
select name from sysobjects where type='U' 7 +hF;  
21、说明:列出表里的所有的 YGV#.  
select name from syscolumns where id=object_id('TableName') m&~Dj#%(w  
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 @mRrA#E#{  
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 ~'QeN%qadP  
显示结果: *([)X2A@+  
type vender pcs JP,(4h *  
电脑 A 1 lrX0c$)  
电脑 A 1 't?7.#,6O  
光盘 B 2 a:^ Gr%  
光盘 A 2 }cK~=@7tK  
手机 B 3 UQ?OD~7  
手机 C 3 [67E5rk-  
23、说明:初始化表table1 6 %k+0\d  
TRUNCATE TABLE table1 8Y~=\(5>  
24、说明:选择从10到15的记录 Cm<j*Cnl  
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc S}Y|s]6  
^zPEAXm  
(yAvDyJOn  
#Q7x:,f  
三、技巧 "~2#!bK7  
1、1=1,1=2的使用,在SQL语句组合时用的较多 )Z]y.W)  
"where 1=1" 是表示选择全部  "where 1=2"全部不选, 6?.pKFB Z  
如: u#@{%kPW  
if @strWhere !='' 5h=TV  
begin =<zSF\Zr_  
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere >aC\_Mc  
end kxqc6  
else r{2].31'  
begin D<3V#Opw  
set @strSQL = 'select count(*) as Total from [' + @tblName + ']' ie~fQ!rf  
end V;hwAQbF  
我们可以直接写成 [H:GKhPC`  
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere sqpOS!]  
2、收缩数据库 , 64t  
--重建索引 ]baaOD$Z  
DBCC REINDEX 1LId_vJtJ  
DBCC INDEXDEFRAG m_Ac/ct f  
--收缩数据和日志 Ao,!z  
DBCC SHRINKDB oYh<k  
DBCC SHRINKFILE [+MX$y  
3、压缩数据库 .i&ZT}v3  
dbcc shrinkdatabase(dbname) $K_YC~  
4、转移数据库给新用户以已存在用户权限 2 ssj(Qo  
exec sp_change_users_login 'update_one','newname','oldname' DMcxa.Sd!  
go [kuVQ$)  
5、检查备份集 X})Imk7&E  
RESTORE VERIFYONLY from disk='E:\dvbbs.bak' .F$|j1y  
6、修复数据库 H~dHVQtJZ  
ALTER DATABASE [dvbbs] SET SINGLE_USER Sa1z,EP  
GO  e_~fJ  
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK >AzWM .r  
GO  c(V=.+J  
ALTER DATABASE [dvbbs] SET MULTI_USER y-\A@jJC5  
GO <k\H`P  
7、日志清除 g;!@DVF$  
SET NOCOUNT ON ?X#/1X%u:  
DECLARE @LogicalFileName sysname, lHKf#|  
        @MaxMinutes INT, ~@4ZV  
        @NewSize INT yB4H3Q )  
USE    tablename            -- 要操作的数据库名 *fH_lG%  
SELECT  @LogicalFileName = 'tablename_log',  -- 日志文件名 ./&zO{|0]  
@MaxMinutes = 10,              -- Limit on time allowed to wrap log. ,s><kHJ  
        @NewSize = 1                  -- 你想设定的日志文件的大小(M) 'uKkl(==%  
-- Setup / initialize %t`SSW7I  
DECLARE @OriginalSize int T~o{woq}g  
SELECT @OriginalSize = size B&i0j5L  
  FROM sysfiles V@ _-H gg  
  WHERE name = @LogicalFileName (e8G (  
SELECT 'Original Size of ' + db_name() + ' LOG is ' + ]Q4PbW  
        CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + lTr*'fX  
        CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' a\{1UD  
  FROM sysfiles P wB g  
  WHERE name = @LogicalFileName 8L -4}!~C  
CREATE TABLE DummyTrans "<w2v'6S  
  (DummyColumn char (8000) not null) `e $n$Bh  
DECLARE @Counter  INT, ~3bZ+*H>  
        @StartTime DATETIME, h^A3 0f_x  
        @TruncLog  VARCHAR(255) 2\nN4WL 5.  
SELECT  @StartTime = GETDATE(), )jlP cO-  
        @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' x9)aBB  
DBCC SHRINKFILE (@LogicalFileName, @NewSize) 3xzkZ8]/  
EXEC (@TruncLog) k]Alp;hVd  
-- Wrap the log if necessary. mGe|8In  
WHILE    @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired GjeUUmr  
      AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)  9:%n=URd  
      AND (@OriginalSize * 8 /1024) > @NewSize  `D)Lzm R  
  BEGIN -- Outer loop. ,]Ro',A&  
    SELECT @Counter = 0 (/SGT$#8  
    WHILE  ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) jWXR__>.  
      BEGIN -- update P1i*u0a  
        INSERT DummyTrans VALUES ('Fill Log')  ^}o7*   
        DELETE DummyTrans *!g 24  
        SELECT @Counter = @Counter + 1 ;Rhb@]X  
      END  `s`C{|wv  
    EXEC (@TruncLog)  /}w#Jk4pD  
  END  Pknc[h},  
SELECT 'Final Size of ' + db_name() + ' LOG is ' + |As2"1_f  
        CONVERT(VARCHAR(30),size) + ' 8K pages or ' + T3Frc ]6,4  
        CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' SLtSqG7~  
  FROM sysfiles MCk^Tp!  
  WHERE name = @LogicalFileName n1*&%d'7  
DROP TABLE DummyTrans ?h!t$QQ!M  
SET NOCOUNT OFF W}XYmF*_?  
8、说明:更改某个表 `l>93A  
exec sp_changeobjectowner 'tablename','dbo' b4Cfd?'  
9、存储更改全部表 WHUT/:?f  
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch o3n3URu\  
@OldOwner as NVARCHAR(128), mG831v?  
@NewOwner as NVARCHAR(128) )RwBg8  
AS ?0rOcaTY  
DECLARE @Name  as NVARCHAR(128) iW|s|1mh3  
DECLARE @Owner  as NVARCHAR(128) ge0's+E+1  
DECLARE @OwnerName  as NVARCHAR(128) E &7@#'l  
DECLARE curObject CURSOR FOR  c6Lif)4  
select 'Name'  = name, Q !9HA[Ly  
  'Owner'  = user_name(uid) ,Z>wbMJig  
from sysobjects e=t<H"&  
where user_name(uid)=@OldOwner \Z)#lF|^  
order by name 4!l sk:R  
OPEN  curObject ?fK^&6pI  
FETCH NEXT FROM curObject INTO @Name, @Owner +7Yu^&  
WHILE(@@FETCH_STATUS=0) hCzjC|EO~  
BEGIN    JbE?a[Eg?  
if @Owner=@OldOwner E-~mOYea  
begin |l|_dn  
  set @OwnerName = @OldOwner + '.' + rtrim(@Name) 9W*.lf  
  exec sp_changeobjectowner @OwnerName, @NewOwner fokwW}>B[f  
end fyI_  
-- select @name,@NewOwner,@OldOwner mEoA#U  
FETCH NEXT FROM curObject INTO @Name, @Owner b'velj3A  
END RT% x&j  
close curObject 0Injyc*bMF  
deallocate curObject F =XF]  
GO "7Eo>g   
10、SQL SERVER中直接循环写入数据 R? O-x9  
declare @i int 8HMo.*Ti9  
set @i=1 3p=vz'  
while @i<30 rdO@X9z  
begin *FV0Vy  
  insert into test (userid) values(@i) )ll?-FZ   
  set @i=@i+1 7zD- ?%  
end * R%.a^R  
小记存储过程中经常用到的本周,本月,本年函数 &Hv;<  
Dateadd(wk,datediff(wk,0,getdate()),-1) AD^X(rW  
Dateadd(wk,datediff(wk,0,getdate()),6) coDj L.u  
Dateadd(mm,datediff(mm,0,getdate()),0) 4d!S#zx  
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0))  ]}Pl%.  
Dateadd(yy,datediff(yy,0,getdate()),0) VS?dvZ1cC  
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) 3&es]1b  
上面的SQL代码只是一个时间段 U.: sK*  
Dateadd(wk,datediff(wk,0,getdate()),-1) Bwjg#1E  
Dateadd(wk,datediff(wk,0,getdate()),6) #c-b}.R  
就是表示本周时间段. (]2<?x*  
下面的SQL的条件部分,就是查询时间段在本周范围内的: JwZ?hc  
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6) )S^z+3p  
而在存储过程中 sf`PV}a1  
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1) vF"c  
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6) \M9 h&I\7  
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

您目前还是游客,请 登录注册
如果您在写长篇帖子又不马上发表,建议存为草稿
认证码:
验证问题:
3+5=?,请输入中文答案:八 正确答案:八