相关子查询 和 非相关子查询

我们先来看两个表的定义:

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,然后执行,如下:

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
);

以上就是相关子查询的一种用途,还有好多其他用途等待你去挖掘。

转载来自

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值