前段時間有乙個相關子查詢的sql語句,看不太懂他是如何執行的,為什麼會出現那個結果。著實糾結了一把。下面來講一下非相關子查詢和相關子查詢的執行過程是怎樣的。
先看乙個非相關子查詢到sql語句。
需求:查詢學生表student和學生成績表grade中成績為70分的學生的基本資訊。
select t.sno,t.sname,t.sage,t.sgentle,t.sbirth,t.sdept from student t where t.sno in (select f.sno from garde f where f.score=70)
這個sql語句的執行時是簡單的,
1、在grade表中找出成績為70的學生學號sno,再將該學號返回到父查詢作為where子句的條件。
2、在student表中找到該學號學生的其他基本資訊。
所謂相關子查詢,是指求解相關子查詢不能像求解普通子查詢那樣,一次將子查詢求解出來,然後求解父查詢。相關子查詢的內層查詢由於與外層查詢有關,因此必須反覆求值。
下面看相關子查詢的sql語句。
需求:在學生表student和學生成績表grade找出參加了「計算機基礎」課程並且分數在80分以上的所有學生資訊。
select t.sno,t.sname,t.sage,t.sgentle,t.sbirth,sdept from student t where
80<=(select f.score from grade f where f.sno=t.sno and f.cname='計算機基礎')
該子查詢的執行流程:
1、 先從父查詢的student表中取出第一條記錄的sno值,進入子查詢中,比較其where子句的條件「where f.sno=t.sno and f.cname=』計算機基礎』」,符合則返回score成績。
2、 返回父查詢,判斷父查詢的where子句條件80<=返回的score,如果條件為true,則返回第1條記錄。
3、 從父查詢的student表中取出第2條資料,重複上述操作,直到所有父查詢中的表中記錄取完為止。
對比這兩個查詢的sql執行過程可以看出,相關子查詢和非相關子查詢的不同點在於,相關子查詢依賴於父查詢,父查詢和子查詢是有聯絡的,尤其在子查詢的where語句中更是如此。明白了他們的執行過程,再去看相關子查詢的**,一下子就明白了。
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...
Oracle 相關子查詢
start 我們先來看兩個表的定義 使用者 create table employee userid number 9,0 not null,使用者id companyid number 9,0 公司id telno varchar2 12 使用者 alter table employee add ...