﻿<?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-小程序员之歌-文章分类-数据库</title><link>http://www.blogjava.net/tbest/category/30112.html</link><description>java先（我应该为它写点什么了！）</description><language>zh-cn</language><lastBuildDate>Mon, 17 Mar 2008 10:09:22 GMT</lastBuildDate><pubDate>Mon, 17 Mar 2008 10:09:22 GMT</pubDate><ttl>60</ttl><item><title>PL/SQL中用光标查询多条记录</title><link>http://www.blogjava.net/tbest/articles/186783.html</link><dc:creator>liujg</dc:creator><author>liujg</author><pubDate>Mon, 17 Mar 2008 07:55:00 GMT</pubDate><guid>http://www.blogjava.net/tbest/articles/186783.html</guid><wfw:comment>http://www.blogjava.net/tbest/comments/186783.html</wfw:comment><comments>http://www.blogjava.net/tbest/articles/186783.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tbest/comments/commentRss/186783.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbest/services/trackbacks/186783.html</trackback:ping><description><![CDATA[<p class="style35"><strong>一、 什么是光标</strong> </p>
<p class="style35"><strong style="color: black; background-color: #ffff66">Oracle</strong> 使用两种光标：显式光标和隐式光标。不管语句返回多少条纪录， PL/SQL 为使用的每一条 UPDATE 、 DELETE 和 INSERT 等 SQL 命令隐式的声明一个光标。（要管理 SQL 语句的处理，必须隐式的给它定义一个光标。）用户声明并使用显示光标处理 SELECT 语句返回的多条记录。显示的定义光标一种结构，它使用户能够为特定的语句指定内存区域，以便以后使用。 </p>
<p class="style35"><strong>二、 光标的作用</strong> </p>
<p class="style35">当 PL/SQL 光标查询返回多行数据时，这些记录组被称为活动集。 <strong style="color: black; background-color: #ffff66">Oracle</strong> 将这种活动集存储在您创建的显示定义的已命名的光标中。<strong style="color: black; background-color: #ffff66">Oracle</strong> 光标是一种用于轻松的处理多行数据的机制，没有光标， <strong style="color: black; background-color: #ffff66">Oracle</strong> 开发人员必须单独地、显式地取回并管理光标查询选择的每一条记录。 </p>
<p class="style35">光标的另一项功能事，它包含一个跟踪当前访问的记录的指针，这使您的程序能够一次处理多条记录。 </p>
<p class="style35"><strong>三、 使用显示光标的基本方法</strong> </p>
<p class="style35">步骤如下： </p>
<p class="style35"><strong>1 、声明光标</strong> </p>
<p class="style35">声明光标的语法如下： </p>
<p class="style35">DECLARE cursor_name </p>
<p class="style35">Is </p>
<p class="style35">SELECT statement </p>
<p class="style35">其中， cursor_name 是您给光标指定的名称； SELECT statement 是给光标活动集返回记录的查询。 </p>
<p class="style35">声明光标完成了下面两个目的： </p>
<p class="style35">给光标命名； </p>
<p class="style35">将一个查询与光标关联起来。 </p>
<p class="style35">值得注意的是，必须在 PL/SQL 块的声明部分声明光标；给光标指定的名称是一个未声明的标识符，而不是一个 PL/SQL 变量，不能给光标名称赋值，也不能将它用在表达式中。 PL/SQL 块使用这个名称来引用光标查询。 </p>
<p class="style35">例： DECLARE </p>
<p class="style35">CURSOR c1 </p>
<p class="style35">Is </p>
<p class="style35">SELECT VIEW_NAME FROM ALL_VIEWS </p>
<p class="style35">WHERE ROWNUM&lt;=10 ； </p>
<p class="style35">另外还可以在光标定义语句中声明光标的参数，例： </p>
<p class="style35">CURSOR c1 （ view _nbr number ） </p>
<p class="style35">Is </p>
<p class="style35">SELECT VIEW_NAME FROM ALL_VIEWS </p>
<p class="style35">WHERE ROWNUM&lt;= view _nbr ； </p>
<p class="style35">光标参数只对相应的光标是可见的，不能在光标范围之外引用该光标的参数。如果试图这样做， <strong style="color: black; background-color: #ffff66">Oracle</strong> 将返回一个错误，指出该变量没有定义。 </p>
<p class="style35"><strong>2 、打开光标</strong> </p>
<p class="style35">打开光标的语法如下： </p>
<p class="style35">OPEN cursor_name ； </p>
<p class="style35">其中 cursor_name 是您以前定义的光标名称。 </p>
<p class="style35">打开光标将激活查询并识别活动集，可是在执行光标取回命令之前，并没有真正取回记录。 OPEN 命令还初始化了光标指针，使其指向活动集的第一条记录。光标被打开后，直到关闭之前，取回到活动集的所有数据都是静态的，换句话说，光标忽略所有在光标打开之后，对数据执行的 SQL DML 命令（ INSERT 、 UPDATE 、 DELETE 和 SELECT ）。因此只有在需要时才打开它，要刷新活动集，只需关闭并重新打开光标即可。 </p>
<p class="style35"><strong>3 、从光标中取回数据</strong> </p>
<p class="style35">FETCH 命令以每次一条记录的方式取回活动集中的记录。通常将 FETCH 命令和某种迭代处理结合起来使用，在迭代处理中， FETCH 命令每执行一次，光标前进到活动集的下一条记录。 </p>
<p class="style35">FETCH 命令的语法： </p>
<p class="style35">FETCH cursor_name INTO record_list ； </p>
<p class="style35">其中， cursor_name 是前面定义的光标的名称； record_list 是变量列表，它接受活动集中的列。 FETCH 命令将活动集的结果放置到这些变量中。 </p>
<p class="style35">执行 FETCH 命令后，活动集中的结果被取回到 PL/SQL 变量中，以便在 PL/SQL 块中使用。每取回一条记录，光标的指针就移向活动集的下一条记录。 </p>
<p class="style35">例： </p>
<p class="style35">FETCH C1 INTO VNAME; </p>
<p class="style35">WHILE C1%FOUND LOOP </p>
<p class="style35">DBMS_OUTPUT.PUT_LINE(TO_CHAR(C1%ROWCOUNT)||' '||VNAME); </p>
<p class="style35">END LOOP; </p>
<p class="style35">其中，使用属性 '%FOUND' 使得当 FETCH 到达活动集的结尾时，不会引发异常。其它属性及含义见下表： </p>
<p class="style35">属性 含量 </p>
<p class="style35">%FOUND 布尔型属性，当最近一次该记录时成功返回，则值为 TRUE </p>
<p class="style35">%NOTFOUND 布尔型属性，它的值总与 %FOUND 属性的值相反 </p>
<p class="style35">%ISOPEN 布尔型属性，当光标是打开时返回 TRUE </p>
<p class="style35">%ROWCOUNT 数字型属性，返回已从光标中读取的记录数 </p>
<p class="style35">属性 含量 </p>
<p class="style35">%FOUND 布尔型属性，当最近一次该记录时成功返回，则值为 TRUE </p>
<p class="style35">%NOTFOUND 布尔型属性，它的值总与 %FOUND 属性的值相反 </p>
<p class="style35">%ISOPEN 布尔型属性，当光标是打开时返回 TRUE </p>
<p class="style35">%ROWCOUNT 数字型属性，返回已从光标中读取的记录数 </p>
<p class="style35"><strong>4 、<a name="baidusnap2"></a><strong style="color: black; background-color: #99ff99">关闭光标</strong></strong> </p>
<p class="style35">CLOSE 语句关闭以前打开的光标，使得活动集不确定。当用户的程序或会话结束时， <strong style="color: black; background-color: #ffff66">Oracle</strong> 隐式<strong style="color: black; background-color: #99ff99">关闭光标</strong>。光标被关闭后，就不能对它执行任何操作了 , 否则将引发异常。 </p>
<p class="style35">CLOSE 语句的语法是： </p>
<p class="style35">CLOSE cursor_name ； </p>
<p class="style35">其中， cursor_name 是以前打开的光标的名称。 </p>
<p class="style35">完整的程序代码如下： </p>
<p class="style35">DECLARE </p>
<p class="style35">CURSOR C1 IS SELECT VIEW_NAME FROM ALL_VIEWS </p>
<p class="style35">WHERE ROWNUM&lt;=10 </p>
<p class="style35">ORDER BY VIEW_NAME; </p>
<p class="style35">VNAME VARCHAR2(40); </p>
<p class="style35">BEGIN </p>
<p class="style35">OPEN C1; </p>
<p class="style35">FETCH C1 INTO VNAME; </p>
<p class="style35">WHILE C1%FOUND LOOP </p>
<p class="style35">DBMS_OUTPUT.PUT_LINE(TO_CHAR(C1%ROWCOUNT)||''||VNAME); </p>
<p class="style35">END LOOP; </p>
<p class="style35">END; </p>
<p class="style35">&#8230;&#8230; CLOSE C1; </p>
<p class="style35"><strong>四、 小结</strong> </p>
<p class="style35">光标是一种结构 , 能够以一次一条记录的方式处理多行查询的结果 . 为每条 DML 语句创建隐式光标 , 而显式光标是由用户创建的 , 以便处理返回多条记录的查询。而且 , 通过消除反复地分析代码 , 光标提高了代码的处理速度。 </p>
<img src ="http://www.blogjava.net/tbest/aggbug/186783.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbest/" target="_blank">liujg</a> 2008-03-17 15:55 <a href="http://www.blogjava.net/tbest/articles/186783.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>漫 谈oracle 中 的 空 值（转）</title><link>http://www.blogjava.net/tbest/articles/186737.html</link><dc:creator>liujg</dc:creator><author>liujg</author><pubDate>Mon, 17 Mar 2008 05:33:00 GMT</pubDate><guid>http://www.blogjava.net/tbest/articles/186737.html</guid><wfw:comment>http://www.blogjava.net/tbest/comments/186737.html</wfw:comment><comments>http://www.blogjava.net/tbest/articles/186737.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/tbest/comments/commentRss/186737.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbest/services/trackbacks/186737.html</trackback:ping><description><![CDATA[<center><font color="#0000c0">
<h2>漫 谈oracle 中 的 空 值 </h2>
</font>
<div align="right">摘自：<a href="http://www.computerworld.com.cn/" target="_blank">计算机世界日报</a></div>
<br />
<h3>河 北 省 统 计 局 贾 书 民 </h3>
</center>
<p><font color="#ffffff">----</font> 在 数 据 库 中， 空 值 用 来 表 示 实 际 值 未 知 或 无 意 义 的 情 况。 在 一 个 表 中， 如 果 一 行 中 的 某 列 没 有 值， 那 么 就 称 它 为 空 值（NULL）。 任 何 数 据 类 型 的 列, 只 要 没 有 使 用 非 空（NOT NULL） 或 主 键（PRIMARY KEY） 完 整 性 限 制， 都 可 以 出 现 空 值。 在 实 际 应 用 中， 如 果 忽 略 空 值 的 存 在， 将 会 造 成 造 成 不 必 要 的 麻 烦。
<p><font color="#ffffff">----</font> 例 如， 在 下 面 的 雇 员 表（EMP） 中， 雇 员 名（ENAME） 为KING 的 行， 因 为KING 为 最 高 官 员（PRESIDENT）， 他 没 有 主 管（MGR）， 所 以 其MGR 为 空 值。 因 为 不 是 所 有 的 雇 员 都 有 手 续 费（COMM）， 所 以 列COMM 允 许 有 空 值， 除300、500、1400、0 以 外 的 其 它 各 行COMM 均 为 空 值。
<pre>EMPNO ENAME    JOB       MGR HIREDATE    SAL   COMM  DEPTNO
---- -------- -------- --------- -------- ------ ---------
7369 SMITH     CLERK     7902 17-DEC-80  800           20
7499 ALLEN     SALESMAN  7698 20-FEB-81  1600    300   30
7521 WARD      SALESMAN  7698 22-FEB-81  1250    500   30
7566 JONES     MANAGER   7839 02-APR-81  2975          20
7654 MARTIN    SALESMAN  7698 28-SEP-81  1250   1400   30
7698 BLAKE     MANAGER   7839 01-MAY-81  2850          30
7782 CLARK     MANAGER   7839 09-JUN-81  2450          10
7788 SCOTT     ANALYST   7566 09-DEC-82  3000          20
7839 KING      PRESIDENT      17-NOV-81  5000          10
7844 TURNER    SALESMAN  7698 08-SEP-81  1500      0   30
7876 ADAMS     CLERK     7788 12-JAN-83  1100          20
7900 JAMES     CLERK     7698 03-DEC-81   950          30
7902 FORD      ANALYST   7566 03-DEC-81  3000          20
7934 MILLER    CLERK     7782 23-JAN-82  1300          10
</pre>
<p><font color="#ffffff">----</font> 本 文 将 以 上 述EMP 表 为 例， 具 体 讨 论 一 下 空 值 在 日 常 应 用 中 所 具 有 的 一 些 特 性。
<p><font color="#ffffff">----</font> 一、 空 值 的 生 成 及 特 点
<p><font color="#ffffff">----</font> 1. 空 值 的 生 成
<p><font color="#ffffff">----</font> 如 果 一 列 没 有 非 空（NOT NULL） 完 整 性 限 制， 那 么 其 缺 省 的 值 为 空 值， 即 如 果 插 入 一 行 时 未 指 定 该 列 的 值， 则 其 值 为 空 值。
<p><font color="#ffffff">----</font> 使 用SQL 语 句INSERT 插 入 行， 凡 未 涉 及 到 的 列， 其 值 为 空 值； 涉 及 到 的 列， 如 果 其 值 确 实 为 空 值， 插 入 时 可 以 用NULL 来 表 示（ 对 于 字 符 型 的 列， 也 可 以 用'' 来 表 示）。
<p><font color="#ffffff">----</font> 例： 插 入 一 行， 其EMPNO 为1、ENAME 为'JIA'、SAL 为10000、job 和comm 为 空 值。
<pre>SQL &gt;insert into emp(empno,ename,job,sal,comm)
values(1,'JIA',NULL,1000,NULL);
SQL &gt;select * from emp where empno=1;
EMPNO ENAME  JOB   MGR HIREDATE    SAL    COMM    DEPTNO
--------- ---------- --------- --------- --------- ---------
1 JIA         1000
</pre>
<p><font color="#ffffff">----</font> 可 以 看 到 新 插 入 的 一 行， 除job 和comm 为 空 值 外，mgr、hiredate、deptno 三 列 由 于 插 入 时 未 涉 及， 也 为 空 值。
<p><font color="#ffffff">----</font> 使 用SQL 语 句UPDATE 来 修 改 数 据， 空 值 可 用NULL 来 表 示（ 对 于 字 符 型 的 列， 也 可 以 用'' 来 表 示）。 例:
<pre>SQL &gt;update emp set ename=NULL,sal=NULL where empno=1;
</pre>
<p><font color="#ffffff">----</font> 2. 空 值 的 特 点
<p><font color="#ffffff">----</font> 空 值 具 有 以 下 特 点：
<p><font color="#ffffff">----</font> * 等 价 于 没 有 任 何 值。
<p><font color="#ffffff">----</font> * 与 0、 空 字 符 串 或 空 格 不 同。
<p><font color="#ffffff">----</font> * 在where 条 件 中, Oracle 认 为 结 果 为NULL 的 条 件 为FALSE， 带 有 这 样 条 件 的select 语 句 不 返 回 行， 并 且 不 返 回 错 误 信 息。 但NULL 和FALSE 是 不 同 的。
<p><font color="#ffffff">----</font> * 排 序 时 比 其 他 数 据 都 大。
<p><font color="#ffffff">----</font> * 空 值 不 能 被 索 引。
<p><font color="#ffffff">----</font> 二、 空 值 的 测 试
<p><font color="#ffffff">----</font> 因 为 空 值 表 示 缺 少 数 据， 所 以 空 值 和 其 它 值 没 有 可 比 性， 即 不 能 用 等 于、 不 等 于、 大 于 或 小 于 和 其 它 数 值 比 较， 当 然 也 包 括 空 值 本 身（ 但 是 在decode 中 例 外， 两 个 空 值 被 认 为 是 等 价）。 测 试 空 值 只 能 用 比 较 操 作 符IS NULL 和IS NOT NULL。 如 果 使 用 带 有 其 它 比 较 操 作 符 的 条 件 表 达 式， 并 且 其 结 果 依 赖 于 空 值， 那 么 其 结 果 必 定 是NULL。 在where 条 件 中，Oracle 认 为 结 果 为NULL 的 条 件 为FALSE， 带 有 这 样 条 件 的select 语 句 不 返 回 行， 也 不 返 回 错 误 信 息。
<p><font color="#ffffff">----</font> 例 如 查 询EMP 表 中MGR 为NULL 的 行：
<pre>SQL &gt;select * from emp where mgr='';
no rows selected
SQL &gt;select * from emp where mgr=null;
no rows selected
SQL &gt;select * from emp where mgr is null;
EMPNO ENAME  JOB  MGR HIREDATE   SAL  COMM  DEPTNO
---------- --------- --------- --------- ---------
7839 KING  PRESIDENT  17-NOV-81  5000        10
</pre>
<p><font color="#ffffff">----</font> 第1、2 句 写 法 不 妥，WHERE 条 件 结 果 为NULL， 不 返 回 行。 第 三 句 正 确， 返 回MGR 为 空 值 的 行。
<p><font color="#ffffff">----</font> 三、 空 值 和 操 作 符
<p><font color="#ffffff">----</font> 1. 空 值 和 逻 辑 操 作 符
<p><font color="#ffffff">----</font> 逻 辑 操 作 符
<p><font color="#ffffff">----</font> 表 达 式
<p><font color="#ffffff">----</font> 结 果
<pre>AND
NULL AND TRUE
NULL
NULL AND FALSE
FALSE
NULL AND NULL
NULL
OR
NULL OR TRUE
TRUE
NULL OR FALSE
NULL
NULL OR NULL
NULL
NOT
NOT NULL
NULL
</pre>
<p><font color="#ffffff">----</font> 可 以 看 到， 在 真 值 表 中， 除NULL AND FALSE 结 果 为FALSE、NULL OR TRUE 结 果 为TRUE 以 外， 其 它 结 果 均 为NULL。
<p><font color="#ffffff">----</font> 虽 然 在where 条 件 中，Oracle 认 为 结 果 为NULL 的WHERE 条 件 为FALSE， 但 在 条 件 表 达 式 中NULL 不 同 于FALSE。 例 如 在NOT （ NULL AND FALSE ） 和NOT （ NULL AND NULL ） 二 者 中 仅 有 一 处FALSE 和TRUE 的 区 别， 但NOT （ NULL AND FALSE ） 的 结 果 为 TRUE， 而NOT （ NULL AND NULL ） 的 结 果 为NULL。
<p><font color="#ffffff">----</font> 下 面 举 例 说 明 空 值 和 逻 辑 操 作 符 的 用 法：
<pre>SQL &gt; select * from emp where not comm=null and comm!=0;
no rows selected
SQL &gt; select * from emp where not ( not comm=null and comm!=0 );
EMPNO ENAME  JOB      MGR  HIREDATE  SAL  COMM  DEPTNO
---------- --------- --------- --------- ---------
7844 TURNER SALESMAN  7698 08-SEP-81 1500   0     30
</pre>
<p><font color="#ffffff">----</font> 第 一 个Select 语 句， 条 件"not comm=null and comm!=0" 等 价 于NULL AND COMM!=0。 对 于 任 意 一 行， 如 果COMM 为 不 等 于0 的 数 值， 条 件 等 价 于NULL AND TRUE， 结 果 为NULL； 如 果COMM 等 于0， 条 件 等 价 于NULL AND FALSE， 结 果 为FALSE。 所 以， 最 终 结 果 不 返 回 行。
<p><font color="#ffffff">----</font> 第 二 个Select 语 句 的 条 件 为 第 一 个Select 语 句 条 件 的" 非"（NOT）， 对 于 任 意 一 行， 如 果COMM 为 不 等 于0 的 数 值， 条 件 等 价 于NOT NULL， 结 果 为NULL； 如 果COMM 等 于0， 条 件 等 价 于NOT FALSE， 结 果 为TRUE。 所 以， 最 终 结 果 返 回 行COMM 等 于0 的 行。
<p><font color="#ffffff">----</font> 2. 空 值 和 比 较 操 作 符
<p><font color="#ffffff">----</font> （1）IS [NOT] NULL： 是 用 来 测 试 空 值 的 唯 一 操 作 符（ 见" 空 值 的 测 试"）。
<pre>（2）=、!=、&gt;=、&lt;=、&gt;、&lt;
SQL &gt;select ename,sal,comm from emp where sal &gt;comm;
ENAME            SAL      COMM
---------- --------- ---------
ALLEN           1600       300
WARD            1250       500
TURNER          1500         0
</pre>
<p><font color="#ffffff">----</font> sal 或comm 为 空 值 的 行，sal&gt;comm 比 较 结 果 为NULL， 所 以 凡 是sal 或comm 为 空 值 的 行 都 没 有 返 回。
<p><font color="#ffffff">----</font> （3）IN 和NOT IN 操 作 符
<pre>SQL &gt;select ename,mgr from emp where mgr in (7902,NULL);
ENAME            MGR
---------- ---------
SMITH           7902
</pre>
<p><font color="#ffffff">----</font> 在 上 述 语 句 中， 条 件"mgr in (7902,NULL)" 等 价 于mgr=7902 or mgr=NULL。 对 于 表EMP 中 的 任 意 一 行， 如 果mgr 为NULL， 则 上 述 条 件 等 价 于NULL OR NULL， 即 为NULL； 如 果mgr 为 不 等 于7902 的 数 值， 则 上 述 条 件 等 价 于FALSE OR NULL， 即 为NULL； 如 果mgr 等 于7902， 则 上 述 条 件 等 价 于TRUE OR NULL， 即 为TRUE。 所 以， 最 终 结 果 能 返 回mgr 等 于7902 的 行。
<pre>SQL &gt;select deptno from emp where deptno not in ('10',NULL);
no rows selected
</pre>
<p><font color="#ffffff">----</font> 在 上 述 语 句 中， 条 件"deptno not in ('10',NULL)" 等 价 于deptno!='10' and deptno!=NULL， 对 于EMP 表 中 的 任 意 一 行， 条 件 的 结 果 只 能 为NULL 或FALSE， 所 以 不 返 回 行。
<p><font color="#ffffff">----</font> （4）any,some
<pre>SQL &gt;select ename,sal from emp where sal &gt; any(3000,null);
ENAME            SAL
---------- ---------
KING            5000
</pre>
<p><font color="#ffffff">----</font> 条 件"sal &gt; any(3000,null)" 等 价 于sal &gt;3000 or sal &gt;null。 类 似 前 述（3） 第 一 句， 最 终 结 果 返 回 所 有sal &gt;3000 的 行。
<p><font color="#ffffff">----</font> （5）All
<pre>SQL &gt;select ename,sal from emp where sal &gt; all(3000,null);
no rows selected
</pre>
<p><font color="#ffffff">----</font> 条 件"sal&gt; all(3000,null)" 等 价 于sal &gt;3000 and sal &gt;null, 结 果 只 能 为NULL 或FALSE， 所 以 不 返 回 行。
<p><font color="#ffffff">----</font> （6）（not）between
<pre>SQL &gt;select ename,sal from emp where sal between null and 3000;
no rows selected
</pre>
<p><font color="#ffffff">----</font> 条 件"sal between null and 3000" 等 价 于sal &gt;=null and sal&lt; =3000, 结 果 只 能 为NULL 或FALSE， 所 以 不 返 回 行。
<pre>SQL &gt;select ename,sal from emp where sal not between null and 3000;
ENAME            SAL
---------- ---------
KING            5000
</pre>
<p><font color="#ffffff">----</font> 条 件"sal not between null and 3000" 等 价 于sal<null or sal>3000, 类 似 前 述（3） 的 第 一 句， 结 果 返 回sal&gt;3000 的 行。
<p><font color="#ffffff">----</font> 下 表 为 比 较 操 作 符 和 空 值 的 小 结：
<p><font color="#ffffff">----</font> 比 较 操 作 符
<p><font color="#ffffff">----</font> 表 达 式（ 例：A、B 是NULL、C=10）
<p><font color="#ffffff">----</font> 结 果
<pre>IS NULL、IS NOT NULL
A IS NULL
TRUE
A IS NOT NULL
FALSE
C IS NULL
FALSE
C IS NOT NULL
TRUE
=、!=、&gt;=、&lt; =、&gt;、&lt;
A = NULL
NULL
A &gt; NULL
NULL
C = NULL
NULL
C &gt; NULL
NULL
IN (=ANY)
A IN (10,NULL)
NULL
C IN (10,NULL)
TRUE
C IN (20,NULL)
NULL
NOT IN
( 等 价 于 ！=ALL)
A NOT IN (20,NULL)
NULL
C NOT IN (20,NULL)
FALSE
C NOT IN (10,NULL)
NULL
ANY，SOME
A &gt; ANY(5,NULL)
NULL
C &gt; ANY(5,NULL)
TRUE
C &gt; ANY(15,NULL)
NULL
ALL
A &gt; ALL(5,NULL)
NULL
C &gt; ALL(5,NULL)
NULL
C &gt; ALL(15,NULL)
FALSE
(NOT)BETWEEN
A BETWEEN 5 AND NULL
NULL
C BETWEEN 5 AND NULL
NULL
C BETWEEN 15 AND NULL
FALSE
A NOT BETWEEN 5 AND NULL
NULL
C NOT BETWEEN 5 AND NULL
NULL
C NOT BETWEEN 15 AND NULL
TRUE
</pre>
<p><font color="#ffffff">----</font> 3、 空 值 和 算 术、 字 符 操 作 符
<p><font color="#ffffff">----</font> （1） 算 术 操 作 符： 空 值 不 等 价 于0， 任 何 含 有 空 值 的 算 术 表 达 式 其 运 算 结 果 都 为 空 值， 例 如 空 值 加10 为 空 值。
<p><font color="#ffffff">----</font> （2） 字 符 操 作 符||： 因 为ORACLE 目 前 处 理 零 个 字 符 值 的 方 法 与 处 理 空 值 的 方 法 相 同（ 日 后 的 版 本 中 不 一 定 仍 然 如 此）， 所 以 对 于||， 空 值 等 价 于 零 个 字 符 值。 例：
<pre>SQL &gt;select ename,mgr,ename||mgr,sal,comm,sal+comm from emp;
ENAME            MGR ENAME||MGR          SAL      COMM  SAL+COMM
---------- --------- ------------- --------- --------- ---------
SMITH           7902 SMITH7902           800
ALLEN           7698 ALLEN7698          1600       300      1900
WARD            7698 WARD7698           1250       500      1750
JONES           7839 JONES7839          2975
MARTIN          7698 MARTIN7698         1250      1400      2650
BLAKE           7839 BLAKE7839          2850
CLARK           7839 CLARK7839          2450
SCOTT           7566 SCOTT7566          3000
KING                 KING               5000
TURNER          7698 TURNER7698         1500         0      1500
ADAMS           7788 ADAMS7788          1100
JAMES           7698 JAMES7698           950
FORD            7566 FORD7566           3000
MILLER          7782 MILLER7782         1300
</pre>
<p><font color="#ffffff">----</font> 我 们 可 以 看 到， 凡mgr 为 空 值 的，ename||mgr 结 果 等 于ename； 凡 是comm 为 空 值 的 行，sal+comm 均 为 空 值。
<p><font color="#ffffff">----</font> 四、 空 值 和 函 数
<p><font color="#ffffff">----</font> 1 ． 空 值 和 度 量 函 数
<p><font color="#ffffff">----</font> 对 于 度 量 函 数， 如 果 给 定 的 参 数 为 空 值， 则 其（NVL、TRANSLATE 除 外） 返 回 值 为 空 值。 如 下 例 中 的ABS（COMM）， 如 果COMM 为 空 值，ABS(COMM) 为 空 值。
<pre>SQL &gt; select ename,sal,comm,abs(comm) from emp where sal&lt; 1500;
ENAME            SAL      COMM ABS(COMM)
---------- --------- --------- ---------
SMITH            800
WARD            1250       500       500
MARTIN          1250      1400      1400
ADAMS           1100
JAMES            950
MILLER          1300
</pre>
<p><font color="#ffffff">----</font> 2. 空 值 和 组 函 数
<p><font color="#ffffff">----</font> 组 函 数 忽 略 空 值。 在 实 际 应 用 中， 根 据 需 要 可 利 用nvl 函 数 用 零 代 替 空 值。 例：
<pre>SQL &gt;select count(comm),sum(comm),avg(comm) from emp;
COUNT(COMM) SUM(COMM) AVG(COMM)
----------- --------- ---------
4      2200       550
SQL &gt;select count(nvl(comm,0)),sum(nvl(comm,0)),avg(nvl(comm,0))
from emp;
COUNT(NVL(COMM,0)) SUM(NVL(COMM,0)) AVG(NVL(COMM,0))
------------------ ---------------- ----------------
14             2200        157.14286
</pre>
<p><font color="#ffffff">----</font> 第 一 个SELECT 语 句 忽 略COMM 为 空 值 的 行， 第 二 个SELECT 语 句 使 用NVL 函 数 统 计 了 所 有 的COMM， 所 以 它 们 统 计 的 个 数、 平 均 值 都 不 相 同。 另 外 需 要 注 意 的 是， 在 利 用 组 函 数 进 行 数 据 处 理 时， 不 同 的 写 法 具 有 不 同 的 不 同 含 义， 在 实 际 应 用 中 应 灵 活 掌 握。 例 如：
<pre>SQL &gt;select deptno,sum(sal),sum(comm),
sum(sal+comm),sum(sal)+sum(comm),sum(nvl(sal,0)+nvl(comm,0))
from emp
group by deptno;
DEPTNO  SUM(SAL) SUM(COMM) SUM(SAL+COMM) SUM(SAL)
+SUM(COMM) SUM(NVL(SAL,0)+NVL(COMM,0))
--------- --------- --------- ------------- -------
10   8750                             8750
20   10875                            10875
30   9400      2200       7800        11600 11600
</pre>
<p><font color="#ffffff">----</font> 可 以 看 到SUM(SAL+COMM)、SUM(SAL)+SUM(COMM)、 SUM(NVL(SAL,0)+NVL(COMM,0)) 的 区 别：SUM(SAL+COMM) 为 先 加 然 后 计 算 各 行 的 和， 如 果SAL、COMM 中 有 一 个 为NULL， 则 该 行 忽 略 不 计；SUM(SAL)+SUM(COMM) 为 先 计 算 各 行 的 合 计 然 后 再 加，SAL、COMM 中 的NULL 都 忽 略 不 计， 但 如 果 SUM(SAL)、SUM(COMM) 二 者 的 结 果 之 中 有 一 个 为NULL， 则 二 者 之 和 为NULL； 在SUM(NVL(SAL,0)+NVL(COMM,0)) 里，SAL、COMM 中 的NULL 按0 处 理。
<p><font color="#ffffff">----</font> 五、 空 值 的 其 它 特 性
<p><font color="#ffffff">----</font> 1. 空 值 在 排 序 时 大 于 任 何 值。 例 如：
<pre>SQL &gt; select ename,comm from emp where deptno='30' order by comm；
ENAME           COMM
---------- ---------
TURNER             0
ALLEN            300
WARD             500
MARTIN          1400
BLAKE
JAMES
</pre>
<p><font color="#ffffff">----</font> 2. 空 值 不 能 被 索 引。 虽 然 在 某 列 上 建 立 了 索 引， 但 是 对 该 列 的 空 值 查 询 来 说， 因 为 空 值 没 有 被 索 引， 所 以 不 能 改 善 查 询 的 效 率。 例 如 下 面 的 查 询 不 能 利 用 在MGR 列 上 创 建 的 索 引。
<pre>SQL &gt;select ename from emp where mgr is null;
ENAME
----------
KING
</pre>
<p><font color="#ffffff">----</font> 另 外 正 是 因 为 空 值 不 被 索 引， 所 以 可 在 含 有 空 值 的 列 上 建 立 唯 一 性 索 引（UNIQUE INDEX）。 例 如， 可 以 在EMP 表 的COMM 列 上 建 立 唯 一 性 索 引：
<pre>SQL &gt;  create unique index emp_comm on emp(comm);
Index created.
</pre>
<img src ="http://www.blogjava.net/tbest/aggbug/186737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbest/" target="_blank">liujg</a> 2008-03-17 13:33 <a href="http://www.blogjava.net/tbest/articles/186737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PowerDesigner 使用 （转载）</title><link>http://www.blogjava.net/tbest/articles/158856.html</link><dc:creator>liujg</dc:creator><author>liujg</author><pubDate>Wed, 07 Nov 2007 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/tbest/articles/158856.html</guid><wfw:comment>http://www.blogjava.net/tbest/comments/158856.html</wfw:comment><comments>http://www.blogjava.net/tbest/articles/158856.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tbest/comments/commentRss/158856.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbest/services/trackbacks/158856.html</trackback:ping><description><![CDATA[<p>原文：<a href="http://blog.csdn.net/casularm/archive/2005/10/28/518266.aspx">http://blog.csdn.net/casularm/archive/2005/10/28/518266.aspx</a><strong><br />
一、PowerDesigner 简介</strong>　</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PowerDesigner是Sybase公司的CASE工具集，使用它可以方便地对管理信息系统进行分析设计，它几乎包括了数据库模型设计的全过程。利用PowerDesigner可以制作数据流程图、概念数据模型、物理数据模型，可以生成多种客户端开发工具的应用程序，还可为数据仓库制作结构模型，也能对团队设计模型进行控制。它可与许多流行的数据库设计软件，例如：PowerBuilder，Delphi，VB等相配合使用来缩短开发时间和使系统设计更优化。 <br />
<br />
<strong>PowerDesigner主要包括以下几个功能部分：</strong> <br />
　　（1） DataArchitect <br />
这是一个强大的数据库设计工具，使用DataArchitect可利用实体-关系图为一个信息系统创建"概念数据模型"－CDM（Conceptual Data Model）。并且可根据CDM产生基于某一特定数据库管理系统（例如：Sybase System 11）的"物理数据模型"-PDM(Physical Data Model)。还可优化PDM，产生为特定DBMS创建数据库的SQL语句并可以文件形式存储以便在其他时刻运行这些SQL语句创建数据库。另外，DataArchitect还可根据已存在的数据库反向生成PDM，CDM及创建数据库的SQL脚本。 <br />
　　（2） ProcessAnalyst <br />
这部分用于创建功能模型和数据流图，创建"处理层次关系"。 <br />
　　（3） AppModeler <br />
为客户/服务器应用程序创建应用模型。 <br />
　　（4） ODBC Administrator <br />
此部分用来管理系统的各种数据源。 <br />
<br />
<strong>PowerDesigner的4种模型文件：</strong> <br />
概念数据模型 (CDM) <br />
CDM 表现数据库的全部逻辑的结构,与任何的软件或数据储藏结构无关。 一个概念模型经常包括在物理数据库中仍然不实现的数据对象。 它给运行计划或业务活动的数据一个正式表现方式。 <br />
物理数据模型 (PDM) <br />
PDM 叙述数据库的物理实现。 <br />
藉由 PDM ，你考虑真实的物理实现的细节。 它进入帐户两个软件或数据储藏结构之内拿。 你能修正 PDM 适合你的表现或物理约束。 <br />
面向对象模型 (OOM) <br />
一个OOM包含一系列包，类，接口 , 和他们的关系。 这些对象一起形成所有的 ( 或部份) 一个软件系统的逻辑的设计视图的类结构。 一个OOM本质上是软件系统的一个静态的概念模型。 <br />
你使用 PowerDesigner 面向对象模型建立面向对象模型.(OOM) 你能为纯粹地对象- 导向的靠模切目的建立一个OOM, 产生Java文件或者PowerBuilder文件，或你能使用一个来自OOM的物理数据模型(PDM)对象 , 来表示关系数据库设计分析。 <br />
业务程序模型 (BPM) <br />
BPM 描述业务的各种不同内在任务和内在流程，而且客户如何以这些任务和流程互相影响。 <br />
BPM 是从业务合伙人的观点来看业务逻辑和规则的概念模型，使用一个图表描述 <br />
程序，流程，信息和合作协议之间的交互作用。 <br />
<br />
以下是其中的CDM PDM OOM三者的转换关系<br />
<br />
<img alt="" src="mk:@MSITStore:C:\Documents%20and%20Settings\vincent\桌面\PowerDisigner.chm::/【专题】使用PowerDesigner进行数据建模（一）－－PowerDesigner简介%20-%20浮云论坛.files/1498516-CMDPDMOOM-embed.jpg" align="absMiddle" border="0" /> </p>
<p><span class="javascript"><strong>使用PowerDesigner环境</strong> <br />
<br />
对象浏览器 <br />
对象浏览器可以用分层结构显示你的工作空间. <br />
输出窗口 <br />
显示操作的结果。 <br />
结果列表 <br />
用于显示生成、覆盖和模型检查结果，以及设计环境的总体信息。 <br />
图表窗口 <br />
用于组织模型中的图表，以图形方式显示模型中各对象之间的关系。<br />
<br />
<img alt="" src="mk:@MSITStore:C:\Documents%20and%20Settings\vincent\桌面\PowerDisigner.chm::/【专题】使用PowerDesigner进行数据建模（一）－－PowerDesigner简介%20-%20浮云论坛.files/1498520-PD-embed.jpg" align="absMiddle" border="0" /></span>&nbsp;<br />
<br />
我也不知道只有这些。。。。<br />
</p>
 <img src ="http://www.blogjava.net/tbest/aggbug/158856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbest/" target="_blank">liujg</a> 2007-11-07 16:36 <a href="http://www.blogjava.net/tbest/articles/158856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL 查找重复记录(转)</title><link>http://www.blogjava.net/tbest/articles/125152.html</link><dc:creator>liujg</dc:creator><author>liujg</author><pubDate>Tue, 19 Jun 2007 09:13:00 GMT</pubDate><guid>http://www.blogjava.net/tbest/articles/125152.html</guid><wfw:comment>http://www.blogjava.net/tbest/comments/125152.html</wfw:comment><comments>http://www.blogjava.net/tbest/articles/125152.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tbest/comments/commentRss/125152.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbest/services/trackbacks/125152.html</trackback:ping><description><![CDATA[<table style="TABLE-LAYOUT: fixed">
    <tbody>
        <tr>
            <td>
            <div class=cnt>文章来自此人博客：<a href="http://hi.baidu.com/zg110/blog">http://hi.baidu.com/zg110/blog</a>，在这里表示感谢！<br>表stuinfo，有三个字段recno(自增),stuid,stuname<br><br>建该表的Sql语句如下：<br><br>CREATE TABLE [StuInfo] (<br>[recno] [int] IDENTITY (1, 1) NOT NULL ,<br>[stuid] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,<br>[stuname] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL <br>) ON [PRIMARY]<br>GO<br><br>1.--查某一列(或多列)的重复值(只能查出重复记录的值，不能整个记录的信息)<br>--如:查找stuid,stuname重复的记录<br>select stuid,stuname from stuinfo<br>group by stuid,stuname<br>having(count(*))&gt;1<br><br>2.--查某一列有重复值的记录(这种方法查出的是所有重复的记录,也就是说如果有两条记录重复的，就查出两条)<br>--如:查找stuid重复的记录<br>select * from stuinfo<br>where stuid in (<br>select stuid from stuinfo<br>group by stuid<br>having(count(*))&gt;1<br>)<br><br>3.--查某一列有重复值的记录(只显示多余的记录,也就是说如果有三条记录重复的，就显示两条)<br>--这种方成绩的前提是：需有一个不重复的列,本例中的是recno<br>--如:查找stuid重复的记录<br>select * from stuinfo s1<br>where recno not in (<br>select max(recno) from stuinfo s2<br>where s1.stuid=s2.stuid<br>)<br>
            <p>&nbsp;</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
  <img src ="http://www.blogjava.net/tbest/aggbug/125152.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbest/" target="_blank">liujg</a> 2007-06-19 17:13 <a href="http://www.blogjava.net/tbest/articles/125152.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>