﻿<?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-X-Spirit-随笔分类-Oracle</title><link>http://www.blogjava.net/zhangwei217245/category/43169.html</link><description>Always Beyond the Time</description><language>zh-cn</language><lastBuildDate>Wed, 17 Mar 2010 07:41:54 GMT</lastBuildDate><pubDate>Wed, 17 Mar 2010 07:41:54 GMT</pubDate><ttl>60</ttl><item><title>Oracle 11g口令过期</title><link>http://www.blogjava.net/zhangwei217245/archive/2010/03/17/315661.html</link><dc:creator>X-Spirit</dc:creator><author>X-Spirit</author><pubDate>Wed, 17 Mar 2010 02:57:00 GMT</pubDate><guid>http://www.blogjava.net/zhangwei217245/archive/2010/03/17/315661.html</guid><wfw:comment>http://www.blogjava.net/zhangwei217245/comments/315661.html</wfw:comment><comments>http://www.blogjava.net/zhangwei217245/archive/2010/03/17/315661.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangwei217245/comments/commentRss/315661.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangwei217245/services/trackbacks/315661.html</trackback:ping><description><![CDATA[今天发现服务器上的Oracle11g突然登录不上去了，提示ORA-28002错误，说是口令过期。<br />
<br />
不当DBA还真不知道Oracle有这神秘功能。<br />
<br />
上网上一查，有类似遭遇的朋友在论坛上求助，人家让他找DBA。汗。。。<br />
<br />
好在有的DBA乐于分享，终于找到了解决方案：<br />
<br />
1. 用DBA账户登录SQL PLUS。我用的是sysman。<br />
2. 系统会提示口令失效，但是会马上让你重置新密码。<br />
3. 重置之后，进入SQL PLUS控制台。<br />
4. 查看口令失效用户的profile文件
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">SQL</span><span style="color: rgb(128, 128, 128);">&gt;</span><span style="color: rgb(0, 0, 255);">SELECT</span><span style="color: rgb(0, 0, 0);">&nbsp;username,profile&nbsp;</span><span style="color: rgb(0, 0, 255);">FROM</span><span style="color: rgb(0, 0, 0);">&nbsp;dba_users;</span></div>
<p>EM（Web界面的控制台）：服务器&gt;用户，查看口令失效的用户对应的概要文件，这里假设为DEFAULT，下同。</p>
<p>5.
查看对应的概要文件的口令有效期设置</p>
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">SQL</span><span style="color: rgb(128, 128, 128);">&gt;</span><span style="color: rgb(0, 0, 255);">SELECT</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(128, 128, 128);">*</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">FROM</span><span style="color: rgb(0, 0, 0);">&nbsp;dba_profiles&nbsp;</span><span style="color: rgb(0, 0, 255);">WHERE</span><span style="color: rgb(0, 0, 0);">&nbsp;profile</span><span style="color: rgb(128, 128, 128);">=</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">DEFAULT</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(128, 128, 128);">AND</span><span style="color: rgb(0, 0, 0);">&nbsp;resource_name</span><span style="color: rgb(128, 128, 128);">=</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">PASSWORD_LIFE_TIME</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">;</span></div>
<p>EM（Web界面的控制台）：服务
器&gt;概要文件&gt;选择刚刚查到的概要文件DEFAULT&gt;查看，查看口令下面的有效期值。</p>
<p>6.将口令有效期默认值180天
修改成&#8220;无限制&#8221;<strong><span style="color: rgb(255, 0, 0);">（此项要慎重！除非你真得不想要这个密码失效的机制！）</span></strong></p>
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">SQL</span><span style="color: rgb(128, 128, 128);">&gt;</span><span style="color: rgb(0, 0, 255);">ALTER</span><span style="color: rgb(0, 0, 0);">&nbsp;PROFILE&nbsp;</span><span style="color: rgb(0, 0, 255);">DEFAULT</span><span style="color: rgb(0, 0, 0);">&nbsp;LIMIT&nbsp;PASSWORD_LIFE_TIME&nbsp;UNLIMITED;</span></div>
<p>EM：服务器&gt;概要文件&gt;选择刚刚查到的概要文件DEFAULT&gt;编辑&gt;口令，在有效期输入
或选择你需要的值，保存。</p>
<p><em><strong><span style="color: rgb(255, 95, 0);">该参数修改实时生效。</span></strong></em></p>
<p>出于数据库安全性考虑，不建议将PASSWORD_LIFE_TIME值设置
成UNLIMITED，即建议客户能够定期修改数据库用户口令。</p>
<p><img src="file:///tmp/moz-screenshot.png" alt="" /></p>
<p>在修改PASSWORD_LIFE_TIME值之前已经失效的用户，还是需
要重新修改一次密码才能使用。</p>
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">SQL</span><span style="color: rgb(128, 128, 128);">&gt;</span><span style="color: rgb(0, 0, 255);">ALTER</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(255, 0, 255);">USER</span><span style="color: rgb(0, 0, 0);">&nbsp;test&nbsp;INDENTIFIED&nbsp;BY<strong><em>password</em></strong></span></div>
<br />
也可以从SQL Developer 里面来修改用户的密码，用sysman账户登录以后，找到数据库中的其他用户节点，展开，找到你要修改密码的用户。然后编辑用户，对用户密码进行重置,如下图：<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/zhangwei217245/Oracle_reset_password.png" height="854" width="850" /><br />
<p><em><strong></strong></em></p>
<img src ="http://www.blogjava.net/zhangwei217245/aggbug/315661.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangwei217245/" target="_blank">X-Spirit</a> 2010-03-17 10:57 <a href="http://www.blogjava.net/zhangwei217245/archive/2010/03/17/315661.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle not in查不到应有的结果(NULL、IN、EXISTS详解)</title><link>http://www.blogjava.net/zhangwei217245/archive/2010/01/25/310708.html</link><dc:creator>X-Spirit</dc:creator><author>X-Spirit</author><pubDate>Mon, 25 Jan 2010 03:30:00 GMT</pubDate><guid>http://www.blogjava.net/zhangwei217245/archive/2010/01/25/310708.html</guid><wfw:comment>http://www.blogjava.net/zhangwei217245/comments/310708.html</wfw:comment><comments>http://www.blogjava.net/zhangwei217245/archive/2010/01/25/310708.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangwei217245/comments/commentRss/310708.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangwei217245/services/trackbacks/310708.html</trackback:ping><description><![CDATA[首先我要感谢aa和Liu Xing帮我发现了我日志中的错误。之前比较粗心，把3条SQL语句写成一样的了，对于给读者造成的麻烦，我深表抱歉。<br />
<br />
今天我把原文做了修订，为了对得起读者对我的关注，我重新深入的研究了这个问题，在后面，我会把来龙去脉写清楚。<br />
<em><br />
问题：<br />
<br />
<span style="background-color: #ffc720;">语句1</span>：<br />
</em>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><em><span style="color: #0000ff;">Select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;&nbsp;table1&nbsp;A&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;A.col1&nbsp;</span><span style="color: #808080;">not</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">in</span><span style="color: #000000;">&nbsp;(&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;col1&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;table2&nbsp;B&nbsp;) <br />
</span></em></div>
<em><br />
如果这样，本来应该有一条数据，结果没有。 <br />
如果我改写成这样： <br />
<br />
<span style="background-color: #38ff8f;">语句2</span>：<br />
</em>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><em><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;"> table1 A </span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">not</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">exists</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;"> * </span><span style="color: #0000ff;">FROM</span><span style="color: #000000;"> table2 B </span><span style="color: #0000ff;">where</span><span style="color: #000000;"> B.col1 </span><span style="color: #808080;">=</span><span style="color: #000000;"> A.col1)</span></em></div>
<em>
结果就正确，有一条数据显示。 <br />
<br />
<br />
经过一番搜索，原以为是子查询结果集太大的原因。</em>
<em><br />
<br />
后来有网上强人指点：子查询里面有空集。即子查询的结果集里面有NULL的结果。</em>
<em><br />
<br />
把查询语句修改成： </em>
<em><br />
<br />
<span style="background-color: #90c1ff;">语句3</span>：<br />
</em>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><em><span style="color: #0000ff;">Select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;&nbsp;table1&nbsp;A&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;A.col1&nbsp;</span><span style="color: #808080;">not</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">in</span><span style="color: #000000;">&nbsp;(&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;col1&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;table2&nbsp;B&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;B.col1&nbsp;</span><span style="color: #0000ff;">is</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">not</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;) <br />
</span></em></div>
<em><br />
果然就查出来了。而且一点不差。。。厉害阿～～～</em><br />
<br />
<br />
下面是针对本文题的分析：<br />
<br />
1。 首先来说说Oracle中的NULL。<br />
<br />
Oracle中的NULL代表的是无意义，或者没有值。将NULL和其他的值进行逻辑运算，运算过程中，NULL的表现更象是FALSE。<br />
下面请看真值表：<br />
<br />
<table width="500" cellpadding="2" cellspacing="2" border="0">
    <tbody>
        <tr>
            <td><br />
            </td>
            <td>&nbsp;AND NULL<br />
            </td>
            <td>&nbsp;OR NULL</td>
        </tr>
        <tr>
            <td>&nbsp;TRUE</td>
            <td>&nbsp;NULL</td>
            <td>&nbsp;TRUE</td>
        </tr>
        <tr>
            <td>&nbsp;FALSE</td>
            <td>&nbsp;FALSE</td>
            <td>&nbsp;NULL</td>
        </tr>
        <tr>
            <td>&nbsp;NULL</td>
            <td>&nbsp;NULL<br />
            </td>
            <td>&nbsp;NULL</td>
        </tr>
    </tbody>
