﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-duckuu-随笔分类-others</title><link>http://www.cnitblog.com/duckuu/category/3384.html</link><description>    
    duckuu的学习空间</description><language>zh-cn</language><lastBuildDate>Tue, 04 Oct 2011 16:18:30 GMT</lastBuildDate><pubDate>Tue, 04 Oct 2011 16:18:30 GMT</pubDate><ttl>60</ttl><item><title>精妙SQL语句整理</title><link>http://www.cnitblog.com/duckuu/archive/2006/12/18/20725.html</link><dc:creator>duckuu的学习空间</dc:creator><author>duckuu的学习空间</author><pubDate>Mon, 18 Dec 2006 02:44:00 GMT</pubDate><guid>http://www.cnitblog.com/duckuu/archive/2006/12/18/20725.html</guid><wfw:comment>http://www.cnitblog.com/duckuu/comments/20725.html</wfw:comment><comments>http://www.cnitblog.com/duckuu/archive/2006/12/18/20725.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/duckuu/comments/commentRss/20725.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/duckuu/services/trackbacks/20725.html</trackback:ping><description><![CDATA[
		<table border="0" cellpadding="2" cellspacing="2" width="605">
				<tbody>
						<tr align="center">
								<td height="30">精妙SQL语句整理</td>
						</tr>
						<tr align="center">
								<td height="30">来源：http://www.dwww.cn/new/200610171741543002.html <br /></td>
						</tr>
						<tr>
								<td style="" valign="top">
										<div class="content">
												<p>一、基础 <br /><br />1、说明：创建数据库 <br />CREATE DATABASE database-name <br />2、说明：删除数据库 <br />drop database dbname <br />3、说明：备份sql server <br />--- 创建 备份数据的 device <br />USE master <br />EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat' <br />--- 开始 备份 <br />BACKUP DATABASE pubs TO testBack <br />4、说明：创建新表 <br />create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) <br />根据已有的表创建新表： <br />A：create table tab_new like tab_old (使用旧表创建新表) <br />B：create table tab_new as select col1,col2… from tab_old definition only <br />5、说明：删除新表 <br />drop table tabname <br />6、说明：增加一个列 <br />Alter table tabname add column col type <br />注：列增加后将不能删除。DB2中列加上后数据类型也不能改变，唯一能改变的是增加varchar类型的长度。 <br />7、说明：添加主键： Alter table tabname add primary key(col) <br />说明：删除主键： Alter table tabname drop primary key(col) <br />8、说明：创建索引：create [unique] index idxname on tabname(col….) <br />删除索引：drop index idxname <br />注：索引是不可更改的，想更改必须删除重新建。 <br />9、说明：创建视图：create view viewname as select statement <br />删除视图：drop view viewname <br />10、说明：几个简单的基本的sql语句 <br />选择：select * from table1 where 范围 <br />插入：insert into table1(field1,field2) values(value1,value2) <br />删除：delete from table1 where 范围 <br />更新：update table1 set field1=value1 where 范围 <br />查找：select * from table1 where field1 like ’%value1%’ ---like的语法很精妙，查资料! <br />排序：select * from table1 order by field1,field2 [desc] <br />总数：select count as totalcount from table1 <br />求和：select sum(field1) as sumvalue from table1 <br />平均：select avg(field1) as avgvalue from table1 <br />最大：select max(field1) as maxvalue from table1 <br />最小：select min(field1) as minvalue from table1 <br />11、说明：几个高级查询运算词 <br />A： UNION 运算符 <br />UNION
