查询哪些书没有借出? 典型的查询方式为: SELECT TITLE FROM BOOKSHELF WHERE TITLE NOT IN (SELECT TITLE FROM BOOKSHELF_CHECKOUT) ORDER BY TITLE; 如果BOOKSHELF_CHECKOUT很大的话,速度可能会很慢,因为ORACLE会在BOOKSHELF_CHECKOUT上执行一个时间密集型的全表扫描。 oracle 中not in 效率不高 一:使用外部连接 SELECT DISTINCT C.TITLEFROM BOOKSHELF_CHECKOUT B RIGHT OUTER JOIN BOOKSHELF C ON B.TITLE = C.TITLE WHERE B.TITLE IS NULL ORDER BY C.TITLE ; 优化后的程序可以使用连接列上的索引。 WHERE B.TITLE IS NULL 表示不出现在BOOKSHELF_CHECKOUT中的TITLE列 (ORACLE作为NULL列返回,可参考外部连接方面的内容) 二:使用NOT EXISTS SELECT B.TITLE FROM BOOKSHELF B WHERE NOT EXISTS (SELECT 'X' FROM BOOKSHELF_CHECKOUT C WHERE C.TITLE = B.TITLE) ORDER BY B.TITLE 对于BOOKSHELF中每一个记录和BOOKSHELF_CHECKOUT匹配则是EXISTS.NOT EXISTS则是不存在的。NOT EXISTS往往可以使用可利用的索引,NOT IN 可能无法使用这些索引。 此外: 在Oracle中,not in (...) 括号中的返回值不能存在null值,如果不能确定返回结果一定无null值,还是改为not esists吧。而且not in效率低下,一般不能用到索引,生产环境的程序最好不要使用。