question from asktom

1. Finding the number of rows in each table by a single sql

 1 SQL> select table_name, num_rows from user_tables;
 2 
 3 TABLE_NAME                       NUM_ROWS
 4 ------------------------------ ----------
 5 DEPT                                    4
 6 EMP                                    14
 7 BONUS                                   0
 8 SALGRADE                                5
 9 EMPLOYEE                                0
10 
11 SQL> 

 

2. IN (vs) EXISTS and NOT IN (vs) NOT EXISTS

IN (vs) EXISTS:
in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的。如果查询的两个表大小相当,那么用in和exists差别不大;如果两个表中一个较小一个较大,则子查询表大的用exists,子查询表小的用in;

NOT IN (vs) NOT EXISTS:
尽量不要使用not in(它会调用子查询),而尽量使用not exists(它会调用关联子查询)。如果子查询中返回的任意一条记录含有空值,则查询将不返回任何记录。如果子查询字段有非空限制,这时可以使用not in,并且可以通过提示让它用hasg_aj或merge_aj连接。

如果查询语句使用了not in,那么对内外表都进行全表扫描,没有用到索引;而not exists的子查询依然能用到表上的索引。所以无论哪个表大,用not exists都比not in 要快。


exists (sql 返回结果集为真)
not exists (sql 不返回结果集为真)
in引导的子句只能返回一个字段,exist引导的子句可以返回多个字段。

oracle中在可为null的字段上做逻辑关系运算要格外小心,如 <>,>,=,<,任何与null的运算结果都返回false,因此对于可能为null的字段运算判断要用 is null 来判断,或者使用函数nvl、decode处理后在判断,比如:where 字段名 is null 或者where nvl(字段名,0) = 0; -- 假设字段类型是数字

Oracle中的空字符串基本上是被当成空NULL来处理

 

上一篇:Contiguous Subarrays


下一篇:Web项目如何做单元测试