﻿<?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>C++博客-Thinking in C++-文章分类-DB</title><link>http://www.cppblog.com/yishanhante/category/4556.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 20 May 2008 09:59:13 GMT</lastBuildDate><pubDate>Tue, 20 May 2008 09:59:13 GMT</pubDate><ttl>60</ttl><item><title>SQL精妙语句</title><link>http://www.cppblog.com/yishanhante/articles/26612.html</link><dc:creator>jay</dc:creator><author>jay</author><pubDate>Tue, 19 Jun 2007 02:56:00 GMT</pubDate><guid>http://www.cppblog.com/yishanhante/articles/26612.html</guid><wfw:comment>http://www.cppblog.com/yishanhante/comments/26612.html</wfw:comment><comments>http://www.cppblog.com/yishanhante/articles/26612.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yishanhante/comments/commentRss/26612.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yishanhante/services/trackbacks/26612.html</trackback:ping><description><![CDATA[说明：复制表(只复制结构,源表名：a 新表名：b)
<p>SQL: select * into b from a where 11 </p>
<p>说明：拷贝表(拷贝数据,源表名：a 目标表名：b) </p>
<p>SQL: insert into b(a, b, c) select d,e,f from b; </p>
<p>说明：显示文章、提交人和最后回复时间<br><a id=more-168></a><br>SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b </p>
<p>说明：外连接查询(表名1：a 表名2：b) </p>
<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 </p>
<p>说明：日程安排提前五分钟提醒 </p>
<p>SQL: select * from 日程安排 where datediff(&#8217;minute&#8217;,f开始时间,getdate())&gt;5 </p>
<p>说明：两张关联表，删除主表中已经在副表中没有的信息 </p>
<p>SQL: </p>
<p>delete from info where not exists ( select * from infobz where info.infid=infobz.infid ) </p>
<p>说明：&#8211; </p>
<p>SQL: </p>
<p>SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE </p>
<p>FROM TABLE1, </p>
<p>(SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE </p>
<p>FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND </p>
<p>FROM TABLE2 </p>
<p>WHERE TO_CHAR(UPD_DATE,&#8217;YYYY/MM&#8217;) = TO_CHAR(SYSDATE, &#8216;YYYY/MM&#8217;)) X, </p>
<p>(SELECT NUM, UPD_DATE, STOCK_ONHAND </p>
<p>FROM TABLE2 </p>
<p>WHERE TO_CHAR(UPD_DATE,&#8217;YYYY/MM&#8217;) = </p>
<p>TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, &#8216;YYYY/MM&#8217;) &#166;&#166; &#8216;/01&#8242;,&#8217;YYYY/MM/DD&#8217;) - 1, &#8216;YYYY/MM&#8217;) ) Y, </p>
<p>WHERE X.NUM = Y.NUM （+） </p>
<p>AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) X.STOCK_ONHAND ) B </p>
<p>WHERE A.NUM = B.NUM </p>
<p>说明：&#8211; </p>
<p>SQL: </p>
<p>select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and 系名称=&#8217;&#8221;&amp;strdepartmentname&amp;&#8221;&#8216; and 专业名称=&#8217;&#8221;&amp;strprofessionname&amp;&#8221;&#8216; order by 性别,生源地,高考总成绩 </p>
<p>说明： </p>
<p>从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源） </p>
<p>SQL: </p>
<p>SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, &#8216;yyyy&#8217;) AS telyear, </p>
<p>SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8216;01&#8242;, a.factration)) AS JAN, </p>
<p>SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8216;02&#8242;, a.factration)) AS FRI, </p>
<p>SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8216;03&#8242;, a.factration)) AS MAR, </p>
<p>SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8216;04&#8242;, a.factration)) AS APR, </p>
<p>SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8216;05&#8242;, a.factration)) AS MAY, </p>
<p>SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8216;06&#8242;, a.factration)) AS JUE, </p>
<p>SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8216;07&#8242;, a.factration)) AS JUL, </p>
<p>SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8216;08&#8242;, a.factration)) AS AGU, </p>
<p>SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8216;09&#8242;, a.factration)) AS SEP, </p>
<p>SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8216;10&#8242;, a.factration)) AS OCT, </p>
<p>SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8216;11&#8242;, a.factration)) AS NOV, </p>
<p>SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8216;12&#8242;, a.factration)) AS DEC </p>
<p>FROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration </p>
<p>FROM TELFEESTAND a, TELFEE b </p>
<p>WHERE a.tel = b.telfax) a </p>
<p>GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, &#8216;yyyy&#8217;) </p>
<p>说明：四表联查问题： </p>
<p>SQL: 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 &#8230;.. </p>
<p>说明：得到表中最小的未使用的ID号 </p>
<p>SQL: </p>
<p>SELECT (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID </p>
<p>FROM Handle </p>
<p>WHERE NOT HandleID IN (SELECT a.HandleID - 1 FROM Handle a)</p>
<p>——————————————————————————&#8211;</p>
<p>1.说明：复制表(只复制结构,源表名：a 新表名：b)<br>SQL: select * into b from a where 11 </p>
<p>2.说明：拷贝表(拷贝数据,源表名：a 目标表名：b) </p>
<p>SQL: insert into b(a, b, c) select d,e,f from a; </p>
<p>3.说明：显示文章、提交人和最后回复时间 </p>
<p>SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b </p>
<p>4.说明：外连接查询(表名1：a 表名2：b) </p>
<p>SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUTER JOIN b ON a.a = b.c </p>
<p>5.说明：日程安排提前五分钟提醒 </p>
<p>SQL: select * from 日程安排 where datediff(&#8217;minute&#8217;,f开始时间,getdate())&gt;5 </p>
<p>6.说明：两张关联表，删除主表中已经在副表中没有的信息 </p>
<p>SQL: </p>
<p>delete from info where not exists ( select * from infobz where info.infid=infobz.infid ) </p>
<p>说明：&#8211; </p>
<p>SQL: </p>
<p>SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE </p>
<p>FROM TABLE1, </p>
<p>(SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE </p>
<p>FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND </p>
<p>FROM TABLE2 </p>
<p>WHERE TO_CHAR(UPD_DATE,&#8217;YYYY/MM&#8217;) = TO_CHAR(SYSDATE, &#8216;YYYY/MM&#8217;)) X, </p>
<p>(SELECT NUM, UPD_DATE, STOCK_ONHAND </p>
<p>FROM TABLE2 </p>
<p>WHERE TO_CHAR(UPD_DATE,&#8217;YYYY/MM&#8217;) = </p>
<p>TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, &#8216;YYYY/MM&#8217;) || &#8216;/01&#8242;,&#8217;YYYY/MM/DD&#8217;) - 1, &#8216;YYYY/MM&#8217;) ) Y, </p>
<p>WHERE X.NUM = Y.NUM （+） </p>
<p>AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) X.STOCK_ONHAND ) B </p>
<p>WHERE A.NUM = B.NUM </p>
<p>说明：&#8211; </p>
<p>SQL: </p>
<p>select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and 系名称=&#8217;&#8221;&amp;strdepartmentname&amp;&#8221;&#8216; and 专业名称=&#8217;&#8221;&amp;strprofessionname&amp;&#8221;&#8216; order by 性别,生源地,高考总成绩 </p>
<p>7.说明： </p>
<p>从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源） </p>
<p>SQL: </p>
<p>SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, &#8216;yyyy&#8217;) AS telyear, </p>
<p>SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8216;01&#8242;, a.factration)) AS JAN, </p>
<p>SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8216;02&#8242;, a.factration)) AS FRI, </p>
<p>SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8216;03&#8242;, a.factration)) AS MAR, </p>
<p>SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8216;04&#8242;, a.factration)) AS APR, </p>
<p>SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8216;05&#8242;, a.factration)) AS MAY, </p>
<p>SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8216;06&#8242;, a.factration)) AS JUE, </p>
<p>SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8216;07&#8242;, a.factration)) AS JUL, </p>
<p>SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8216;08&#8242;, a.factration)) AS AGU, </p>
<p>SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8216;09&#8242;, a.factration)) AS SEP, </p>
<p>SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8216;10&#8242;, a.factration)) AS OCT, </p>
<p>SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8216;11&#8242;, a.factration)) AS NOV, </p>
<p>SUM(decode(TO_CHAR(a.telfeedate, &#8216;mm&#8217;), &#8216;12&#8242;, a.factration)) AS DEC </p>
<p>FROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration </p>
<p>FROM TELFEESTAND a, TELFEE b </p>
<p>WHERE a.tel = b.telfax) a </p>
<p>GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, &#8216;yyyy&#8217;) </p>
<p>8.说明：四表联查问题： </p>
<p>SQL: 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 &#8230;.. </p>
<p>9.说明：得到表中最小的未使用的ID号 </p>
<p>SQL: </p>
<p>SELECT (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID </p>
<p>FROM Handle </p>
<p>WHERE NOT HandleID IN (SELECT a.HandleID - 1 FROM Handle a)</p>
<p>9.SQL语句技巧<br>9.1、一个SQL语句的问题:行列转换<br>select * from v_temp<br>上面的视图结果如下:<br>user_name role_name<br>————————-<br>系统管理员 管理员<br>feng 管理员<br>feng 一般用户<br>test 一般用户<br>想把结果变成这样:<br>user_name role_name<br>—————————<br>系统管理员 管理员<br>feng 管理员,一般用户<br>test 一般用户<br>===================<br>create table a_test(name varchar(20),role2 varchar(20))<br>insert into a_test values(&#8217;李&#8217;,'管理員&#8217;)<br>insert into a_test values(&#8217;張&#8217;,'管理員&#8217;)<br>insert into a_test values(&#8217;張&#8217;,'一般用戶&#8217;)<br>insert into a_test values(&#8217;常&#8217;,'一般用戶&#8217;)</p>
<p>create function join_str(@content varchar(100))<br>returns varchar(2000)<br>as<br>begin<br>declare @str varchar(2000)<br>set @str=&#8221;<br>select @str=@str+&#8217;,'+rtrim(role2) from a_test where [name]=@content<br>select @str=right(@str,len(@str)-1)<br>return @str<br>end<br>go</p>
<p>&#8211;调用：<br>select [name],dbo.join_str([name]) role2 from a_test group by [name]</p>
<p>&#8211;select distinct name,dbo.uf_test(name) from a_test</p>
<p>9.2、求助！快速比较结构相同的两表<br>结构相同的两表，一表有记录3万条左右，一表有记录2万条左右，我怎样快速查找两表的不同记录？<br>============================<br>给你一个测试方法，从northwind中的orders表取数据。<br>select * into n1 from orders<br>select * into n2 from orders</p>
<p>select * from n1<br>select * from n2</p>
<p>&#8211;添加主键，然后修改n1中若干字段的若干条<br>alter table n1 add constraint pk_n1_id primary key (OrderID)<br>alter table n2 add constraint pk_n2_id primary key (OrderID)</p>
<p>select OrderID from (select * from n1<br>union<br>select * from n2) a group by OrderID having count(*) &gt; 1</p>
<p>应该可以，而且将不同的记录的ID显示出来。<br>下面的适用于双方记录一样的情况，</p>
<p>select * from n1 where orderid in<br>(<br>select OrderID from (select * from n1<br>union<br>select * from n2) a group by OrderID having count(*) &gt; 1<br>)<br>至于双方互不存在的记录是比较好处理的<br>&#8211;删除n1,n2中若干条记录<br>delete from n1 where orderID in (&#8217;10728&#8242;,&#8217;10730&#8242;)<br>delete from n2 where orderID in (&#8217;11000&#8242;,&#8217;11001&#8242;)</p>
<p>&#8211;*************************************************************<br>&#8211; 双方都有该记录却不完全相同<br>select * from n1 where orderid in<br>(<br>select OrderID from (select * from n1<br>union<br>select * from n2) a group by OrderID having count(*) &gt; 1<br>)<br>union<br>&#8211;n2中存在但在n1中不存的在10728,10730<br>select * from n1 where OrderID not in (select OrderID from n2)<br>union<br>&#8211;n1中存在但在n2中不存的在11000,11001<br>select * from n2 where OrderID not in (select OrderID from n1)</p>
<p>9.3、四种方法取表里n到m条纪录：</p>
<p>1.<br>select top m * into 临时表(或表变量) from tablename order by columnname — 将top m笔插入<br>set rowcount n<br>select * from 表变量 order by columnname desc</p>
<p>2.<br>select top n * from<br>(select top m * from tablename order by columnname) a<br>order by columnname desc</p>
<p>3.如果tablename里没有其他identity列，那么：<br>select identity(int) id0,* into #temp from tablename</p>
<p>取n到m条的语句为：<br>select * from #temp where id0 &gt;=n and id0 1&#8242;<br>exec(@sql)<br>open cur_rows<br>fetch cur_rows into @id,@max<br>while @@fetch_status=0<br>begin<br>select @max = @max -1<br>set rowcount @max<br>select @type = xtype from syscolumns where id=object_id(@t_name) and name=@f_key<br>if @type=56<br>select @sql = &#8216;delete from &#8216;+@t_name+&#8217; where &#8216; + @f_key+&#8217; = &#8216;+ @id<br>if @type=167<br>select @sql = &#8216;delete from &#8216;+@t_name+&#8217; where &#8216; + @f_key+&#8217; = &#8216;+&#8221;&#8221;+ @id +&#8221;&#8221;<br>exec(@sql)<br>fetch cur_rows into @id,@max<br>end<br>close cur_rows<br>deallocate cur_rows<br>set rowcount 0<br>end</p>
<p>select * from systypes<br>select * from syscolumns where id = object_id(&#8217;a_dist&#8217;)</p>
<p>9.4.查询数据的最大排序问题（只能用一条语句写）<br>CREATE TABLE hard (qu char (11) ,co char (11) ,je numeric(3, 0)) </p>
<p>insert into hard values (&#8217;A',&#8217;1&#8242;,3)<br>insert into hard values (&#8217;A',&#8217;2&#8242;,4)<br>insert into hard values (&#8217;A',&#8217;4&#8242;,2)<br>insert into hard values (&#8217;A',&#8217;6&#8242;,9)<br>insert into hard values (&#8217;B',&#8217;1&#8242;,4)<br>insert into hard values (&#8217;B',&#8217;2&#8242;,5)<br>insert into hard values (&#8217;B',&#8217;3&#8242;,6)<br>insert into hard values (&#8217;C',&#8217;3&#8242;,4)<br>insert into hard values (&#8217;C',&#8217;6&#8242;,7)<br>insert into hard values (&#8217;C',&#8217;2&#8242;,3)</p>
<p>要求查询出来的结果如下：</p>
<p>qu co je<br>———&#8211; ———&#8211; —&#8211;<br>A 6 9<br>A 2 4<br>B 3 6<br>B 2 5<br>C 6 7<br>C 3 4</p>
<p>就是要按qu分组，每组中取je最大的前2位！！<br>而且只能用一句sql语句！！！<br>select * from hard a where je in (select top 2 je from hard b where a.qu=b.qu order by je)<br>9.5.求删除重复记录的sql语句？<br>怎样把具有相同字段的纪录删除，只留下一条。<br>例如，表test里有id,name字段<br>如果有name相同的记录 只留下一条，其余的删除。<br>name的内容不定，相同的记录数不定。<br>有没有这样的sql语句？<br>==============================<br>A:一个完整的解决方案：</p>
<p>将重复的记录记入temp1表:<br>select [标志字段id],count(*) into temp1 from [表名]<br>group by [标志字段id]<br>having count(*)&gt;1</p>
<p>2、将不重复的记录记入temp1表:<br>insert temp1<br>select [标志字段id],count(*) from [表名]<br>group by [标志字段id]<br>having count(*)=1</p>
<p>3、作一个包含所有不重复记录的表：<br>select * into temp2 from [表名]<br>where 标志字段id in(select 标志字段id from temp1)</p>
<p>4、删除重复表:<br>delete [表名]</p>
<p>5、恢复表：<br>insert [表名]<br>select * from temp2</p>
<p>6、删除临时表:<br>drop table temp1<br>drop table temp2<br>================================<br>B:<br>create table a_dist(id int,name varchar(20))</p>
<p>insert into a_dist values(1,&#8217;abc&#8217;)<br>insert into a_dist values(1,&#8217;abc&#8217;)<br>insert into a_dist values(1,&#8217;abc&#8217;)<br>insert into a_dist values(1,&#8217;abc&#8217;)</p>
<p>exec up_distinct &#8216;a_dist&#8217;,'id&#8217;</p>
<p>select * from a_dist</p>
<p>create procedure up_distinct(@t_name varchar(30),@f_key varchar(30))<br>&#8211;f_key表示是分組字段﹐即主鍵字段<br>as<br>begin<br>declare @max integer,@id varchar(30) ,@sql varchar(7999) ,@type integer<br>select @sql = &#8216;declare cur_rows cursor for select &#8216;+@f_key+&#8217; ,count(*) from &#8216; +@t_name +&#8217; group by &#8216; +@f_key +&#8217; having count(*) &gt; 1&#8242;<br>exec(@sql)<br>open cur_rows<br>fetch cur_rows into @id,@max<br>while @@fetch_status=0<br>begin<br>select @max = @max -1<br>set rowcount @max<br>select @type = xtype from syscolumns where id=object_id(@t_name) and name=@f_key<br>if @type=56<br>select @sql = &#8216;delete from &#8216;+@t_name+&#8217; where &#8216; + @f_key+&#8217; = &#8216;+ @id<br>if @type=167<br>select @sql = &#8216;delete from &#8216;+@t_name+&#8217; where &#8216; + @f_key+&#8217; = &#8216;+&#8221;&#8221;+ @id +&#8221;&#8221;<br>exec(@sql)<br>fetch cur_rows into @id,@max<br>end<br>close cur_rows<br>deallocate cur_rows<br>set rowcount 0<br>end</p>
<p>select * from systypes<br>select * from syscolumns where id = object_id(&#8217;a_dist&#8217;)</p>
<p>10.1. 行列转换&#8211;普通 </p>
<p>假设有张学生成绩表(CJ)如下<br>Name Subject Result<br>张三 语文 80<br>张三 数学 90<br>张三 物理 85<br>李四 语文 85<br>李四 数学 92<br>李四 物理 82 </p>
<p>想变成<br>姓名 语文 数学 物理<br>张三 80 90 85<br>李四 85 92 82 </p>
<p>declare @sql varchar(4000)<br>set @sql = &#8217;select Name&#8217;<br>select @sql = @sql + &#8216;,sum(case Subject when &#8221;&#8217;+Subject+&#8221;&#8217; then Result end) [&#8217;+Subject+&#8217;]&#8217;<br>from (select distinct Subject from CJ) as a<br>select @sql = @sql+&#8217; from test group by name&#8217;<br>exec(@sql) </p>
<p>10.2. 行列转换&#8211;合并 </p>
<p>有表A,<br>id pid<br>1 1<br>1 2<br>1 3<br>2 1<br>2 2<br>3 1<br>如何化成表B:<br>id pid<br>1 1,2,3<br>2 1,2<br>3 1 </p>
<p>创建一个合并的函数<br>create function fmerg(@id int)<br>returns varchar(8000)<br>as<br>begin<br>declare @str varchar(8000)<br>set @str=&#8221;<br>select @str=@str+&#8217;,'+cast(pid as varchar) from 表A where id=@id<br>set @str=right(@str,len(@str)-1)<br>return(@str)<br>End<br>go </p>
<p>&#8211;调用自定义函数得到结果<br>select distinct id,dbo.fmerg(id) from 表A </p>
<p>10.3. 如何取得一个数据表的所有列名 </p>
<p>方法如下：先从SYSTEMOBJECT系统表中取得数据表的SYSTEMID,然后再SYSCOLUMN表中取得该数据表的所有列名。<br>SQL语句如下：<br>declare @objid int,@objname char(40)<br>set @objname = &#8216;tablename&#8217;<br>select @objid = id from sysobjects where id = object_id(@objname)<br>select &#8216;Column_name&#8217; = name from syscolumns where id = @objid order by colid </p>
<p>是不是太简单了？ 呵呵 不过经常用阿. </p>
<p>10.4. 通过SQL语句来更改用户的密码 </p>
<p>修改别人的,需要sysadmin role<br>EXEC sp_password NULL, &#8216;newpassword&#8217;, &#8216;User&#8217; </p>
<p>如果帐号为SA执行EXEC sp_password NULL, &#8216;newpassword&#8217;, sa </p>
<p>10.5. 怎么判断出一个表的哪些字段不允许为空？ </p>
<p>select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where IS_NULLABLE=&#8217;NO&#8217; and TABLE_NAME=tablename </p>
<p>10.6. 如何在数据库里找到含有相同字段的表？<br>a. 查已知列名的情况<br>SELECT b.name as TableName,a.name as columnname<br>From syscolumns a INNER JOIN sysobjects b<br>ON a.id=b.id<br>AND b.type=&#8217;U&#8217;<br>AND a.name=&#8217;你的字段名字&#8217; </p>
<p>b. 未知列名查所有在不同表出现过的列名<br>Select o.name As tablename,s1.name As columnname<br>From syscolumns s1, sysobjects o<br>Where s1.id = o.id<br>And o.type = &#8216;U&#8217;<br>And Exists (<br>Select 1 From syscolumns s2<br>Where s1.name = s2.name<br>And s1.id s2.id<br>) </p>
<p>10.7. 查询第xxx行数据 </p>
<p>假设id是主键：<br>select *<br>from (select top xxx * from yourtable) aa<br>where not exists(select 1 from (select top xxx-1 * from yourtable) bb where aa.id=bb.id) </p>
<p>如果使用游标也是可以的<br>fetch absolute [number] from [cursor_name]<br>行数为绝对行数 </p>
<p>10.8. SQL Server日期计算<br>a. 一个月的第一天<br>SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)<br>b. 本周的星期一<br>SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)<br>c. 一年的第一天<br>SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)<br>d. 季度的第一天<br>SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)<br>e. 上个月的最后一天<br>SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))<br>f. 去年的最后一天<br>SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))<br>g. 本月的最后一天<br>SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))<br>h. 本月的第一个星期一<br>select DATEADD(wk, DATEDIFF(wk,0,<br>dateadd(dd,6-datepart(day,getdate()),getdate())<br>), 0)<br>i. 本年的最后一天<br>SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))。 </p>
<p>11.1.获取表结构[把 &#8217;sysobjects&#8217; 替换 成 &#8216;tablename&#8217; 即可] </p>
<p>SELECT CASE IsNull(I.name, &#8221;)<br>When &#8221; Then &#8221;<br>Else &#8216;*&#8217;<br>End as IsPK,<br>Object_Name(A.id) as t_name,<br>A.name as c_name,<br>IsNull(SubString(M.text, 1, 254), &#8221;) as pbc_init,<br>T.name as F_DataType,<br>CASE IsNull(TYPEPROPERTY(T.name, &#8216;Scale&#8217;), &#8221;)<br>WHEN &#8221; Then Cast(A.prec as varchar)<br>ELSE Cast(A.prec as varchar) + &#8216;,&#8217; + Cast(A.scale as varchar)<br>END as F_Scale,<br>A.isnullable as F_isNullAble<br>FROM Syscolumns as A<br>JOIN Systypes as T<br>ON (A.xType = T.xUserType AND A.Id = Object_id(&#8217;sysobjects&#8217;) )<br>LEFT JOIN ( SysIndexes as I<br>JOIN Syscolumns as A1<br>ON ( I.id = A1.id and A1.id = object_id(&#8217;sysobjects&#8217;) and (I.status &amp; 0&#215;800) = 0&#215;800 AND A1.colid 0 then &#8216;&#8730;&#8217; else &#8221; end) N&#8217;主键&#8217;,<br>b.name N&#8217;类型&#8217;,<br>a.length N&#8217;占用字节数&#8217;,<br>COLUMNPROPERTY(a.id,a.name,&#8217;PRECISION&#8217;) as N&#8217;长度&#8217;,<br>isnull(COLUMNPROPERTY(a.id,a.name,&#8217;Scale&#8217;),0) as N&#8217;小数位数&#8217;,<br>(case when a.isnullable=1 then &#8216;&#8730;&#8217;else &#8221; end) N&#8217;允许空&#8217;,<br>isnull(e.text,&#8221;) N&#8217;默认值&#8217;,<br>isnull(g.[value],&#8221;) AS N&#8217;字段说明&#8217;<br>FROM syscolumns a<br>left join systypes b<br>on a.xtype=b.xusertype<br>inner join sysobjects d<br>on a.id=d.id and d.xtype=&#8217;U&#8217; and d.name&#8217;dtproperties&#8217;<br>left join syscomments e<br>on a.cdefault=e.id<br>left join sysproperties g<br>on a.id=g.id AND a.colid = g.smallid<br>order by object_name(a.id),a.colorder </p>
<p>11.3.快速获取表test的记录总数[对大容量表非常有效] </p>
<p>快速获取表test的记录总数:<br>select rows from sysindexes where id = object_id(&#8216;test&#8217;) and indid in (0,1)</p>
<p>update 2 set KHXH=(ID+1)\2 2行递增编号<br>update [23] set id1 = &#8216;No.&#8217;+right(&#8217;00000000&#8242;+id,6) where id not like &#8216;No%&#8217; //递增<br>update [23] set id1= &#8216;No.&#8217;+right(&#8217;00000000&#8242;+replace(id1,&#8217;No.&#8217;,&#8221;),6) //补位递增<br>delete from [1] where (id%2)=1<br>奇数</p>
<p>替换表名字段<br>update [1] set domurl = replace(domurl,&#8217;/upload/Imgswf/&#8217;,'/upload/Photo/&#8217;) where domurl like &#8216;%/upload/Imgswf/%&#8217;</p>
<p>截位<br>SELECT LEFT(表名, 5)</p>
<img src ="http://www.cppblog.com/yishanhante/aggbug/26612.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yishanhante/" target="_blank">jay</a> 2007-06-19 10:56 <a href="http://www.cppblog.com/yishanhante/articles/26612.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL语句常用汇总</title><link>http://www.cppblog.com/yishanhante/articles/26611.html</link><dc:creator>jay</dc:creator><author>jay</author><pubDate>Tue, 19 Jun 2007 02:55:00 GMT</pubDate><guid>http://www.cppblog.com/yishanhante/articles/26611.html</guid><wfw:comment>http://www.cppblog.com/yishanhante/comments/26611.html</wfw:comment><comments>http://www.cppblog.com/yishanhante/articles/26611.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yishanhante/comments/commentRss/26611.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yishanhante/services/trackbacks/26611.html</trackback:ping><description><![CDATA[添加、删除、修改使用db.Execute(Sql)命令执行操作&nbsp;<br>╔--------------------╗&nbsp;<br>☆&nbsp;数据记录筛选&nbsp;☆&nbsp;<br>╚--------------------╝&nbsp;<br>注意：单双引号的用法可能有误(没有测式)&nbsp;<br><br>Sql&nbsp;=&nbsp;"Select&nbsp;Distinct&nbsp;字段名&nbsp;From&nbsp;数据表"&nbsp;<br>Distinct函数，查询数据库存表内不重复的记录&nbsp;<br><br>Sql&nbsp;=&nbsp;"Select&nbsp;Count(*)&nbsp;From&nbsp;数据表&nbsp;where&nbsp;字段名1&gt;#18:0:0#&nbsp;and&nbsp;字段名1&lt;&nbsp;#19:00#&nbsp;"&nbsp;<br>count函数,查询数库表内有多少条记录，&#8220;字段名1&#8221;是指同一字段&nbsp;<br>例：&nbsp;<br>set&nbsp;rs=conn.execute("select&nbsp;count(id)&nbsp;as&nbsp;idnum&nbsp;from&nbsp;news")&nbsp;<br>response.write&nbsp;rs("idnum")&nbsp;<br><br>sql="select&nbsp;*&nbsp;from&nbsp;数据表&nbsp;where&nbsp;字段名&nbsp;between&nbsp;值1&nbsp;and&nbsp;值2"&nbsp;<br>Sql="select&nbsp;*&nbsp;from&nbsp;数据表&nbsp;where&nbsp;字段名&nbsp;between&nbsp;#2003-8-10#&nbsp;and&nbsp;#2003-8-12#"&nbsp;<br>在日期类数值为2003-8-10&nbsp;19:55:08&nbsp;的字段里查找2003-8-10至2003-8-12的所有记录，而不管是几点几分。&nbsp;<br><br>select&nbsp;*&nbsp;from&nbsp;tb_name&nbsp;where&nbsp;datetime&nbsp;between&nbsp;#2003-8-10#&nbsp;and&nbsp;#2003-8-12#&nbsp;<br>字段里面的数据格式为：2003-8-10&nbsp;19:55:08，通过sql查出2003-8-10至2003-8-12的所有纪录，而不管是几点几分。&nbsp;<br><br>Sql="select&nbsp;*&nbsp;from&nbsp;数据表&nbsp;where&nbsp;字段名=字段值&nbsp;order&nbsp;by&nbsp;字段名&nbsp;[desc]"&nbsp;<br><br>Sql="select&nbsp;*&nbsp;from&nbsp;数据表&nbsp;where&nbsp;字段名&nbsp;like&nbsp;'%字段值%'&nbsp;order&nbsp;by&nbsp;字段名&nbsp;[desc]"&nbsp;<br>模糊查询&nbsp;<br><br>Sql="select&nbsp;top&nbsp;10&nbsp;*&nbsp;from&nbsp;数据表&nbsp;where&nbsp;字段名&nbsp;order&nbsp;by&nbsp;字段名&nbsp;[desc]"&nbsp;<br>查找数据库中前10记录&nbsp;<br><br>Sql="select&nbsp;top&nbsp;n&nbsp;*&nbsp;form&nbsp;数据表&nbsp;order&nbsp;by&nbsp;newid()"&nbsp;<br>随机取出数据库中的若干条记录的方法&nbsp;<br>top&nbsp;n，n就是要取出的记录数&nbsp;<br><br>Sql="select&nbsp;*&nbsp;from&nbsp;数据表&nbsp;where&nbsp;字段名&nbsp;in&nbsp;('值1','值2','值3')"&nbsp;<br><br>╔--------------------╗&nbsp;<br>☆&nbsp;添加数据记录&nbsp;☆&nbsp;<br>╚--------------------╝&nbsp;<br>sql="insert&nbsp;into&nbsp;数据表&nbsp;(字段1,字段2,字段3&nbsp;&#8230;)&nbsp;valuess&nbsp;(值1,值2,值3&nbsp;&#8230;)"&nbsp;<br><br>sql="insert&nbsp;into&nbsp;数据表&nbsp;valuess&nbsp;(值1,值2,值3&nbsp;&#8230;)"&nbsp;<br>不指定具体字段名表示将按照数据表中字段的顺序，依次添加&nbsp;<br><br>sql="insert&nbsp;into&nbsp;目标数据表&nbsp;select&nbsp;*&nbsp;from&nbsp;源数据表"&nbsp;<br>把源数据表的记录添加到目标数据表&nbsp;<br><br>╔--------------------╗&nbsp;<br>☆&nbsp;更新数据记录&nbsp;☆&nbsp;<br>╚--------------------╝&nbsp;<br>Sql="update&nbsp;数据表&nbsp;set&nbsp;字段名=字段值&nbsp;where&nbsp;条件表达式"&nbsp;<br><br>Sql="update&nbsp;数据表&nbsp;set&nbsp;字段1=值1,字段2=值2&nbsp;&#8230;&#8230;&nbsp;字段n=值n&nbsp;where&nbsp;条件表达式"&nbsp;<br><br>Sql="update&nbsp;数据表&nbsp;set&nbsp;字段1=值1,字段2=值2&nbsp;&#8230;&#8230;&nbsp;字段n=值n&nbsp;"&nbsp;<br>没有条件则更新整个数据表中的指定字段值&nbsp;<br><br>╔--------------------╗&nbsp;<br>☆&nbsp;删除数据记录&nbsp;☆&nbsp;<br>╚--------------------╝&nbsp;<br>Sql="delete&nbsp;from&nbsp;数据表&nbsp;where&nbsp;条件表达式"&nbsp;<br><br>Sql="delete&nbsp;from&nbsp;数据表"&nbsp;<br>没有条件将删除数据表中所有记录)&nbsp;<br><br>╔--------------------------╗&nbsp;<br>☆&nbsp;数据记录统计函数&nbsp;☆&nbsp;<br>╚--------------------------╝&nbsp;<br>AVG(字段名)&nbsp;得出一个表格栏平均值&nbsp;<br>COUNT(*|字段名)&nbsp;对数据行数的统计或对某一栏有值的数据行数统计&nbsp;<br>MAX(字段名)&nbsp;取得一个表格栏最大的值&nbsp;<br>MIN(字段名)&nbsp;取得一个表格栏最小的值&nbsp;<br>SUM(字段名)&nbsp;把数据栏的值相加&nbsp;<br><br>引用以上函数的方法：&nbsp;<br>sql="select&nbsp;sum(字段名)&nbsp;as&nbsp;别名&nbsp;from&nbsp;数据表&nbsp;where&nbsp;条件表达式"&nbsp;<br>set&nbsp;rs=conn.excute(sql)&nbsp;<br>用&nbsp;rs("别名")&nbsp;获取统的计值，其它函数运用同上。&nbsp;<br><br>╔-----------------------------╗&nbsp;<br>☆&nbsp;数据表的建立和删除&nbsp;☆&nbsp;<br>╚-----------------------------╝&nbsp;<br>CREATE&nbsp;TABLE&nbsp;数据表名称(字段1&nbsp;类型1(长度),字段2&nbsp;类型2(长度)&nbsp;&#8230;&#8230;&nbsp;)&nbsp;<br>例：CREATE&nbsp;TABLE&nbsp;tab01(name&nbsp;varchar(50),datetime&nbsp;default&nbsp;now())&nbsp;<br>DROP&nbsp;TABLE&nbsp;数据表名称&nbsp;(永久性删除一个数据表)&nbsp;<br><br>╔--------------------------╗&nbsp;<br>☆&nbsp;记录集对象的方法&nbsp;☆&nbsp;<br>╚--------------------------╝&nbsp;<br>rs.movenext&nbsp;将记录指针从当前的位置向下移一行&nbsp;<br>rs.moveprevious&nbsp;将记录指针从当前的位置向上移一行&nbsp;<br>rs.movefirst&nbsp;将记录指针移到数据表第一行&nbsp;<br>rs.movelast&nbsp;将记录指针移到数据表最后一行&nbsp;<br>rs.absoluteposition=N&nbsp;将记录指针移到数据表第N行&nbsp;<br>rs.absolutepage=N&nbsp;将记录指针移到第N页的第一行&nbsp;<br>rs.pagesize=N&nbsp;设置每页为N条记录&nbsp;<br>rs.pagecount&nbsp;根据&nbsp;pagesize&nbsp;的设置返回总页数&nbsp;<br>rs.recordcount&nbsp;返回记录总数&nbsp;<br>rs.bof&nbsp;返回记录指针是否超出数据表首端，true表示是，false为否&nbsp;<br>rs.eof&nbsp;返回记录指针是否超出数据表末端，true表示是，false为否&nbsp;<br>rs.delete&nbsp;删除当前记录，但记录指针不会向下移动&nbsp;<br>rs.addnew&nbsp;添加记录到数据表末端&nbsp;<br>rs.update&nbsp;更新数据表记录 <br>
<img src ="http://www.cppblog.com/yishanhante/aggbug/26611.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yishanhante/" target="_blank">jay</a> 2007-06-19 10:55 <a href="http://www.cppblog.com/yishanhante/articles/26611.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>