</table>
<br />
另外，NULL和其他的值进行比较或者算术运算（&lt;、&gt;、=、!=、+、-、*、/），结果仍是NULL。<br />
<br />
如果想要判定某个值是否为NULL，可以用IS NULL或者IS NOT NULL。<br />
<br />
2. 再来说说Oracle中的IN。<br />
<br />
in是一个成员条件, 对于给定的一个集合或者子查询,它会比较每一个成员值。<br />
IN功能上相当于 =ANY 的操作，而NOT IN 功能上相当于 !=ALL 的操作。<br />
IN在逻辑上实际上就是对给定的成员集合或者子查询结果集进行逐条的判定，例如：<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">FROM</span><span style="color: #000000;">&nbsp;table1&nbsp;A&nbsp;</span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;">&nbsp;A.col1&nbsp;</span><span style="color: #808080;">in</span><span style="color: #000000;">&nbsp;(</span><span style="color: #800000; font-weight: bold;">20</span><span style="color: #000000;">,</span><span style="color: #800000; font-weight: bold;">50</span><span style="color: #000000;">,</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">);</span></div>
实际上就是执行了<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">FROM</span><span style="color: #000000;">&nbsp;table1&nbsp;A&nbsp;</span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;">&nbsp;A.col1</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">20</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">OR</span><span style="color: #000000;"> A.col1</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">50</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">OR</span><span style="color: #000000;"> A.col1</span><span style="color: #808080;">=</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">;</span></div>
这样，根据NULL的运算特点和真值表，我们可以看出，上边这个WHERE 字句可以被简化(如果返回NULL则无结果集返回，这一点和FALSE是一样的)为<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">WHERE</span><span style="color: #000000;">&nbsp;A.col1</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">20</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">OR</span><span style="color: #000000;">&nbsp;A.col1</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">50</span></div>
也就是说，如果你的table1中真的存在含有NULL值的col1列，则执行该语句，无法查询出那些值为null的记录。<br />
<br />
再来看看NOT IN。根据逻辑运算关系，我们知道，NOT (X=Y OR N=M) 等价于 X!=Y AND N!=M，那么：<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">FROM</span><span style="color: #000000;">&nbsp;table1&nbsp;A&nbsp;</span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;">&nbsp;A.col1&nbsp;</span><span style="color: #808080;">not</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">in</span><span style="color: #000000;">&nbsp;(</span><span style="color: #800000; font-weight: bold;">20</span><span style="color: #000000;">,</span><span style="color: #800000; font-weight: bold;">50</span><span style="color: #000000;">,</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">)</span></div>
等价于<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">FROM</span><span style="color: #000000;">&nbsp;table1&nbsp;A&nbsp;</span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;">&nbsp;A.col1</span><span style="color: #808080;">!=</span><span style="color: #800000; font-weight: bold;">20</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">AND</span><span style="color: #000000;">&nbsp;A.col1</span><span style="color: #808080;">!=</span><span style="color: #800000; font-weight: bold;">50</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">AND</span><span style="color: #000000;">&nbsp;A.col1</span><span style="color: #808080;">!=</span><span style="color: #0000ff;">NULL</span></div>
根据NULL的运算特性和真值表，该语句无论前两个判定条件是否为真，其结果一定是NULL或者FALSE。故绝对没有任何记录可以返回。<br />
<br />
这就是为什么<u><span style="background-color: #ffc720;">语句1</span></u>查不到应有结果的原因。当然，如果你用NOT IN的时候，预先在子查询里把NULL去掉的话，那就没问题了，例如<u><span style="background-color: #90c1ff;">语句3</span></u>。<br />
有些童鞋可能要问了：那如果我想把A表里面那些和B表一样col1列的值一样的记录都查出来，即便A、B两表里面的col1列都包括值为NULL的记录的话，用这一条语句就没办法了吗？<br />
<br />
我只能很遗憾的告诉你，如果你想在WHERE后面单纯用IN 似乎不太可能了，当然，你可以在外部的查询语句中将NULL条件并列进去，例如：<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">FROM</span><span style="color: #000000;">&nbsp;table1&nbsp;A&nbsp;</span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;">&nbsp;A.col1&nbsp;</span><span style="color: #808080;">in</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;B.col1&nbsp;</span><span style="color: #0000ff;">FROM</span><span style="color: #000000;">&nbsp;table2&nbsp;B)&nbsp;</span><span style="color: #808080;">OR</span><span style="color: #000000;">&nbsp;A.col1&nbsp;</span><span style="color: #0000ff;">IS</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">;</span></div>
<br />
<br />
<br />
3. 最后谈谈EXISTS。<br />
<br />
有人说EXISTS的性能比IN要好。但这是很片面的。我们来看看EXISTS的执行过程：<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t1&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">exists</span><span style="color: #000000;">&nbsp;(&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;"> *</span><span style="color: #000000;"> </span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t2&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;"> t2.col1 </span><span style="color: #808080;">=</span><span style="color: #000000;"> t1.col1 )</span></div>
相当于：<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #808080;">in</span><span style="color: #000000;">&nbsp;(&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t1&nbsp;)<br />
&nbsp;&nbsp;&nbsp;loop<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;</span><span style="color: #808080;">exists</span><span style="color: #000000;">&nbsp;(&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;"> *</span><span style="color: #000000;"> </span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t2&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;"> t2.col1 </span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;x.col1 )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">then</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OUTPUT&nbsp;THE&nbsp;RECORD in x<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">end</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">end</span><span style="color: #000000;">&nbsp;loop</span></div>
<br />
也就是说，EXISTS语句实际上是通过循环外部查询的结果集，来过滤出符合子查询标准的结果集。于是外部查询的结果集数量对该语句执行性能影响最大，故如果外部查询的结果集数量庞大，用EXISTS语句的性能也不一定就会好很多。<br />
<br />
当然，有人说NOT IN是对外部查询和子查询都做了全表扫描，如果有索引的话，还用不上索引，但是NOT EXISTS是做连接查询，所以，如果连接查询的两列都做了索引，性能会有一定的提升。<br />
当然至于实际的查询效率，我想还是具体情况具体分析吧。<br />
<br />
<br />
那么我们不妨来分析一下语句2为什么能够的到正确的结果吧：<br />
<br />
语句2是这样的：<em><br />
</em>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><em><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;"> table1 A </span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">not</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">exists</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;"> B.col1 </span><span style="color: #0000ff;">FROM</span><span style="color: #000000;"> table2 B </span><span style="color: #0000ff;">where</span><span style="color: #000000;"> B.col1 </span><span style="color: #808080;">=</span><span style="color: #000000;"> A.col1)</span></em></div>
<br />
实际上是这样的执行过程：<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #808080;">in</span><span style="color: #000000;">&nbsp;(&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;"> table1 A )<br />
&nbsp;&nbsp;&nbsp;loop<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(<span style="color: #d2d2d2;"><span style="color: #999999;">not</span></span> </span><span style="color: #808080;">exists</span><span style="color: #000000;">&nbsp;(&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;"> *</span><span style="color: #000000;"> </span><span style="color: #0000ff;">from</span><span style="color: #000000;"> table2 B </span><span style="color: #0000ff;">where</span><span style="color: #000000;"> B.col1 </span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;x.col1 )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">then</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OUTPUT&nbsp;THE&nbsp;RECORD in x<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">end</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">end</span><span style="color: #000000;">&nbsp;loop</span></div>
<br />
由于表A中不包含NULL的记录，所以，遍历完表A，也只能挑出表A中独有的记录。<br />
<br />
这就是为什么<span style="background-color: #38ff8f;">语句2</span>能够完成<span style="background-color: #90c1ff;">语句3</span>的任务的原因。<br />
<br />
但如果表A中存在NULL记录而表B中不存在呢？<br />
<br />
这个问题请大家自己分析吧。哈哈。有答案了可以给我留言哦。<br />
<br />
<span style="color: #ffffff;"><span style="color: #ffffff;"></span></span><span style="color: #000000;"><br />
<span style="color: #ffffff;">答案：A表中的NULL也会被查出来。因为select * from table2 B where B.col1 = NULL不返回结果，故<br />
not exists ( select * from table2 B where B.col1 = x.col1 )的值为真。</span><br />
<br />
<br />
<br />
以上SQL运行结果在MySQL和Oracle上都已经通过。<br />
</span>
 <img src ="http://www.blogjava.net/zhangwei217245/aggbug/310708.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangwei217245/" target="_blank">X-Spirit</a> 2010-01-25 11:30 <a href="http://www.blogjava.net/zhangwei217245/archive/2010/01/25/310708.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 导入DMP文件命令。导出基本上就是换成EXP。</title><link>http://www.blogjava.net/zhangwei217245/archive/2010/01/25/310693.html</link><dc:creator>X-Spirit</dc:creator><author>X-Spirit</author><pubDate>Mon, 25 Jan 2010 02:19:00 GMT</pubDate><guid>http://www.blogjava.net/zhangwei217245/archive/2010/01/25/310693.html</guid><wfw:comment>http://www.blogjava.net/zhangwei217245/comments/310693.html</wfw:comment><comments>http://www.blogjava.net/zhangwei217245/archive/2010/01/25/310693.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangwei217245/comments/commentRss/310693.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangwei217245/services/trackbacks/310693.html</trackback:ping><description><![CDATA[想从备份的dmp文件中导入某些表的时候,可以用如下imp命令，格式:
<br />
imp username/password@本地net服务名 file=xxx.dmp fromuser=xx touser=xx tables=(tablename)
<br />
username:登陆数据库的用户名
<br />
password:登陆数据库的密码
<br />
本地net服务名:连接服务器的本地net服务名
<br />
file:你的dmp文件的路径
<br />
fromuser,touser:从一个用户导入到另外一个用户
<br />
tables:从dmp文件中导入的表名
<img src ="http://www.blogjava.net/zhangwei217245/aggbug/310693.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangwei217245/" target="_blank">X-Spirit</a> 2010-01-25 10:19 <a href="http://www.blogjava.net/zhangwei217245/archive/2010/01/25/310693.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>