-- 在oracle中效率排行:表连接>exist>not exist>in>not in;
-- 因此如果简单提高效率可以用exist代替in进行操作,当然换成表连接可以更快地提高效率,
-- 具体是用left join代替not in 和not exist,用inner join 代替in和exist,这样可以大大提高效率。具体例子如下:
-- A、NOT IN、NOT EXISTS的相关子查询可以改用LEFT JOIN代替写法。
-- 比如:
SELECT PUB_NAME
FROM PUBLISHERS
WHERE PUB_ID NOT IN (SELECT PUB_ID FROM TITLES WHERE TYPE = 'BUSINESS')
-- 可以改写成:
SELECT A.PUB_NAME
FROM PUBLISHERS A
LEFT JOIN TITLES B
ON B.TYPE = 'BUSINESS'
AND A.PUB_ID=B. PUB_ID
WHERE B.PUB_ID IS NULL
-- (2)
SELECT TITLE
FROM TITLES
WHERE NOT EXISTS
(SELECT TITLE_ID
FROM SALES
WHERE TITLE_ID = TITLES.TITLE_ID)
-- 可以改写成:
SELECT TITLE
FROM TITLES
LEFT JOIN SALES
ON SALES.TITLE_ID = TITLES.TITLE_ID
WHERE SALES.TITLE_ID IS NULL
-- B、 如果保证子查询没有重复 ,IN、EXISTS的相关子查询可以用INNER JOIN 代替。
比如:
SELECT PUB_NAME
FROM PUBLISHERS
WHERE PUB_ID IN (SELECT PUB_ID FROM TITLES
WHERE TYPE = 'BUSINESS')
可以改写成:
SELECT DISTINCT A.PUB_NAME
FROM PUBLISHERS A
INNER JOIN TITLES B
ON B.TYPE = 'BUSINESS'
AND A.PUB_ID=B. PUB_ID
-- 有两个简单例子,以说明 “exists”和“in”的效率问题
1) select * from T1 where exists(select * from T2 where T1.a=T2.a) ;
-- T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高。
2) select * from T1 where T1.a in (select T2.a from T2) ;
-- T1数据量非常大而T2数据量小时,T1>>T2 时,2) 的查询效率高。
exists 用法:
-- 1)句中的“select * from T2 where T1.a=T2.a” 相当于一个关联表查询,
--
-- 相当于“select * from T1,T2 where T1.a=T2.a”;
“exists(xxx)”它只在乎括号里的数据能不能查找出来,是否存在这样的记录,如果存在,这1)句的where 条件成立。
in的用法:
2)句中的“select * from T1 where T1.a in (select T2.a from T2) ”,这里的“in”后面括号里的语句搜索出来的字段的内容一定要相对应,一般来说,T1和T2这两个表的a字段表达的意义应该是一样的,否则这样查没什么意义。
---sql语句查询中exists中为什么要用select 1?
select * from call_cdr_xz_200609 a where and a.ori_charge<>0 and exists(select 1 from special b where a.called_nbr like b.special_nbr||'%' and b.billing_state=0 )
--,好比这个,为什么要加select 1?括号中的条件字句不是恒成立的吗,求解
如果有查询结果,查询结果就会全部被1替代(当不需要知道结果是什么,只需要知道有没有结果的时候会这样用),可以提高语句的运行效率,在大数据量的情况下,提升效果非常明显