1. 程式人生 > >SQL 筆記(二)

SQL 筆記(二)

mysql 其中 rod 順序 clas update 基礎教程 In block

本筆記整理自《SQL 基礎教程》、《MySQL 必知必會》和網上資料。個人筆記不保證正確。

一、復雜查詢

視圖

將 SELECT 查詢包裝成一個虛擬表,該虛擬表就被稱為視圖。(因為只是一個包裝,因此視圖的數據也會隨著原表的更新而更新)

  1. 用途:
    1. 簡化復雜的SQL查詢,用它替換子查詢,能降低查詢的嵌套深度。
    2. SELECT 查詢的重用,減少重復查詢。
    3. ...
  2. 創建視圖:

    CREATE VIEW <視圖名稱>
    (<視圖列名1>, <視圖列名2>... )
    AS
    <SELECT 語句>;
    其中 SELECT 的結果列和視圖列名一一對應。
  3. 視圖的限制
    1. 視圖的 SELECT 子句,不能包含 ORDER BY 子句。因為視圖也是表,而表是集合,它沒有順序。(也有些DB支持該用法,但不通用)
    2. 視圖的更新:只在很有限的條件下,才能在視圖上使用 INSERT/DELETE/UPDATE 這樣的變更數據的語句。(視圖應該只用於檢索,能不更新就不要更新它
  4. 刪除視圖:DROP VIEW <視圖名稱>;

子查詢

子查詢,其實就是一次性的視圖:

SELECT ...
    FROM (
        SELECT ...  -- 這就是一個子查詢:嵌套的 select 語句
    ) AS <別名>
    ...

上面的查詢的 FROM 子句中,給另一 SELECT 子句定義了一個別名,並將它作為了查詢對象。這就是一個子查詢。

子查詢不僅能用於 FROM,還能用在 WHERE 子句等很多地方。

關聯子查詢

即用到了外部數據的子查詢語句:

SELECT ...
    FROM product AS p1
    WHERE (
        SELECT ...
            FROM duck AS p2
            WHERE p1.price > p2.price   -- 這裏,內部子查詢訪問了外部查詢的表p1,因此是一個關聯子查詢。
    );

SQL 筆記(二)