<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>旁门左道 &#187; SQL</title>
	<atom:link href="http://log.medcl.net/item/tag/sql/feed/" rel="self" type="application/rss+xml" />
	<link>http://log.medcl.net</link>
	<description>记录生活</description>
	<lastBuildDate>Tue, 29 Nov 2011 15:39:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>[转] SQL优化心得</title>
		<link>http://log.medcl.net/item/2010/03/change-sql-optimization-experience/</link>
		<comments>http://log.medcl.net/item/2010/03/change-sql-optimization-experience/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 03:56:51 +0000</pubDate>
		<dc:creator>medcl</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[sql优化]]></category>

		<guid isPermaLink="false">http://log.medcl.net/?p=240</guid>
		<description><![CDATA[大家都在讨论关于数据库优化方面的东东，刚好参与开发了一个数据仓库方面的项目，以下的一点东西算是数据库优化方面的学习+实战的一些心得体会了，拿出来大家共享。欢迎批评指正阿！ SQL语句： 是对数据库(数据)进行操作的惟一途径； 消耗了70%~90%的数据库资源；独立于程序设计逻辑，相对于对程序源代码的优化，对SQL语句的优化在时间成本和风险上的代价都很低； 可以有不同的写法；易学，难精通。 SQL优化： 固定的SQL书写习惯，相同的查询尽量保持相同，存储过程的效率较高。 应该编写与其格式一致的语句，包括字母的大小写、标点符号、换行的位置等都要一致 ORACLE优化器： 在任何可能的时候都会对表达式进行评估，并且把特定的语法结构转换成等价的结构，这么做的原因是 要么结果表达式能够比源表达式具有更快的速度 要么源表达式只是结果表达式的一个等价语义结构 不同的SQL结构有时具有同样的操作（例如：= ANY (subquery) and IN (subquery)），ORACLE会把他们映射到一个单一的语义结构。 1 常量优化： 常量的计算是在语句被优化时一次性完成，而不是在每次执行时。下面是检索月薪大于2000的的表达式： sal > 24000/12 sal > 2000 sal*12 > 24000 如果SQL语句包括第一种情况，优化器会简单地把它转变成第二种。 优化器不会简化跨越比较符的表达式，例如第三条语句，鉴于此，应尽量写用常量跟字段比较检索的表达式，而不要将字段置于表达式当中。否则没有办法优化，比如如果sal上有索引，第一和第二就可以使用，第三就难以使用。 2 操作符优化： 优化器把使用LIKE操作符和一个没有通配符的表达式组成的检索表达式转换为一个“=”操作符表达式。 例如：优化器会把表达式ename LIKE 'SMITH'转换为ename = 'SMITH' 优化器只能转换涉及到可变长数据类型的表达式，前一个例子中，如果ENAME字段的类型是CHAR(10)， 那么优化器将不做任何转换。 一般来讲LIKE比较难以优化。 其中： ~~ IN 操作符优化： 优化器把使用IN比较符的检索表达式替换为等价的使用“=”和“OR”操作符的检索表达式。 例如，优化器会把表达式ename IN ('SMITH','KING','JONES')替换为 ename = 'SMITH' OR [...]]]></description>
		<wfw:commentRss>http://log.medcl.net/item/2010/03/change-sql-optimization-experience/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>多个字段排序的sql</title>
		<link>http://log.medcl.net/item/2010/03/sort-multiple-fields-sql/</link>
		<comments>http://log.medcl.net/item/2010/03/sort-multiple-fields-sql/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 11:59:05 +0000</pubDate>
		<dc:creator>medcl</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[identity]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[排序]]></category>

		<guid isPermaLink="false">http://log.medcl.net/?p=236</guid>
		<description><![CDATA[sql又生疏了... CREATE TABLE testsort&#40; a VARCHAR, b VARCHAR, c VARCHAR&#41; --需要按照b,c排序，按照a来分组,b降序,c升序，每个A组里面取排序后的第一条记录 INSERT INTO testsort VALUES&#40;'A','1','2'&#41;; INSERT INTO testsort VALUES&#40;'A','3','2'&#41;; INSERT INTO testsort VALUES&#40;'A','3','1'&#41;; INSERT INTO testsort VALUES&#40;'B','3','2'&#41;; INSERT INTO testsort VALUES&#40;'B','2','1'&#41;; INSERT INTO testsort VALUES&#40;'C','1','2'&#41;; INSERT INTO testsort VALUES&#40;'C','1','4'&#41;; &#160; SELECT * FROM testsort; &#160; SELECT *, IDENTITY&#40;INT,1,1&#41; AS id INTO #temp FROM testsort ORDER [...]]]></description>
		<wfw:commentRss>http://log.medcl.net/item/2010/03/sort-multiple-fields-sql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL条件处理--Case语句</title>
		<link>http://log.medcl.net/item/2010/01/case-statement-in-the-sql-processing-conditions-used-in-the-data/</link>
		<comments>http://log.medcl.net/item/2010/01/case-statement-in-the-sql-processing-conditions-used-in-the-data/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 11:35:04 +0000</pubDate>
		<dc:creator>medcl</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[case]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://log.medcl.net/?p=198</guid>
		<description><![CDATA[SQL中使用CASE处理条件      在使用SQL的过程中，有时候可能会要对数据进行条件查询。比如字段A为True时查询出“男”，否则查询出“女”。这样就可以不在程序中在去判断了。在SQL中，可以利用Case语句来完成这样的查询。 一、Case介绍 CASE 计算条件列表并返回多个可能结果表达式之一。 CASE 具有两种格式： 简单 CASE 函数将某个表达式与一组简单表达式进行比较以确定结果。 CASE 搜索函数计算一组布尔表达式以确定结果。 两种格式都支持可选的 ELSE 参数。 语法 简单 CASE 函数： CASE input_expression     WHEN when_expression THEN result_expression         [ ...n ]     [         ELSE else_result_expression     END CASE 搜索函数： CASE     WHEN Boolean_expression THEN result_expression         [ ...n ]     [         ELSE else_result_expression [...]]]></description>
		<wfw:commentRss>http://log.medcl.net/item/2010/01/case-statement-in-the-sql-processing-conditions-used-in-the-data/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SET PARSEONLY 与SET NOEXEC (Transact-SQL)</title>
		<link>http://log.medcl.net/item/2010/01/set-parseonly-with-the-set-noexec-transact-sql/</link>
		<comments>http://log.medcl.net/item/2010/01/set-parseonly-with-the-set-noexec-transact-sql/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 06:37:13 +0000</pubDate>
		<dc:creator>medcl</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[SET]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://log.medcl.net/?p=196</guid>
		<description><![CDATA[SET PARSEONLY 检查每个 Transact-SQL 语句的语法并返回任何错误消息，但不编译和执行语句。 SET PARSEONLY { ON &#124; OFF } 当 SET PARSEONLY 为 ON 时，SQL Server 只分析语句。当 SET PARSEONLY 为 OFF 时，SQL Server 编译并执行语句。 SET PARSEONLY 的设置是在分析时设置，而不是在执行或运行时设置。 在存储过程或触发器中不要使用 PARSEONLY。如果 OFFSETS 选项为 ON 而且没有出现错误，则 SET PARSEONLY 返回偏移量。 SET NOEXEC (Transact-SQL) 编译每个查询但不执行查询。 SET NOEXEC { ON &#124; OFF } 当 SET NOEXEC 为 ON [...]]]></description>
		<wfw:commentRss>http://log.medcl.net/item/2010/01/set-parseonly-with-the-set-noexec-transact-sql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>从数据库随机读取数据</title>
		<link>http://log.medcl.net/item/2010/01/random-read-data-from-the-database/</link>
		<comments>http://log.medcl.net/item/2010/01/random-read-data-from-the-database/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 06:11:43 +0000</pubDate>
		<dc:creator>medcl</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[access]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[random]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://log.medcl.net/?p=194</guid>
		<description><![CDATA[示例代码： SQL Server：Select Top * From  表 Order By NewID()   Access  ：Select Top * From 表 Order By Rnd(ID)          *说明-Rnd(ID) 其中的ID是自动编号字段，可以利用其他任何数值来完成，比如用姓名字段(UserName)  Select Top 10 * From 表 Order BY Rnd(Len(UserName))   MySql：Select * From 表 Order By Rand() Limit 10 Tags: access, mysql, random, SQL, SQL Server]]></description>
		<wfw:commentRss>http://log.medcl.net/item/2010/01/random-read-data-from-the-database/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>T-SQL象数组一样处理字符串、分割字符串</title>
		<link>http://log.medcl.net/item/2010/01/t-sql-as-the-same-as-dealing-with-an-array-of-strings-separated-string/</link>
		<comments>http://log.medcl.net/item/2010/01/t-sql-as-the-same-as-dealing-with-an-array-of-strings-separated-string/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 03:08:47 +0000</pubDate>
		<dc:creator>medcl</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://log.medcl.net/?p=191</guid>
		<description><![CDATA[    在日常的编程过程中，数组是要经常使用到的。在利用SQL对数据库进行操作时，有时就想在SQL使用数组，比如将1,2,3,4,5拆分成数组。可惜的是在T-SQL中不支持数组。不过还是有变通的办法。我们可以自己编写两函数Get_StrArrayLength(取得字符串的长度-元素的个数)和Get_StrArrayStrOfIndex(按指定符号分割字符串，返回分割后指定索引的第几个元素)。有了这两个函数，我们就可以非常方便的在T-SQL中处理形如1,2,3,4,5这样的字符串了。      T-SQL对字符串的处理能力比较弱，比如我要循环遍历象1,2,3,4,5这样的字符串，如果用数组的话，遍历很简单，但是T-SQL不支持数组，所以处理下来比较麻烦。下边的函数，实现了象数组一样去处理字符串。  一、按指定符号分割字符串，返回分割后的元素个数，方法很简单，就是看字符串中存在多少个分隔符号，然后再加一，就是要求的结果。 CREATE function Get_StrArrayLength (  @str varchar(1024),  --要分割的字符串  @split varchar(10)  --分隔符号 ) returns int as  begin   declare @location int   declare @start int   declare @length int   set @str=ltrim(rtrim(@str))   set @location=charindex(@split,@str)   set @length=1    while @location&#60;&#62;0      begin       set @start=@location+1       set @location=charindex(@split,@str,@start)       set @length=@length+1      end    return [...]]]></description>
		<wfw:commentRss>http://log.medcl.net/item/2010/01/t-sql-as-the-same-as-dealing-with-an-array-of-strings-separated-string/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>常用SQL字符串函数问题集锦</title>
		<link>http://log.medcl.net/item/2010/01/common-sql-string-functions-faqs/</link>
		<comments>http://log.medcl.net/item/2010/01/common-sql-string-functions-faqs/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 02:58:17 +0000</pubDate>
		<dc:creator>medcl</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[字符串函数]]></category>

		<guid isPermaLink="false">http://log.medcl.net/?p=190</guid>
		<description><![CDATA[SQL字符串函数 字符串函数对二进制数据、字符串和表达式执行不同的运算。此类函数作用于CHAR、VARCHAR、 BINARY、 和VARBINARY 数据类型以及可以隐式转换为CHAR 或VARCHAR的数据类型。可以在SELECT 语句的SELECT 和WHERE 子句以及表达式中使用字符串函数。常用的字符串函数有： 一、字符转换函数 1、ASCII() 返回字符表达式最左端字符的ASCII 码值。在ASCII（）函数中，纯数字的字符串可不用‘’括起来，但含其它字符的字符串必须用‘’括起来使用，否则会出错。  2、CHAR() 将ASCII 码转换为字符。如果没有输入0 ~ 255 之间的ASCII 码值，CHAR（） 返回NULL 。  3、LOWER()和UPPER() LOWER()将字符串全部转为小写；UPPER()将字符串全部转为大写。  4、STR() 把数值型数据转换为字符型数据。 STR (&#60;float_expression&#62;[，length[， &#60;decimal&#62;]]) length 指定返回的字符串的长度，decimal 指定返回的小数位数。如果没有指定长度，缺省的length 值为10， decimal 缺省值为0。 当length 或者decimal 为负值时，返回NULL； 当length 小于小数点左边（包括符号位）的位数时，返回length 个*； 先服从length ，再取decimal ； 当返回的字符串位数小于length ，左边补足空格。  二、去空格函数 1、LTRIM() 把字符串头部的空格去掉。 2、RTRIM() 把字符串尾部的空格去掉。 三、取子串函数 1、left() LEFT (&#60;character_expression&#62;， [...]]]></description>
		<wfw:commentRss>http://log.medcl.net/item/2010/01/common-sql-string-functions-faqs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL：获取不同版本中差异参数值</title>
		<link>http://log.medcl.net/item/2009/10/data-comparison-of-different-versions-of-the-parameters/</link>
		<comments>http://log.medcl.net/item/2009/10/data-comparison-of-different-versions-of-the-parameters/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 06:08:13 +0000</pubDate>
		<dc:creator>medcl</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://log.medcl.net/?p=180</guid>
		<description><![CDATA[帮朋友写的一个sql，比较数据里面不同版本的参数数值 drop table dbo.ptable Go CREATE TABLE [dbo].[ptable]( [para] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL, [value] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL, [ver] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL ) ON [PRIMARY] GO INSERT INTO [PTable] ([para],[value],[ver]) VALUES('A','1','1.1')--新版本数据有变更 INSERT INTO [PTable] ([para],[value],[ver]) VALUES('B','2','1.1')--新旧版本一样 INSERT INTO [PTable] ([para],[value],[ver]) VALUES('D','2','1.1')--老版本有，新版本没有 INSERT INTO [PTable] ([para],[value],[ver]) VALUES('A','3','1.2') INSERT INTO [PTable] ([para],[value],[ver]) VALUES('B','2','1.2') INSERT INTO [PTable] [...]]]></description>
		<wfw:commentRss>http://log.medcl.net/item/2009/10/data-comparison-of-different-versions-of-the-parameters/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SET QUOTED_IDENTIFIER</title>
		<link>http://log.medcl.net/item/2009/09/set-quoted_identifier/</link>
		<comments>http://log.medcl.net/item/2009/09/set-quoted_identifier/#comments</comments>
		<pubDate>Wed, 30 Sep 2009 01:56:25 +0000</pubDate>
		<dc:creator>medcl</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[ANSI SQL-92]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Transact-SQL]]></category>

		<guid isPermaLink="false">http://log.medcl.net/?p=172</guid>
		<description><![CDATA[SET QUOTED_IDENTIFIER 使 Microsoft® SQL Server™ 遵从关于引号分隔标识符和文字字符串的 SQL-92 规则。由双引号分隔的标识符可以是 Transact-SQL 保留关键字，或者可以包含 Transact-SQL 标识符语法规则通常不允许的字符。 语法 SET QUOTED_IDENTIFIER { ON &#124; OFF } 注释 当 SET QUOTED_IDENTIFIER 为 ON 时，标识符可以由双引号分隔，而文字必须由单引号分隔。当 SET QUOTED_IDENTIFIER 为 OFF 时，标识符不可加引号，且必须遵守所有 Transact-SQL 标识符规则。有关更多信息，请参见使用标识符。文字可以由单引号或双引号分隔。 当 SET QUOTED_IDENTIFIER 为 ON 时，由双引号分隔的所有字符串都被解释为对象标识符。因此，加引号的标识符不必遵守 Transact-SQL 标识符规则。它们可以是保留关键字，并且可以包含 Transact-SQL 标识符中通常不允许的字符。不能使用双引号分隔文字字符串表达式，而必须用单引号括住文字字符串。如果单引号 (') 是文字字符串的一部分，则可以由两个单引号 ('') 表示。当对数据库中的对象名使用保留关键字时，SET QUOTED_IDENTIFIER 必须为 ON。 当 SET QUOTED_IDENTIFIER [...]]]></description>
		<wfw:commentRss>http://log.medcl.net/item/2009/09/set-quoted_identifier/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL函数大全及用法</title>
		<link>http://log.medcl.net/item/2009/09/sql%e5%87%bd%e6%95%b0%e5%a4%a7%e5%85%a8%e5%8f%8a%e7%94%a8%e6%b3%95/</link>
		<comments>http://log.medcl.net/item/2009/09/sql%e5%87%bd%e6%95%b0%e5%a4%a7%e5%85%a8%e5%8f%8a%e7%94%a8%e6%b3%95/#comments</comments>
		<pubDate>Sat, 12 Sep 2009 11:43:49 +0000</pubDate>
		<dc:creator>medcl</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[函数]]></category>

		<guid isPermaLink="false">http://log.medcl.net/?p=164</guid>
		<description><![CDATA[--聚合函数 use pubs go select avg(distinct price) --算平均数 from titles where type='business' go use pubs go select max(ytd_sales) --最大数 from titles go use pubs go select min(ytd_sales) --最小数 from titles go use pubs go select type,sum(price),sum(advance) --求和 from titles group by type order by type go use pubs go select count(distinct city) --求个数 from authors [...]]]></description>
		<wfw:commentRss>http://log.medcl.net/item/2009/09/sql%e5%87%bd%e6%95%b0%e5%a4%a7%e5%85%a8%e5%8f%8a%e7%94%a8%e6%b3%95/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

