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来处理