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

[转贴]精妙SQL语句收集

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

SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。 kP7a:(P_g  
nqZA|-}  
M (+.$uz  
一、基础 o .l;: Un  
1、说明:创建数据库 p]wP36<S!  
CREATE DATABASE database-name uz]E_&2  
2、说明:删除数据库 :|Z$3q  
drop database dbname R;H?gE^m-  
3、说明:备份sql server g d z  
--- 创建 备份数据的 device aRbx   
USE master lkV6qIj   
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' HH"$#T^-  
--- 开始 备份 , p_G/ OU  
BACKUP DATABASE pubs TO testBack {*N^C@  
4、说明:创建新表 .4wTjbO6  
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) fJX\'Rc\  
根据已有的表创建新表: +IG1IF  
A:create table tab_new like tab_old (使用旧表创建新表) }KK2WJp#M  
B:create table tab_new as select col1,col2... from tab_old definition only sT)6nV  
5、说明:删除新表 ,VAp>x+O  
drop table tabname }c} ( 5  
6、说明:增加一个列 Yx6hA#7I  
Alter table tabname add column col type ]\OWZ{T'j  
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 W@l+ciZ_  
7、说明:添加主键: Alter table tabname add primary key(col) 3@&bxYXm  
说明:删除主键: Alter table tabname drop primary key(col) o>2e !7  
8、说明:创建索引:create [unique] index idxname on tabname(col....) c\M#5+1j  
删除索引:drop index idxname 6G'<[gL j  
注:索引是不可更改的,想更改必须删除重新建。 'g]hmE  
9、说明:创建视图:create view viewname as select statement IQT cYl  
删除视图:drop view viewname 3=Z<wD s  
10、说明:几个简单的基本的sql语句 ;P3>>DZ  
选择:select * from table1 where 范围 2-~a P  
插入:insert into table1(field1,field2) values(value1,value2) wDDxj  
删除:delete from table1 where 范围 \3r3{X _<`  
更新:update table1 set field1=value1 where 范围 lY.B  
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料! B]1HS`*7  
排序:select * from table1 order by field1,field2 [desc] x"vwWJNQ  
总数:select count as totalcount from table1 z+jh ;!i  
求和:select sum(field1) as sumvalue from table1 tG/1pW  
平均:select avg(field1) as avgvalue from table1 Mec{_jiH&D  
最大:select max(field1) as maxvalue from table1 8 4z6zFv?Q  
最小:select min(field1) as minvalue from table1 h}avX*Lx_  
K'NcTw#f  
_().t5<  
r:-WzH(Ms  
11、说明:几个高级查询运算词 NH'iR!iGo  
GJX4KA8J  
\k;U}Te<  
A: UNION 运算符 k5a\Sq}  
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 e$/&M*0\f  
B: EXCEPT 运算符 h2% J/69  
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 ;+ G9-  
C: INTERSECT 运算符 ^ |aNG`|O  
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 @44P4?;  
注:使用运算词的几个查询结果行必须是一致的。 +jtA&1cf  
12、说明:使用外连接 }w@gj"\H  
A、left outer join: MD<-w|#8IV  
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 1i u =Y  
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 f/ajejYo?,  
B:right outer join: AliRpxxd  
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 ~n6[$WjZA  
C:full outer join: FSU<Y1|XM  
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 H>.B99vp  
>dk 9f}7-  
('t kZt%8  
二、提升 "<*awWNI  
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) -u|l}}bh  
法一:select * into b from a where 1<>1 -l "U"U"F  
法二:select top 0 * into b from a 0O~p7D  
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)  5@ foxI  
insert into b(a, b, c) select d,e,f from b; :M j_2  
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) kM!V .e[g  
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件 ?>V6P_r>  
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. Tr&E4e  
4、说明:子查询(表名1:a 表名2:b) o'Pu'y  
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) RZO5=L9E  
5、说明:显示文章、提交人和最后回复时间 6Nt$ZYS  
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b (;}tf~~r  
6、说明:外连接查询(表名1:a 表名2:b) # .<V^  
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c F6W}mMZH/N  
7、说明:在线视图查询(表名1:a ) Pd~MiyO;K  
select * from (SELECT a,b,c FROM a) T where t.a > 1; 2J<&rKCF  
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 hmZvIy(  
select * from table1 where time between time1 and time2 yG&2UqX  
select a,b,c, from table1 where a not between 数值1 and 数值2 iITp**l  
9、说明:in 的使用方法 C0fmmI0z~  
select * from table1 where a [not] in ('值1','值2','值4','值6') Qw?+!-7TN  
10、说明:两张关联表,删除主表中已经在副表中没有的信息 !8*McO I  
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) 'L{p,  
11、说明:四表联查问题: gDCOLDM  
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 ..... "}b'E#  
12、说明:日程安排提前五分钟提醒 .+E#q&=  
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 dig~J\  
13、说明:一条sql 语句搞定数据库分页 :[sOKV i  
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 =XT)J6z^"  
14、说明:前10条记录 TY.FpW  
select top 10 * form table1 where 范围 We}lx{E  
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) Z^zbWFO]5  
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) ? } (=  
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 0@)%h&mD  
(select a from tableA ) except (select a from tableB) except (select a from tableC) kq-6HDR  
17、说明:随机取出10条数据 e"Rm_t  
select top 10 * from tablename order by newid() zoP%u,XL  
18、说明:随机选择记录 @Z;1 g  
select newid() F Z!J  
19、说明:删除重复记录 Y-p<qL|_  
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) lJ{V  
20、说明:列出数据库里所有的表名 +;q.Y?  
select name from sysobjects where type='U' H9` f0(H  
21、说明:列出表里的所有的 PJgp+u<  
select name from syscolumns where id=object_id('TableName') #U=;T]!'$  
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 \t3qS eWc/  
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 * OsU Y=;  
显示结果: o>c ^aRZ{  
type vender pcs 0xpx(T[  
电脑 A 1 TfRGA (+#  
电脑 A 1 47UO*oLS  
光盘 B 2 T&xt` |  
光盘 A 2 MJ\[Dt  
手机 B 3 *8)2iv4[  
手机 C 3 W f@t4(i  
23、说明:初始化表table1 (][LQ6Pc  
TRUNCATE TABLE table1 d~*TIN8Ke~  
24、说明:选择从10到15的记录 {8@\Ij  
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc tNnyue{p  
!e3YnlE  
Q_zr\RM>  
x*}bo))hb  
三、技巧 }!)F9r@\  
1、1=1,1=2的使用,在SQL语句组合时用的较多 0JY WrPR  
"where 1=1" 是表示选择全部  "where 1=2"全部不选, [VSU"AJY  
如: jm3G?Vnq  
if @strWhere !='' fS A)G$b]  
begin nl1-kB)$e|  
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere 61_f3S(u  
end Vq ^]s $'  
else ~`eHHgX  
begin } /e`v6  
set @strSQL = 'select count(*) as Total from [' + @tblName + ']' ~xyw>m+o.  
end v6uxxsI>Hm  
我们可以直接写成 ;(6P6@+o  
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere *P2[qhP2  
2、收缩数据库 |n6Eg9  
--重建索引 *'R#4@wmP  
DBCC REINDEX A0xC,V~z  
DBCC INDEXDEFRAG ~kKrDLW+  
--收缩数据和日志 &L4 q10-N  
DBCC SHRINKDB J]pa4C`  
DBCC SHRINKFILE eThy+  
3、压缩数据库 ULBg {e?l8  
dbcc shrinkdatabase(dbname) UQT'6* !  
4、转移数据库给新用户以已存在用户权限 Vhg1/EgUr  
exec sp_change_users_login 'update_one','newname','oldname' mBk5+KyT  
go ijUzC>O+q  
5、检查备份集 :&VcB$  
RESTORE VERIFYONLY from disk='E:\dvbbs.bak' xxa} YIe8  
6、修复数据库 -5>NE35Cto  
ALTER DATABASE [dvbbs] SET SINGLE_USER =%qEf   
GO @"|i"Hk^  
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK GsV4ZZ  
GO u oVNK  
ALTER DATABASE [dvbbs] SET MULTI_USER Qv#]81i(1  
GO d^V$Z6* ]  
7、日志清除 E9 Y\X  
SET NOCOUNT ON 9=+-QdX+0]  
DECLARE @LogicalFileName sysname, S>_27r{  
        @MaxMinutes INT, ;-@=  
        @NewSize INT }zMf7<C  
USE    tablename            -- 要操作的数据库名 |4b)>8TL/  
SELECT  @LogicalFileName = 'tablename_log',  -- 日志文件名 I mym+  
@MaxMinutes = 10,              -- Limit on time allowed to wrap log. R+=a`0_S  
        @NewSize = 1                  -- 你想设定的日志文件的大小(M) ?IYY'fS"  
-- Setup / initialize $L}aQlA1JM  
DECLARE @OriginalSize int &ITuyGmF  
SELECT @OriginalSize = size OXhAha`R  
  FROM sysfiles |)U|:F/{@  
  WHERE name = @LogicalFileName ;+Y i.Q/\  
SELECT 'Original Size of ' + db_name() + ' LOG is ' + MagMZR  
        CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + G?hK9@ |v  
        CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' g+[kde;(^  
  FROM sysfiles kv?|'DN  
  WHERE name = @LogicalFileName +=3CL2{An  
CREATE TABLE DummyTrans 9 $l>\.6  
  (DummyColumn char (8000) not null) cT'w=  
DECLARE @Counter  INT, fCUT[d+H  
        @StartTime DATETIME, [Ot,q/hBJ  
        @TruncLog  VARCHAR(255) 3]LN;s]ac  
SELECT  @StartTime = GETDATE(), >Da~Q WW|  
        @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' M##';x0  
DBCC SHRINKFILE (@LogicalFileName, @NewSize) e!x6bR9EZ  
EXEC (@TruncLog) uJow7-FD  
-- Wrap the log if necessary. m],Ud\  
WHILE    @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired %XRN]tsu  
      AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)  YD[H  
      AND (@OriginalSize * 8 /1024) > @NewSize  KL3<Iz]  
  BEGIN -- Outer loop. ,4@|1z{bfm  
    SELECT @Counter = 0 LAs7>hM  
    WHILE  ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) E5G{B'%j  
      BEGIN -- update VWf %v  
        INSERT DummyTrans VALUES ('Fill Log')  'jaoO9KY K  
        DELETE DummyTrans g`,AaWlF  
        SELECT @Counter = @Counter + 1 e>H:/24  
      END  J)x3\[}Ye  
    EXEC (@TruncLog)  ;!u;!F!i  
  END  G*n2Ii  
SELECT 'Final Size of ' + db_name() + ' LOG is ' + mh` |=M]8E  
        CONVERT(VARCHAR(30),size) + ' 8K pages or ' + vK$^y^  
        CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' #}yTDBt  
  FROM sysfiles 8 %Sb+w07  
  WHERE name = @LogicalFileName Y& {|Sw7?  
DROP TABLE DummyTrans ,E*R,'w   
SET NOCOUNT OFF le .'pP@  
8、说明:更改某个表 k`YYZt]@  
exec sp_changeobjectowner 'tablename','dbo' ]n v( aM?d  
9、存储更改全部表 tS?lB05TOR  
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch 5vOCCW  
@OldOwner as NVARCHAR(128), }STYG`  
@NewOwner as NVARCHAR(128) l[Z)@bC1   
AS Zk`#VH  
DECLARE @Name  as NVARCHAR(128) X"*^l_9-v  
DECLARE @Owner  as NVARCHAR(128) 8<&EvOk  
DECLARE @OwnerName  as NVARCHAR(128) 2[R$RpA_  
DECLARE curObject CURSOR FOR 3#GqmhqKDk  
select 'Name'  = name, \U@3`  
  'Owner'  = user_name(uid) >- Bg%J9  
from sysobjects Z!{UWegun  
where user_name(uid)=@OldOwner ClUSrSp  
order by name >mm' -P  
OPEN  curObject Fr:5$,At7-  
FETCH NEXT FROM curObject INTO @Name, @Owner l (kr'x  
WHILE(@@FETCH_STATUS=0) P:!)9/.2  
BEGIN    C7qYiSv  
if @Owner=@OldOwner S*t%RZ~a  
begin h=+$>_&:  
  set @OwnerName = @OldOwner + '.' + rtrim(@Name) ;=;JfNnbm  
  exec sp_changeobjectowner @OwnerName, @NewOwner ,0?!ov|  
end `/:cfP\  
-- select @name,@NewOwner,@OldOwner Ot9V< D6h  
FETCH NEXT FROM curObject INTO @Name, @Owner f(:1yl\a  
END bXdY\&fE  
close curObject Y E1Hpeb  
deallocate curObject 3LK%1+)4  
GO $kz!zjC'  
10、SQL SERVER中直接循环写入数据 Fb_S&!  
declare @i int 2CLB1  
set @i=1 GjQfi'vCk  
while @i<30 %}qbkkZ  
begin 8l)  
  insert into test (userid) values(@i) j6>tH"i  
  set @i=@i+1 %_f;G+fK\p  
end .9M.|  
小记存储过程中经常用到的本周,本月,本年函数 U[8{_h<#  
Dateadd(wk,datediff(wk,0,getdate()),-1) fE25(wCz7  
Dateadd(wk,datediff(wk,0,getdate()),6) CZ=0mWfF  
Dateadd(mm,datediff(mm,0,getdate()),0) Z9 w:&oa@  
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0)) kX;$}7n  
Dateadd(yy,datediff(yy,0,getdate()),0) |nxdB&1n  
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) ]0 ~qi@  
上面的SQL代码只是一个时间段 bBE+jqi 2  
Dateadd(wk,datediff(wk,0,getdate()),-1) Y1\K;;X  
Dateadd(wk,datediff(wk,0,getdate()),6) {B{i(6C(  
就是表示本周时间段. j\2[H^   
下面的SQL的条件部分,就是查询时间段在本周范围内的: n[" 9|  
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6) []}N  
而在存储过程中 Cvn$]bt/s  
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1) 2p< Aj!  
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6)  ]PX}b  
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

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