sql 相關高級查詢基礎語法

子查詢執行順序:執行計劃


SQL嵌套子查詢和相關子查詢的執行過程有什麼區別


SQLServer子查詢可以分爲 相關子查詢 和 嵌套子查詢 兩類。前提,假設Books表如下:類編號  圖書名         出版社               價格
--------------------------------------------------------
2      c#高級應用    聖通出版            23.00
2      Jsp開發應用   機械出版社          45.00
3      高等數學       濟南出版社          25.00
3      瘋狂英語       清華大學出版社     32.00   嵌套子查詢的執行不依賴與外部的查詢。執行過程:(1)執行子查詢,其結果不被顯示,而是傳遞給外部查詢,作爲外部查詢的條件使用。(2)執行外部查詢,並顯示整個結果。  嵌套子查詢一般可以分爲:返回 單值的子查詢 和 返回一個列表的子查詢 ,下面舉例說明:1.返回單值:  --查詢所有價格高於平均價格的圖書名,作者,出版社和價格。 USE tempdb
  GO

  SElECT 圖書名,作者,出版社,價格
  FROM Books
  WHERE 價格 >
  (
    SELECT AVG(價格)
    FROM Books
  )
  GO2.返回值列表--查詢所有借閱圖書的讀者信息 SElECT *
  FROM Readers
  WHERE 讀者編號 IN
  (
    SELECT 讀者編號
    FROM [Borrow History]
  )
  GO  相關子查詢的執行依賴於外部查詢。多數情況下是子查詢的WHERE子句中引用了外部查詢的表。執行過程:(1)從外層查詢中取出一個元組,將元組相關列的值傳給內層查詢。(2)執行內層查詢,得到子查詢操作的值。(3)外查詢根據子查詢返回的結果或結果集得到滿足條件的行。(4)然後外層查詢取出下一個元組重複做步驟1-3,直到外層的元組全部處理完畢。   下面舉例說明:--查詢Booka表中大於該類圖書價格平均值的圖書信息SElECT 圖書名,出版社,類編號,價格
  FROM Books As a
  WHERE 價格 >
  (
    SELECT AVG(價格)
    FROM Books AS b
    WHERE a.類編號=b.類編號
  )
  GO
與前面介紹過的子查詢不同,相關子查詢無法獨立於外部查詢而得到解決。該子查詢需要一個“類編號”的值。而這個值是個變量,隨SQLSever檢索Books表中的不同行而改變。下面詳細說明該查詢執行過程: 
   先將Books表中的第一條記錄的“類編號”的值“2”代入子查詢中,子查詢變爲:
      SELECT AVG(價格)
          FROM Books AS b
         WHERE b.類編號=2
  子查詢的結果爲該類圖書的平均價格,所以外部查詢變爲:
      SElECT 圖書名,出版社,類編號,價格
         FROM Books As a
       WHERE 價格 > 34
 如果WHERE條件爲True,則第一條結果包括在結果集中,則否不包括。對Books表中的所有行運行相同的過程,最後形成的結果集及最後返回結果。


高級查詢


注:外和內查詢可以從不同的表中取得數據。 

SELECT last_name, job_id, salary
FROM   employees
WHERE  salary = 
                (SELECT MIN(salary)
                 FROM   employees);
求所有人誰的工資最小。


SELECT   department_id, MIN(salary)
FROM     employees
GROUP BY department_id
HAVING   MIN(salary) >
                       (SELECT MIN(salary)
                        FROM   employees
                        WHERE  department_id = 50);
求每個部門的最小工資,但是要高於50號部門的工資。


SELECT employee_id, last_name
FROM   employees
WHERE  salary =
                (SELECT   MIN(salary)
                 FROM     employees
                 GROUP BY department_id);
問題出現在:單行子查詢返回了多個查詢值;
應改爲:
SELECT employee_id, last_name
FROM   employees
WHERE  salary in
                (SELECT   MIN(salary)
                 FROM     employees
                 GROUP BY department_id);

SELECT last_name, job_id
FROM   employees
WHERE  job_id =
                (SELECT job_id
                 FROM   employees
                 WHERE  last_name = 'Haas');
如果子查詢返回的是零值,不會對主程序造成影響;
如果子查詢返回的是空值,那麼會影響主程序的返回值;
SELECT employee_id,
  last_name
FROM employees
WHERE employee_id NOT IN
  (SELECT manager_id
   FROM employees)

SELECT employee_id,
  last_name
FROM employees
WHERE employee_id NOT IN
  (SELECT manager_id
   FROM employees
   WHERE manager_id IS NOT NULL)
放在select下的子查詢的返回值必須是一個具體值,
from後面也可以加子查詢;
having後面也可以加子查詢;
order by後面也可以;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章