[
转
]
相关子查询与非相关子查询
数据库
2010-07-07 20:38:54
阅读
214
评论
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
);
以上两条语句的用作是相同的
,
对比后我们发现
,
相关子查询的子句
(也就是括号中的语句
:
ELECT * FROM
COMPANY AS C WHERE TELNO='88888888' AND U.COMPANYID=C.COMPANYID
)依赖外部语句的
条件,不能单独执行;而非相关子查询的子句是可以单独执行的。
就以上这个例子来说,我们使用相关子查询无论从性能和可读性都不如非相关子查询,下面我们来看一个
使用非相关子查询办不到的例子,假设现在让你把用户电话更新成公司电话,怎么办?有些人可能采用如
下的方式构造
update sql
,然后执行,如下: