Oracle 相關子查詢

2021-07-03 09:19:03 字數 1986 閱讀 4783

-- start

我們先來看兩個表的定義:

--使用者

create table employee

(userid number(9,0) not null,---使用者id

companyid number(9,0),---公司id

telno varchar2(12)---使用者**

);alter table "employee" add constraint "pk_employee" primary key ("userid");

--公司

create table company

(companyid number(9,0) not null,---公司id

telno varchar2(12)---公司**

);alter table "company" add constraint "pk_company" primary key ("companyid");

大家對子查詢都非常熟悉,可是我發現,很多人都不知道子查詢有兩種格式:一種是相關子查詢(correlated sub-query),另一種是非相關子查詢(uncorrelated sub-query)。下面我們通過乙個例子來對比一下這兩種子查詢的不同。假設現在讓你查詢一下公司**是88888888 的使用者有哪些,我們可以使用如下語句:

--非相關子查詢(uncorrelated sub-query)

select * from employee where companyid in

(select companyid from company where telno='88888888'

);--相關子查詢(correlated sub-query)

select * from employee u where exists

(select * from company c where telno='88888888' and u.companyid=c.companyid

);

以上兩條語句的用作是相同的,對比後我們發現,相關子查詢的子句(也就是括號中的語句:elect * from company c where telno='88888888' and u.companyid=c.companyid)依賴外部語句的條件,不能單獨執行;而非相關子查詢的子句是可以單獨執行的。就以上這個例子來說,我們使用相關子查詢無論從效能和可讀性都不如非相關子查詢,下面我們來看乙個使用非相關子查詢辦不到的例子,假設現在讓你把使用者**更新成公司**,怎麼辦?有些人可能採用如下的方式構造update sql,然後執行,如下:

select 'update employee set telno=''' || telno || ''' where companyid=' || char(companyid) || ';' from company

update employee u set telno=

(select telno from company c where u.companyid=c.companyid

);

怎麼樣?是不是感覺自己很厲害,有沒有更簡單的辦法?看看下面的語句吧。

update 

(select u.telno employee_telno, c.telno company_telno from employee u, company c where u.companyid=c.companyid

)set employee_telno = company_telno;

--更多參見:oracle sql 精萃

-- last edited on 2015-06-19

-- created by shangbo on 2015-06-19

-- end

oracle高階查詢之相關子查詢

在子查詢中一般先執行子查詢,在執行住查詢,但是相關子查詢列外 相關子查詢就是把主查詢的值作為引數傳遞給子查詢 例子 找到員工表中薪水大於平均薪水員工 方法一 select empno,ename,sal,select g sal from emp where deptno e.deptno gsal...

mysql 非相關子查詢 相關子查詢一

1 子查詢在查詢語句中可出現的位置 2 子查詢的分類 3 子查詢的優化的思路 3.1 做子查詢優化的原因 3.2 子查詢優化技術 3.3 子查詢展開 4 最常見的子查詢型別的優化 4.1 in型別 4.2 all any some型別 4.3 exists型別 5 例項 二 相關子查詢和非相關子查詢...

什麼是 相關子查詢 和 非相關子查詢

先執行主查詢,再針對主查詢返回的每一行資料執行子查詢,如果子查詢能夠返回行,則這條記錄就保留,否則就不保留。舉例1 相關子查詢查詢 查詢所有是領導的員工資訊 select from emp e1 where exists select from emp e2 where e1.empno e2.mg...