不相关子查询的工作方式是_相关子查询与非相关子查询

[

]

相关子查询与非相关子查询

数据库

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

,然后执行,如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值