运算符通过组合其他两个结果表（例如 TABLE1 和 TABLE2）并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION
一起使用时（即 UNION ALL），不消除重复行。两种情况下，派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 <br />B： EXCEPT 运算符 <br />EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL)，不消除重复行。 <br />C： INTERSECT 运算符 <br />INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL)，不消除重复行。 <br />注：使用运算词的几个查询结果行必须是一致的。 <br />12、说明：使用外连接 <br />A、left outer join： <br />左外连接（左连接）：结果集几包括连接表的匹配行，也包括左连接表的所有行。 <br />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 <br />B：right outer join: <br />右外连接(右连接)：结果集既包括连接表的匹配连接行，也包括右连接表的所有行。 <br />C：full outer join： <br />全外连接：不仅包括符号连接表的匹配行，还包括两个连接表中的所有记录。 <br /><br />二、提升 <br /><br />1、说明：复制表(只复制结构,源表名：a 新表名：b) (Access可用) <br />法一：select * into b from a where 1&lt;&gt;1 <br />法二：select top 0 * into b from a <br /><br />2、说明：拷贝表(拷贝数据,源表名：a 目标表名：b) (Access可用) <br />insert into b(a, b, c) select d,e,f from b; <br /><br />3、说明：跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) <br />insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件 <br />例子：..from b in '"&amp;Server.MapPath(".")&amp;"data.mdb" &amp;"' where.. <br /><br />4、说明：子查询(表名1：a 表名2：b) <br />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) <br /><br />5、说明：显示文章、提交人和最后回复时间 <br />select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b <br /><br />6、说明：外连接查询(表名1：a 表名2：b) <br />select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c <br /><br />7、说明：在线视图查询(表名1：a ) <br />select * from (SELECT a,b,c FROM a) T where t.a &gt; 1; <br /><br />8、说明：between的用法,between限制查询数据范围时包括了边界值,not between不包括 <br />select * from table1 where time between time1 and time2 <br />select a,b,c, from table1 where a not between 数值1 and 数值2 <br /><br />9、说明：in 的使用方法 <br />select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’) <br /><br />10、说明：两张关联表，删除主表中已经在副表中没有的信息 <br />delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) <br /><br />11、说明：四表联查问题： <br />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 ..... <br /><br />12、说明：日程安排提前五分钟提醒 <br />SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())&gt;5 <br /><br />13、说明：一条sql 语句搞定数据库分页 <br />select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 <br /><br />14、说明：前10条记录 <br />select top 10 * form table1 where 范围 <br /><br />15、说明：选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) <br />select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) <br /><br />16、说明：包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 <br />(select a from tableA ) except (select a from tableB) except (select a from tableC) <br /><br />17、说明：随机取出10条数据 <br />select top 10 * from tablename order by newid() <br /><br />18、说明：随机选择记录 <br />select newid() <br /><br />19、说明：删除重复记录 <br />Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) <br /><br />20、说明：列出数据库里所有的表名 <br />select name from sysobjects where type='U' <br /><br />21、说明：列出表里的所有的 <br />select name from syscolumns where id=object_id('TableName') <br /><br />22、说明：列示type、vender、pcs字段，以type字段排列，case可以方便地实现多重选择，类似select 中的case。 <br />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 <br />显示结果： <br />type vender pcs <br />电脑 A 1 <br />电脑 A 1 <br />光盘 B 2 <br />光盘 A 2 <br />手机 B 3 <br />手机 C 3 <br /><br />23、说明：初始化表table1 <br /><br />TRUNCATE TABLE table1 <br /><br />24、说明：选择从10到15的记录 <br />select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc <br /><br />三、技巧 <br /><br />1、1=1，1=2的使用，在SQL语句组合时用的较多 <br /><br />“where 1=1” 是表示选择全部 “where 1=2”全部不选， <br />如： <br />if @strWhere !='' <br />begin <br />set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere <br />end <br />else <br />begin <br />set @strSQL = 'select count(*) as Total from [' + @tblName + ']' <br />end <br /><br />我们可以直接写成 <br />set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere <br /><br />2、收缩数据库 <br />--重建索引 <br />DBCC REINDEX <br />DBCC INDEXDEFRAG <br />--收缩数据和日志 <br />DBCC SHRINKDB <br />DBCC SHRINKFILE <br /><br />3、压缩数据库 <br />dbcc shrinkdatabase(dbname) <br /><br />4、转移数据库给新用户以已存在用户权限 <br />exec sp_change_users_login 'update_one','newname','oldname' <br />go <br /><br />5、检查备份集 <br />RESTORE VERIFYONLY from disk='E:dvbbs.bak' <br /><br />6、修复数据库 <br />ALTER DATABASE [dvbbs] SET SINGLE_USER <br />GO <br />DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK <br />GO <br />ALTER DATABASE [dvbbs] SET MULTI_USER <br />GO <br /><br />7、日志清除 <br />SET NOCOUNT ON <br />DECLARE @LogicalFileName sysname, <br />@MaxMinutes INT, <br />@NewSize INT <br /><br /><br />USE tablename -- 要操作的数据库名 <br />SELECT @LogicalFileName = 'tablename_log', -- 日志文件名 <br />@MaxMinutes = 10, -- Limit on time allowed to wrap log. <br />@NewSize = 1 -- 你想设定的日志文件的大小(M) <br /><br />-- Setup / initialize <br />DECLARE @OriginalSize int <br />SELECT @OriginalSize = size <br />FROM sysfiles <br />WHERE name = @LogicalFileName <br />SELECT 'Original Size of ' + db_name() + ' LOG is ' + <br />CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + <br />CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' <br />FROM sysfiles <br />WHERE name = @LogicalFileName <br />CREATE TABLE DummyTrans <br />(DummyColumn char (8000) not null) <br /><br /><br />DECLARE @Counter INT, <br />@StartTime DATETIME, <br />@TruncLog VARCHAR(255) <br />SELECT @StartTime = GETDATE(), <br />@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' <br /><br />DBCC SHRINKFILE (@LogicalFileName, @NewSize) <br />EXEC (@TruncLog) <br />-- Wrap the log if necessary. <br />WHILE @MaxMinutes &gt; DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired <br />AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName) <br />AND (@OriginalSize * 8 /1024) &gt; @NewSize <br />BEGIN -- Outer loop. <br />SELECT @Counter = 0 <br />WHILE ((@Counter &lt; @OriginalSize / 16) AND (@Counter &lt; 50000)) <br />BEGIN -- update <br />INSERT DummyTrans VALUES ('Fill Log') <br />DELETE DummyTrans <br />SELECT @Counter = @Counter + 1 <br />END <br />EXEC (@TruncLog) <br />END <br />SELECT 'Final Size of ' + db_name() + ' LOG is ' + <br />CONVERT(VARCHAR(30),size) + ' 8K pages or ' + <br />CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' <br />FROM sysfiles <br />WHERE name = @LogicalFileName <br />DROP TABLE DummyTrans <br />SET NOCOUNT OFF <br /><br />8、说明：更改某个表 <br />exec sp_changeobjectowner 'tablename','dbo' <br /><br />9、存储更改全部表 <br /><br />CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch <br />@OldOwner as NVARCHAR(128), <br />@NewOwner as NVARCHAR(128) <br />AS <br /><br />DECLARE @Name as NVARCHAR(128) <br />DECLARE @Owner as NVARCHAR(128) <br />DECLARE @OwnerName as NVARCHAR(128) <br /><br />DECLARE curObject CURSOR FOR <br />select 'Name' = name, <br />'Owner' = user_name(uid) <br />from sysobjects <br />where user_name(uid)=@OldOwner <br />order by name <br /><br />OPEN curObject <br />FETCH NEXT FROM curObject INTO @Name, @Owner <br />WHILE(@@FETCH_STATUS=0) <br />BEGIN <br />if @Owner=@OldOwner <br />begin <br />set @OwnerName = @OldOwner + '.' + rtrim(@Name) <br />exec sp_changeobjectowner @OwnerName, @NewOwner <br />end <br />-- select @name,@NewOwner,@OldOwner <br /><br />FETCH NEXT FROM curObject INTO @Name, @Owner <br />END <br /><br />close curObject <br />deallocate curObject <br />GO <br /><br /><br />10、SQL SERVER中直接循环写入数据 <br />declare @i int <br />set @i=1 <br />while @i&lt;30 <br />begin <br />insert into test (userid) values(@i) <br />set @i=@i+1 <br />end <br /><br />小记存储过程中经常用到的本周，本月，本年函数 <br />Dateadd(wk,datediff(wk,0,getdate()),-1) <br />Dateadd(wk,datediff(wk,0,getdate()),6) <br /><br />Dateadd(mm,datediff(mm,0,getdate()),0) <br />Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0)) <br /><br />Dateadd(yy,datediff(yy,0,getdate()),0) <br />Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) <br /><br />上面的SQL代码只是一个时间段 <br />Dateadd(wk,datediff(wk,0,getdate()),-1) <br />Dateadd(wk,datediff(wk,0,getdate()),6) <br />就是表示本周时间段. <br />下面的SQL的条件部分,就是查询时间段在本周范围内的: <br />Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6) <br />而在存储过程中 <br />select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1) <br />select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6) </p>
												<p>最后，再补充一些：</p>
												<p>分组group</p>
												<p>　　常用于统计时，如分组查总数：<br />select gender,count(sno) <br />from students<br />group by gender<br />(查看男女学生各有多少)</p>
												<p>　　注意：从哪种角度分组就从哪列"group by"</p>
												<p>　　对于多重分组，只需将分组规则罗列。比如查询各届各专业的男女同学人数 ，那么分组规则有：届别(grade)、专业(mno)和性别(gender)，所以有"group by grade, mno, gender"</p>
												<p>select grade, mno, gender, count(*)<br />from students<br />group by grade, mno, gender</p>
												<p>　　通常group还和having联用，比如查询1门课以上不及格的学生，则按学号(sno)分类有：</p>
												<p>select sno,count(*) from grades <br />where mark&lt;60<br />group by sno<br />having count(*)&gt;1 </p>
												<p>　　6.UNION联合</p>
												<p>　　合并查询结果，如：</p>
												<p>SELECT * FROM students<br />WHERE name like ‘张%’<br />UNION [ALL]<br />SELECT * FROM students<br />WHERE name like ‘李%’</p>
												<p>　　7.多表查询</p>
												<p>　　a.内连接</p>
												<p>select g.sno,s.name,c.coursename <br />from grades g JOIN students s ON g.sno=s.sno<br />JOIN courses c ON g.cno=c.cno<br />(注意可以引用别名)<br />b.外连接<br />b1.左连接<br />select courses.cno,max(coursename),count(sno) <br />from courses LEFT JOIN grades ON courses.cno=grades.cno <br />group by courses.cno</p>
												<p>　　左连接特点：显示全部左边表中的所有项目，即使其中有些项中的数据未填写完全。</p>
												<p>　　左外连接返回那些存在于左表而右表中却没有的行，再加上内连接的行。</p>
												<p>　　b2.右连接</p>
												<p>　　与左连接类似</p>
												<p>　　b3.全连接</p>
												<p>select sno,name,major <br />from students FULL JOIN majors ON students.mno=majors.mno</p>
												<p>　　两边表中的内容全部显示</p>
												<p>　　c.自身连接</p>
												<p>select c1.cno,c1.coursename,c1.pno,c2.coursename <br />from courses c1,courses c2 where c1.pno=c2.cno</p>
												<p>　　采用别名解决问题。</p>
												<p>　　d.交叉连接</p>
												<p>select lastname+firstname from lastname CROSS JOIN firstanme</p>
												<p>　　相当于做笛卡儿积</p>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cnitblog.com/duckuu/aggbug/20725.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/duckuu/" target="_blank">duckuu的学习空间</a> 2006-12-18 10:44 <a href="http://www.cnitblog.com/duckuu/archive/2006/12/18/20725.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>这里不错啊！</title><link>http://www.cnitblog.com/duckuu/archive/2006/07/21/13974.html</link><dc:creator>duckuu的学习空间</dc:creator><author>duckuu的学习空间</author><pubDate>Fri, 21 Jul 2006 09:44:00 GMT</pubDate><guid>http://www.cnitblog.com/duckuu/archive/2006/07/21/13974.html</guid><wfw:comment>http://www.cnitblog.com/duckuu/comments/13974.html</wfw:comment><comments>http://www.cnitblog.com/duckuu/archive/2006/07/21/13974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/duckuu/comments/commentRss/13974.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/duckuu/services/trackbacks/13974.html</trackback:ping><description><![CDATA[first！<img src ="http://www.cnitblog.com/duckuu/aggbug/13974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/duckuu/" target="_blank">duckuu的学习空间</a> 2006-07-21 17:44 <a href="http://www.cnitblog.com/duckuu/archive/2006/07/21/13974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>