1. 程式人生 > >非相關子查詢和相關子查詢執行過程詳解

非相關子查詢和相關子查詢執行過程詳解

前段時間有一個相關子查詢的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語句中更是如此。

明白了他們的執行過程,再去看相關子查詢的程式碼,一下子就明白了。




相關推薦

關子查詢關子查詢執行過程

前段時間有一個相關子查詢的SQL語句,看不太懂他是如何執行的,為什麼會出現那個結果。著實糾結了一把。下面來講一下非相關子查詢和相關子查詢的執行過程是怎樣的。 非相關子查詢 先看一個非相關子查詢到sql

H 264的兩個概念 DC係數AC係數 MV預測過程(附圖)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Java編譯程式執行過程

java整個編譯以及執行的過程相當繁瑣,我就舉一個簡單的例子說明: 編譯原理簡單過程:詞法分析 --> 語法分析 --> 語義分析和中間程式碼生成 --> 優化 --> 目的碼生成 Java程式從原始檔建立到程式執行要經過兩大步驟: 1、Java檔案會由

Spring 的監聽事件 ApplicationListener ApplicationEvent 用法及呼叫過程

ApplicationListener呼叫過程詳解: https://blog.csdn.net/u014263388/article/details/78996509 使用場景 在一些業務場景中,當容器初始化完成之後,需要處理一些操作,比如一些資料的載入、初始化快取、特定任務的註冊等等。這

.net/c#中棧堆的區別及程式碼在棧堆中的執行流程

在.NET framework環境下,當我們的程式碼執行時,記憶體中有兩個地方用來儲存這些程式碼。假如你不曾瞭解,那就讓我來給你介紹棧(Stack)和堆(Heap)。棧和堆都用來幫助我們執行程式碼的,它們駐留在機器記憶體中,且包含所有程式碼執行所需要的資訊。 棧負責儲存我們的程式碼執行(或呼叫)路徑,而

mysql學習筆記--巢狀子查詢關子查詢

子查詢:巢狀在其他查詢中的查詢稱之。   子查詢又稱內部,而包含子查詢的語句稱之外部查詢(又稱主查詢)。   所有的子查詢可以分為兩類,即相關子查詢和非相關子查詢   1. 非相關子查詢是獨立於外部查詢的子查詢,子查詢總共執行一次,

【mysql】SQL巢狀子查詢關子查詢執行過程有什麼區別(推薦)

SQLServer子查詢可以分為 相關子查詢 和 巢狀子查詢 兩類。前提, 假設Books表如下: 類編號 圖書名 出版社 價格 -----------------------------------------------

數據庫基礎(2):簡單查詢連接查詢

輸出 bsp 排列 原理 max 數學 mar exists credit 1. 實驗內容   建的數據庫如下: 1 CREATE TABLE Depts 2 ( 3 Dno CHAR(20) PRIMARY KEY, 4 Dname CHAR(2

數據庫之聯合查詢連接查詢

xiang target ble tail bsp 清晰 第一個 聯合 select語句 http://blog.csdn.net/memgxingfeixiang/article/details/52765208 1.JOIN和UNION區別join 是兩張表做交連後裏面

Oracle子查詢多表查詢

左外連接 查詢 sele 多表查詢 字段 ora 需要 avg lar 多表查詢需要用到表的連接 連接可以分為:(自行百度)   交叉連接(數字邏輯的笛卡爾積,不做解釋)     等值連接       例如:select * from t_a, t_b where t_a.

sql分組查詢連接查詢

avi rop select 連接 where子句 統計 表連接 聚合 where 分組查詢select 查詢信息 from 表名where 條件group by 按照列分組(可多個 ,隔開)order by 排序方式(查詢信息如果列名和聚合函數同時出現,要麽在聚合函數中出

向上查詢父節點遞歸查詢向下查詢子節點遞歸查詢函數

層級關系 AR 遞歸查詢 sta mpc tid 時間 獲取 由於 本文為博主原創,未經允許不得轉載: 由於在項目中用到了向上查詢父節點的遞歸查詢和向下查詢子節點查詢的遞歸查詢,由於在實現過程中,寫遞歸查詢的sql函數 花費了較長的時間,所以在此總結一下,兩種遞歸查詢的函數

Oracle子查詢相關內容(包含TOP-N查詢分頁查詢)

職位 oracle子查詢 員工 having 信息 不同 group 最大 mount 本節介紹Oracle子查詢的相關內容: 實例用到的數據為oracle中scott用戶下的emp員工表,dept部門表,數據如下: 一、子查詢 1、概念:嵌入在一個查詢中的另一個

mysql的單表查詢連表查詢

1,新建表和插入資料 建立表,設定欄位的約束條件 create table employee( id int primary key auto_increment, name varchar(20) not null, sex enum('male','female') no

java順序查詢二分法查詢

1, 順序查詢 2, 二分法查詢   一、順序查詢的基本思想: 從表的一端開始,順序掃描表,依次將掃描到的結點關鍵字和給定值(假定為a)相比較,若當前結點關鍵字與a相等,則查詢成功;若掃描結束後,仍未找到關鍵字等於a的結點,則查詢失敗。   說白了就是,從頭

MySQL 子查詢表連線查詢

SELECT * FROM grade; SELECT * FROM result; SELECT * FROM student; SELECT * FROM subject; SELECT s.StudentNo ,s.StudentName ,j.SubjectName ,r.Stude

折半查詢差值查詢

都用於有序陣列,下面假設單增 折半查詢思想簡單,直接寫了 public static int BinarySearch(int a[],int k) { int l=0; int r=a.length-1; while(l<=r) { int m=(l+r)

mysql之單表查詢多表查詢

註釋:單表查詢就是記錄的詳細操作(增刪查,改的需求以及方法比較多) 一,複製表(索引和自增的屬性不能複製,需要自己新增) 拷貝結構以及資料 create table 新表名 select * from 舊錶名; 例:create table copy_customer

對比PHP對MySQL的緩衝查詢無緩衝查詢

關於緩衝查詢和無緩衝查詢 MySQL的客戶端有兩種型別的查詢:緩衝查詢:將接收查詢的結果並把他們儲存在客戶端的快取中,而且接下來獲取行記錄的請求僅僅從本地內獲取。 (1)優點:可以在結果集中自由地移動“當前行”的指標,這樣很容易找到,因為結果是存在客戶端的。 (2)缺點:需要

Activiti工作流學習筆記入門(四)——流程例項的構建、判斷狀態、歷史流程例項查詢歷史活動查詢

第一節:構建學生請假審批流程 第二節:執行物件概念 第三節:判斷流程例項狀態 第四節:歷史流程例項查詢 第五節:歷史活動查詢 package com.java1234.activiti.flow; import java.util.List; import or