﻿<?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>BlogJava-void-随笔分类-SQL</title><link>http://www.blogjava.net/void241/category/33132.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 16 Sep 2011 22:05:38 GMT</lastBuildDate><pubDate>Fri, 16 Sep 2011 22:05:38 GMT</pubDate><ttl>60</ttl><item><title>sql 在查询时，如果为空的时，如何用默认值代替空</title><link>http://www.blogjava.net/void241/archive/2011/09/16/358763.html</link><dc:creator>void</dc:creator><author>void</author><pubDate>Fri, 16 Sep 2011 01:53:00 GMT</pubDate><guid>http://www.blogjava.net/void241/archive/2011/09/16/358763.html</guid><wfw:comment>http://www.blogjava.net/void241/comments/358763.html</wfw:comment><comments>http://www.blogjava.net/void241/archive/2011/09/16/358763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/void241/comments/commentRss/358763.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/void241/services/trackbacks/358763.html</trackback:ping><description><![CDATA[<div>COALESCE(a.end_,now())<br /></div><div>SELECT COALESCE(NULL,NULL,3,4,5) FROM <a target="_blank" href="http://baike.baidu.com/view/2010386.htm">dual</a><br /><div>返回结果为：3</div></div><img src ="http://www.blogjava.net/void241/aggbug/358763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/void241/" target="_blank">void</a> 2011-09-16 09:53 <a href="http://www.blogjava.net/void241/archive/2011/09/16/358763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Using SQL 之 Data Manipulation Language (DML) </title><link>http://www.blogjava.net/void241/archive/2008/07/19/215983.html</link><dc:creator>void</dc:creator><author>void</author><pubDate>Sat, 19 Jul 2008 03:23:00 GMT</pubDate><guid>http://www.blogjava.net/void241/archive/2008/07/19/215983.html</guid><wfw:comment>http://www.blogjava.net/void241/comments/215983.html</wfw:comment><comments>http://www.blogjava.net/void241/archive/2008/07/19/215983.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/void241/comments/commentRss/215983.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/void241/services/trackbacks/215983.html</trackback:ping><description><![CDATA[<p align="left"><strong>1. Types of MDL statements</strong></p>
<p align="left"><strong>SELECT</strong> Retrieves rows from one or more tables. 从一个或多个表中取得若干列</p>
<p align="left"><strong>INSERT</strong> Adds one or more new rows to a table. 向表中添加若干列</p>
<p align="left"><strong>UPDATE</strong> Modifies one or more rows in a table. 更新表中的若干列</p>
<p align="left"><strong>DELETE</strong> Removes one or more rows from a table. 从表中删除若干列</p>
<p align="left"><strong>2. SELECT</strong></p>
<p align="left"><strong>SELECT</strong> <em>列名</em>, <em>列名</em>, &#8230;, <em>列名</em> <strong>FROM</strong> <em>表名</em>;</p>
<p align="left"><strong>SELECT</strong> <em>*(</em><em>所有列</em><em>)</em> <strong>FROM</strong> <em>表名</em>;</p>
<p align="left">如果表名或列名中有空格，要用方括号[]括起来。</p>
<p align="left"><strong>（</strong><strong>1</strong><strong>）</strong> <strong>使用</strong><strong>SMO</strong><strong>有条件地</strong><strong>SELECT</strong></p>
<p align="left">为 <strong>SELECT</strong>加上限制条件，使用<strong>WHERE</strong>。</p>
<p align="left"><strong>SELECT</strong> <em>something</em> <strong>FROM</strong> <em>somewhere</em> <strong>WHERE</strong> <em>列名</em> <strong>SMO</strong><em>某个值</em>;</p>
<p align="left">Here, <strong>SMO</strong> means SQL Mathematical Operators</p>
<p align="center"></p>
<p>
<table cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td valign="top" width="235">
            <p align="left"><strong>操作符</strong></p>
            </td>
            <td valign="top" width="235">
            <p align="left"><strong>意义</strong></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="235">
            <p align="left">=</p>
            </td>
            <td valign="top" width="235">
            <p align="left">等于</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="235">
            <p align="left">&lt;&gt; 或 !=</p>
            </td>
            <td valign="top" width="235">
            <p align="left">不等于</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="235">
            <p align="left">&lt;</p>
            </td>
            <td valign="top" width="235">
            <p align="left">小于</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="235">
            <p align="left"></p>
            <p align="left">&gt;</p>
            </td>
            <td valign="top" width="235">
            <p align="left"></p>
            <p align="left">大于</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="235">
            <p align="left">&lt;=</p>
            </td>
            <td valign="top" width="235">
            <p align="left">小于等于</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="235">
            <p align="left">&gt;=</p>
            </td>
            <td valign="top" width="235">
            <p align="left">大于等于</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p align="left"><strong>(2) LIKE -</strong> <strong>按样式</strong><strong>SELECT</strong></p>
