[转]相关子查询与非相关子查询 - 鸥的日志 - 网易博客
来源:百度文库 编辑:神马文学网 时间:2024/04/29 08:00:42
[转]相关子查询与非相关子查询
数据库 2010-07-07 20:38:54 阅读124 评论0 字号:大中小 订阅
--用户CREATE TABLE USER
(
USERID INTEGER NOT NULL,---用户ID
COMPANYID INTEGER,---公司ID
TELNO VARCHAR(12)---用户电话
);
--公司
CREATE TABLE COMPANY
(
COMPANYID INTEGER NOT NULL,---公司ID
TELNO VARCHAR(12)---公司电话
);
大家对子查询都非常熟悉,可是我发现,很多人都不知道子查询有两种格式:一种是相关子查询(Correlated Sub-Query),另一种是非相关子查询(Uncorrelated Sub-Query)。下面我们通过一个例子来对比一下这两种子查询的不同。假设现在让你查询一下公司电话是 88888888 的用户有哪些,我们可以使用如下语句:
--非相关子查询(Uncorrelated Sub-Query)
SELECT * FROM USER WHERE COMPANYID IN
(
SELECT COMPANYID FROM COMPANY WHERE TELNO='88888888'
);
--相关子查询(Correlated Sub-Query)
SELECT * FROM USER AS U WHERE EXISTS
(
SELECT * FROM COMPANY AS C WHERE TELNO='88888888' AND U.COMPANYID=C.COMPANYID
);
以上两条语句的用作是相同的,对比后我们发现,相关子查询的子句(也就是括号中的语句:SELECT * FROM COMPANY AS C WHERE TELNO='88888888' AND U.COMPANYID=C.COMPANYID)依赖外部语句的条件,不能单独执行;而非相关子查询的子句是可以单独执行的。
就以上这个例子来说,我们使用相关子查询无论从性能和可读性都不如非相关子查询,下面我们来看一个使用非相关子查询办不到的例子,假设现在让你把用户电话更新成公司电话,怎么办?有些人可能采用如下的方式构造update sql,然后执行,如下:
SELECT 'UPDATE USER SET TELNO=''' || TELNO || ''' WHERE COMPANYID=' || CHAR(COMPANYID) || ';' FROM COMPANY
这么做是可以的,但是有点笨(当然,自己觉得挺聪明,因为他可能觉得自己使用了别人不常用或不知道的using sql to make sql),我们还有更好的方法,就是采用相关子查询,如下所示:
UPDATE USER AS U SET TELNO=
(
SELECT TELNO FROM COMPANY AS C WHERE U.COMPANYID=C.COMPANYID
);
[转]相关子查询与非相关子查询 - 鸥的日志 - 网易博客
“执子之手,与子偕老”的出处 - 青青子衿的日志 - 网易博客
域名解析相关查询命令
Oracle多表连接与子查询
业余时间与成才 - 十八子li的日志 - 网易博客
外贸知识及相关网址查询
厉以宁:非均衡的中国经济 - 十八子li的日志 - 网易博客
颜色代码查询器 - 小小的日志 - 网易博客
全国商务酒店查询大全 - 香儿的日志 - 网易博客
颜色代码查询器 - 小小的日志 - 网易博客
《民间偏方查询大全》 - 香儿的日志 - 网易博客
品牌酒店 查询大全 - 香儿的日志 - 网易博客
范文在线查询大全 - 香儿的日志 - 网易博客
全国酒店查询大全 - 香儿的日志 - 网易博客
国内大学查询大全 - 香儿的日志 - 网易博客
全国列车时刻查询大全 - 香儿的日志 - 网易博客
世界各国概况查询大全 - 香儿的日志 - 网易博客
全国酒店查询大全 - tianweimin135558的日志 - 网易博客1
全国酒店查询大全 - tianweimin135558的日志 - 网易博客2
《民间偏方查询大全》 - 香儿的日志 - 网易博客
《民间偏方查询大全》 - 香儿的日志 - 网易博客
国内大学查询大全 - 香儿的日志 - 网易博客
全国景点在线查询 - 老排长的日志 - 网易博客
与酶相关的曲线例析 - 潜龙惊天的日志 - 网易博客