<?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://pwwang.com/tag/sql/feed/" rel="self" type="application/rss+xml" />
	<link>http://pwwang.com</link>
	<description>专注技术,用心生活!</description>
	<lastBuildDate>Fri, 02 Jul 2010 02:26:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>关于SQL的一道笔试题</title>
		<link>http://pwwang.com/technology/a_question_about_sql/</link>
		<comments>http://pwwang.com/technology/a_question_about_sql/#comments</comments>
		<pubDate>Fri, 27 Nov 2009 17:44:14 +0000</pubDate>
		<dc:creator>pwwang</dc:creator>
				<category><![CDATA[Techniques]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://pwwang.com/?p=834</guid>
		<description><![CDATA[&#160;

题目要求是这样的，假设有如下表（MySQL）：

TABLE: test

<span class="readmore"><a href="http://pwwang.com/technology/a_question_about_sql/" title="关于SQL的一道笔试题">Read More: 582 Words Totally</a></span>]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>题目要求是这样的，假设有如下表（MySQL）：</p>
<p>TABLE: test</p>
<table cellspacing="1" cellpadding="1" border="0" style="background-color: rgb(153, 153, 253); width: 166px; height: 163px; clear: both;">
<tbody>
<tr style="background-color: rgb(255, 255, 255);">
<td><strong>id</strong></td>
<td><strong>a</strong></td>
<td><strong>b</strong></td>
</tr>
<tr style="background-color: rgb(255, 255, 255);">
<td>1</td>
<td>4</td>
<td>2</td>
</tr>
<tr style="background-color: rgb(255, 255, 255);">
<td>2</td>
<td>1</td>
<td>2</td>
</tr>
<tr style="background-color: rgb(255, 255, 255);">
<td>3</td>
<td>1</td>
<td>3</td>
</tr>
<tr style="background-color: rgb(255, 255, 255);">
<td>4</td>
<td>3</td>
<td>2</td>
</tr>
<tr style="background-color: rgb(255, 255, 255);">
<td>5</td>
<td>1</td>
<td>5</td>
</tr>
<tr style="background-color: rgb(255, 255, 255);">
<td>6</td>
<td>1</td>
<td>2</td>
</tr>
<tr style="background-color: rgb(255, 255, 255);">
<td>7</td>
<td>4</td>
<td>-1</td>
</tr>
<tr style="background-color: rgb(255, 255, 255);">
<td>8</td>
<td>1</td>
<td>2</td>
</tr>
</tbody>
</table>
<p>&nbsp;写一条SQL语句，</p>
<p>选择所有a=1或b=2的记录，</p>
<p>使得<span style="color: rgb(255, 0, 0);">a=1且b=2</span>的记录排在最前面，</p>
<p>并且a=1且b=2的记录按<span style="color: rgb(255, 0, 0);">id降序</span>排列。</p>
<p><span id="more-834"></span>分析：</p>
<p>很显然，直接的order by方案是不行的。</p>
<p>那我们就需要把条件分割：把a=1 or b=2分割成（a=1 and b=2） or （a=1 and b!=2） or （a!=1 and b=2）</p>
<p>再把选择的结果union一下就可以得到想要的结果了。</p>
<p>关于（a=1 and b=2）记录按id的降序排列，需要用到order by，如果直接这么用：</p>
<p>&nbsp;</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">...</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #66cc66;">...</span> <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> <span style="color: #66cc66;">...</span> <span style="color: #993333; font-weight: bold;">DESC</span> <span style="color: #993333; font-weight: bold;">UNION</span> <span style="color: #66cc66;">...</span></pre></td></tr></table></div>

<p>是会报错的， 把前面的select语句加上括号，不会报错，但是达不到想要的效果（order by 不起作用）。</p>
<p>&nbsp;</p>
<p>这个时候就要用到derived table了，不过别忘了给derived table取一个别名（alias）。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #66cc66;">&#40;</span>
    <span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">`test`</span> <span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #ff0000;">`a`</span><span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">AND</span> <span style="color: #ff0000;">`b`</span><span style="color: #66cc66;">=</span><span style="color: #cc66cc;">2</span> <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> <span style="color: #ff0000;">`id`</span> <span style="color: #993333; font-weight: bold;">DESC</span>
<span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">`ab`</span> <span style="color: #993333; font-weight: bold;">UNION</span> 
<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">`test`</span> <span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`a`</span><span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">AND</span> <span style="color: #ff0000;">`b`</span>!<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`a`</span>!<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">AND</span> <span style="color: #ff0000;">`b`</span><span style="color: #66cc66;">=</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>&nbsp;运行结果：</p>
<table cellspacing="1" cellpadding="1" border="0" style="background-color: rgb(255, 153, 0); width: 166px; height: 163px; clear: both;">
<tbody>
<tr style="background-color: rgb(255, 255, 255);">
<td><strong>id</strong></td>
<td><strong>a</strong></td>
<td><strong>b</strong></td>
</tr>
<tr style="background-color: rgb(200, 200, 200);">
<td>8</td>
<td>1</td>
<td>2</td>
</tr>
<tr style="background-color: rgb(200, 200, 200);">
<td>6</td>
<td>1</td>
<td>2</td>
</tr>
<tr style="background-color: rgb(200, 200, 200);">
<td>2</td>
<td>1</td>
<td>2</td>
</tr>
<tr style="background-color: rgb(255, 255, 255);">
<td>1</td>
<td>4</td>
<td>2</td>
</tr>
<tr style="background-color: rgb(255, 255, 255);">
<td>3</td>
<td>1</td>
<td>3</td>
</tr>
<tr style="background-color: rgb(255, 255, 255);">
<td>4</td>
<td>3</td>
<td>2</td>
</tr>
<tr style="background-color: rgb(255, 255, 255);">
<td>5</td>
<td>1</td>
<td>5</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://pwwang.com/technology/a_question_about_sql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