<p align="left"><strong>SELECT</strong> <em>something</em> <strong>FROM</strong> <em>somewhere</em> <strong>WHERE</strong> <em>列名</em> <strong>LIKE</strong><em>某个值</em><em>(</em><em>带通配符</em><em>)</em>;</p>
<p align="left"><strong>LIKE</strong> 中可以使用的通配符</p>
<p>
<table cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td valign="top" width="182">
            <p align="left"><strong>通配符</strong></p>
            </td>
            <td valign="top" width="341">
            <p align="left"><strong>意义</strong></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="182">
            <p align="left">_ (下划线)</p>
            </td>
            <td valign="top" width="341">
            <p align="left">表示作<strong>一个任意</strong>字符</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="182">
            <p align="left">%</p>
            </td>
            <td valign="top" width="341">
            <p align="left">表示<strong>任意</strong>个<strong>任意</strong>字符</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="182">
            <p align="left">[ ]</p>
            </td>
            <td valign="top" width="341">
            <p align="left">表示与括号中任意一个字符相匹配的字符</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="182">
            <p align="left">[^ ]</p>
            </td>
            <td valign="top" width="341">
            <p align="left">表示与任意一个不在括号中的字符匹配的字符</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="182">
            <p align="left">[ - ]</p>
            </td>
            <td valign="top" width="341">
            <p align="left">与括号中从左到右的范围中字符匹配</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="182">
            <p align="left">#</p>
            </td>
            <td valign="top" width="341">
            <p align="left">表示<strong>一个任意</strong>数字</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p align="left">例：</p>
<p align="left">&#8216;Cha_&#8217; 可以是 &#8216;Chaa&#8217;、&#8217;Chay&#8217;、&#8217;Cha4&#8217;、&#8217;Cha.&#8217;、&#8217;Cha@&#8217;&#8230;&#8230;</p>
<p align="left">&#8216;Cha%&#8217; 可以是&#8217;&#8216;Chaaasf&#8217;、&#8217;Chay&#8217;、&#8217;Chaqq4a4&#8217;、&#8217;Cha.ert&#8217;、&#8217;Cha@qawe&#8217;&#8230;&#8230;</p>
<p align="left">&#8216;[AIO]%&#8217; 表示以&#8217;A&#8217;、&#8217;I&#8217;或&#8217;O&#8217;开头，以任意字符结尾的字符串</p>
<p align="left">&#8216;[AIO]%&#8217; 表示以&#8217;A&#8217;、&#8217;I&#8217;或&#8217;O&#8217;之外的字符开头，以任意字符结尾的字符串</p>
<p align="left">&#8216;[A-O]%&#8217; 表示以从&#8217;A到&#8217;O&#8217;之间的字符开头，以任意字符结尾的字符串</p>
<p align="left"></p>
<p align="left"><strong>(2) IN -</strong> <strong>指定选择范围</strong></p>
<p align="left"><strong>SELECT</strong> <em>something</em> <strong>FROM</strong> <em>somewhere</em> <strong>WHERE</strong> <em>列名</em> <strong>IN</strong><em>(</em><em>列出范围</em><em>)</em>;</p>
<p align="left">列出的范围可以是显式地指定出来，也可以用其它方法限制，如用另一个<strong>SELECT</strong>语句选择得到的结果。</p>
<p align="left">例1： <strong>SELECT</strong> <em>ProductID</em>, <em>ProductName</em>, <em>QuantityPerUnit</em>, <em>UnitPrice</em> <strong>FROM</strong> <em>Products</em> <strong>WHERE</strong> <em>ProductID</em> <strong>IN</strong> (<em>1, 2, 5, 15, 20, 45, 50</em>)<strong>;</strong></p>
<p align="left">例2：<strong>SELECT</strong> <em>OrderID</em> <strong>FROM</strong> <em>Orders</em> <strong>WHERE</strong> <em>CustomerID</em> <strong>IN</strong></p>
<p align="left">( <strong>SELECT</strong> <em>CustomerID</em> <strong>FROM</strong> <em>Customers</em> <strong>WHERE</strong> <em>CompanyName</em> <strong>LIKE</strong> <em>'Fu</em>%<em>'</em>);</p>
<p align="left"><strong>(3) BETWEEN -</strong> <strong>指定选择范围</strong></p>
<p align="left"><strong>SELECT</strong> <em>something</em> <strong>FROM</strong> <em>somewhere</em> <strong>WHERE</strong> <em>列名</em> <strong>BETWEEN</strong> <em>起始</em> <strong>AND</strong> <em>终止</em>;</p>
<p align="left"></p>
<p align="left"><strong>(4) NOT -</strong> <strong>取操作符相反的意义</strong></p>
<p align="left"></p>
<p align="left"><strong>(5)</strong> <strong>选择列值为空的行</strong></p>
<p align="left"><strong>SELECT</strong> <em>something</em> <strong>FROM</strong> <em>somewhere</em> <strong>WHERE</strong> <em>列名</em> <strong>IS</strong> <strong>NULL</strong>;</p>
<p align="left"></p>
<p align="left"><strong>(6)</strong> <strong>使用逻辑运算符限定多个选择条件</strong></p>
<p align="left">使用 <strong>AND</strong>, <strong>OR</strong>, <strong>NOT</strong></p>
<p align="left"></p>
<p align="left"><strong>(7) ORDER BY -</strong> <strong>对取得的行进行排序</strong></p>
<p align="left"></p>
<p align="left"><strong>SELECT</strong> <em>something</em> <strong>FROM</strong> <em>somewhere</em> <strong>ORDER</strong> <strong>BY</strong> <em>列名</em> (<strong>ASC</strong> / <strong>DESC</strong>);</p>
<p align="left">可以用<strong>ASC</strong>或<strong>DESC</strong>指定是按升序或降序排列。</p>
<p align="left">可以同时使用两个排序条件：</p>
<p align="left"><strong>ORDER</strong> <strong>BY</strong> <em>列</em><em>1</em> (<strong>ASC</strong> / <strong>DESC</strong>), <em>列</em><em>2</em> (<strong>ASC</strong> / <strong>DESC</strong>);</p>
<p align="left">意为先按列1排列，在此基础上再按列2排列。</p>
<p align="left"></p>
<p align="left"><strong>(8) TOP -</strong> <strong>取得最前面的</strong><strong>N</strong><strong>列</strong></p>
<p align="left"><strong>SELECT</strong> <strong>TOP</strong> <strong><em>N</em></strong> <em>something&#8230;</em></p>
<p align="left"><strong>(9) DISTINCT</strong> <strong>&#8211;</strong> <strong>忽略某列值重复的行</strong></p>
<p align="left"><strong>SELECT</strong> <strong>DISTINCT</strong> <em>something</em> <strong>FROM</strong> <em>somewhere&#8230;</em></p>
<p align="left">只取得<em>something</em>指定列中唯一的项。</p>
<p align="left"><strong>(10) UNION</strong> <strong>&#8211;</strong> <strong>合并</strong><strong>SELECT</strong><strong>得到的结果</strong></p>
<p align="left">（<strong>SELECT</strong> <em>something</em> <strong>FROM</strong> <em>somewhere&#8230;</em>）</p>
<p align="left"><strong>UNION</strong></p>
<p align="left">（<strong>SELECT</strong> <em>something_else</em> <strong>FROM</strong> <em>somewhere_else&#8230;</em>）</p>
<p align="left"><strong>(11) GROUP BY &#8211;</strong> <strong>把得到的结果分组</strong></p>
<p align="left"><strong>SELECT</strong> <em>something</em> <strong>FROM</strong> <em>somewhere&#8230;</em><strong>GROUP BY</strong> <em>something2</em>;</p>
<p align="left"><strong>SELECT</strong> <em>something</em> <strong>COUNT(*)</strong> <strong>FROM</strong> <em>somewhere&#8230;</em><strong>GROUP BY</strong> <em>something2</em>;</p>
<p align="left">按照<em>something2</em>把得到的结果中相同的项合并为一项，即按<em>something2</em>进行分组。可以用<strong>COUNT(*)</strong>计算每组中的个数。</p>
<p align="left"><strong>(12)</strong> <strong>限制得到的分组</strong></p>
<p align="left"><strong>SELECT</strong> <em>something</em> <strong>FROM</strong> <em>somewhere&#8230;</em><strong>GROUP BY</strong> <em>something2</em> <strong>HAVING COUNT(*)</strong> &gt; <em>N</em>;</p>
<p align="left">用<strong>HAVING</strong>限制只得到包括个体数目大于<em>N</em>的组。</p>
<p align="left"><strong>(13) AS -</strong> <strong>更改显示的列名</strong><strong>,</strong><strong>自定义表名</strong></p>
<p align="left"><strong>SELECT</strong> <em>something</em> <strong>AS</strong> <em>something_else</em>, <em>something2</em> <strong>AS</strong> <em>something_else2</em>&#8230;;</p>
<p align="left">显示自定义的列名。</p>
<p align="left"><strong>SELECT</strong> <em>Cust.CustomerID, CompanyName, Address, OrderID, ShipAddress</em> <strong>FROM</strong> <em>Customers</em> <strong>AS</strong> <em>Cust</em>, <em>Orders</em> <strong>AS</strong> <em>Ord</em> <strong>WHERE</strong> <em>Cust.CustomerID</em> = <em>Ord.CustomerID&#8230;</em>;</p>
<p align="left">为方便、简略，把表名用别名代替。</p>
<p align="left"><strong>(14)</strong> <strong>对列中的值进行计算</strong></p>
<p align="left"><strong>SELECT</strong> <em>something (+, -, *, /, &#8230; something)</em> <strong>FROM</strong> <em>somewhere&#8230;</em>;</p>
<p align="left">对选择的列按其类型（数值、字符、字符串）进行相应的计算，以及在列之间进行计算，得到计算结果。</p>
<p align="left"><strong>(15)</strong> <strong>从多个表中进行选择</strong></p>
<p align="left"><strong>SELECT</strong> <em>something, something2, &#8230;</em> <strong>FROM</strong> (<em>table1, table2&#8230;</em>);</p>
<p align="left"><em>table1</em>和<em>table2</em>必须<strong>JOIN</strong>起来。</p>
<p align="left">如果有选择的列名同时在两个表中出现，必须明确表示出来，如：<em>table1.something</em>。</p>
<p align="left">表的<strong>JOIN</strong>可以用标准的SQL形式：<em>table1.something=table2.something</em>；也可以用更加&#8220;显式&#8221;的形式，直接用<strong>JOIN</strong>关键字：</p>
<p align="left"><strong>SELECT</strong> <em>something, something2, &#8230;</em> <strong>FROM</strong> table1</p>
<p align="left"></p>
<p align="left"><strong>JOIN</strong> <em>table2</em> <strong>ON</strong> <em>table1.something=table2.something</em> <strong>AND</strong> <em>(other conditions)&#8230;</em></p>
<p align="left">上两种<strong>JOIN</strong>方法存在明显的不足：如果某行中列的值为NULL则不能得到结果，即不能针对存在NULL值的列进行<strong>JOIN</strong>。外部<strong>JOIN</strong>可以解决这一问题。</p>
<p align="left"><strong>LEFT OUTER JOIN</strong> 可以得到左边含NULL的值</p>
<p align="left"><strong>RIGHT OUTER JOIN</strong> 可以得到右边含NULL的值</p>
<p align="left"><strong>FULL OUTER JOIN</strong> 两边含NULL的值都可以取得</p>
<p align="left"><strong>(16)</strong> <strong>从视图中选择行</strong></p>
<p align="left"><strong>SELECT</strong> <em>something</em> <strong>FROM</strong> <em>table1</em> <strong>INNER</strong> <strong>JOIN</strong> <em>table2&#8230;</em> <strong>ON</strong> (<em>Condition</em>)&#8230;;</p>
<p align="left">取得的View称为Alphabetical list of something。</p>
<p align="left"><strong>3. INSERT -</strong> <strong>向表中插入一行</strong></p>
<p align="left"><strong>INSERT</strong> <strong>INTO</strong> <em>table</em> (<em>column1</em>, <em>column2</em>, &#8230;, <em>column</em>&#8230;) <strong>VALUES</strong> (<em>value1</em>, <em>value2</em>, &#8230;, <em>value</em>&#8230;);</p>
<p align="left">如果为插入的行的每一列都提供值，则可以忽略列名，只提供值：</p>
<p align="left"><strong>INSERT</strong> <strong>INTO</strong> <em>table</em> <strong>VALUES</strong> (<em>value1</em>, <em>value2</em>, &#8230;, <em>value</em>&#8230;);</p>
<p align="left"><strong>4. UPDATE &#8211;</strong> <strong>修改表中某一行</strong></p>
<p align="left"><strong>UPDATE</strong> <em>table</em></p>
<p align="left"><strong>SET</strong> <em>column</em> = (<em>something</em>) <strong>WHERE</strong> (<em>condition</em>);</p>
<p align="left"></p>
<p align="left">可以同时修改行中多列的值：<strong>SET</strong> <em>column</em> = (<em>something</em>), <em>column2</em> = (<em>something2</em>), &#8230;</p>
<p align="left"><strong>5. DELETE &#8211;</strong> <strong>删除一行</strong></p>
<p align="left"><strong>DELETE FROM</strong> <em>table</em> <strong>WHERE</strong> (<em>condition</em>);</p>
<p align="left"><strong>6.</strong> <strong>保持数库的完整一致性</strong></p>
<p align="left">1．主键的独一无二性</p>
<p align="left">2．子表中的Foreign Key指向父表中的有效值</p>
<p align="left">如：不能修改或删除一个作为Foreign Key被引用的值</p>
<p align="left"><strong>7. TRANSACTION</strong></p>
<p align="left">通过把多条语句集合为一个&#8220;Transaction&#8221;（业务、记录？），以及业务的执行与回滚实现。</p>
<p align="left"><strong>BEGIN</strong> <strong>TRANSACTION</strong>;</p>
<p align="left"><em>Do something;</em></p>
<p align="left"><strong>COMMIT</strong>; / <strong>ROLLBACK</strong>;</p>
<p align="left">在决定是<strong>COMMIT</strong>还是<strong>ROLLBACK</strong>之前，应该检查业务中有没有错误发生。如果没有则执行，否则就回滚。用<strong>@@ERROR</strong>的值判断是否发生错误，0代表没有。</p>
<p align="left"><strong>BEGIN</strong> <strong>TRANSACTION</strong> MyTransaction;</p>
<p align="left"><em>Do something;</em></p>
<p align="left"><strong>IF @@ERROR = 0</strong></p>
<p align="left"><strong>COMMIT TRANSACTION</strong> MyTransaction;</p>
<p align="left"><strong>ELSE</strong></p>
<p align="left"><strong>ROLLBACK TRANSACTION</strong> MyTransaction;</p>
  <img src ="http://www.blogjava.net/void241/aggbug/215983.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/void241/" target="_blank">void</a> 2008-07-19 11:23 <a href="http://www.blogjava.net/void241/archive/2008/07/19/215983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>