天天看點

SQL基礎整理(五)關于視圖,子查詢和關聯子查詢

一.視圖

1. 首先,什麼是視圖,通俗的講 在實際的資料庫中,每一張表會有很多個字段,但是不同的使用者隻想了解自己想了解的字段,對于其他的字段并不感興趣,這時候使用視圖可以把自己想要的一些字段再封裝成一張表,這樣每次特定使用者隻需要通路這張封裝成的表即可了解自己想知道的字段。    再說的專業一點,視圖是對SQL語句的封裝,這個說法在下面進行解釋

2. 為什麼說 視圖是對SQL語句的封裝呢?這是因為,我們在資料庫中建立的一張張表會實際存儲到儲存設備上,比如磁盤,我們每次使用select語句,實際上就是在通路記憶體中的表,但是視圖并不是,視圖儲存的并不是資料,而是select語句,每次從視圖中讀取資料的時候,相當于是在内部執行select語句并建立出一張臨時表

3.  視圖的優點:(1)視圖不需要儲存實際資料,節省存儲空間(2)可以将頻繁使用的select語句儲存成視圖,這樣就不用每次都書寫複雜的SQL了

那麼我們通過實際的例子進行說明關于視圖的一些操作,下圖是我們用到的叫做product的表

SQL基礎整理(五)關于視圖,子查詢和關聯子查詢

4. 視圖的建立

CREATE VIEW ProductSum(product_type,product_sum) 建立一個叫做ProductSum的視圖,其中有兩個字段

AS                                                                                 必須寫的關鍵字

select product_type,COUNT(*)                                        從Product中抽取出兩個字段

from product

GROUP BY product_type;

注意事項:(1)AS必須寫 (2)在從其他表抽取資料構成視圖的時候可以使用where ,group by ,having

5. 視圖的查詢----》同查表一緻

select * from ProductSum; 查詢結果如下

SQL基礎整理(五)關于視圖,子查詢和關聯子查詢

在執行這條查詢時,資料庫會先執行定義視圖的select語句,再執行select * from

6.  視圖的限制:(1)不要使用order by定義視圖 

    (2)對視圖進行更新:通過上面的說明,我們知道,視圖實際上是對SQL語句的封裝,以上面的例子來說,ProductSum來自于表product,那麼當表中的資料發生變化時,ProductSum中的資料也會跟着發生變化,因為視圖是根據表通過select語句得到的   那麼現在進入正題,如果我們對視圖使用insert,update,delete語句時會發生什麼呢 實際上,對視圖進行操作時會連帶着更新相應的表,但是會對生成視圖的select語句有一定的限制  a. 未使用distinct 去重   b.from中隻有一張表   c.未使用group by 以及having子句

7. 視圖的删除  --》drop view ProductSum;

二.子查詢

 1.  首先我們需要知道,什麼是子查詢呢,子查詢就是将用來定義視圖的select語句直接用于from語句中,通過下面的例子 進行說明

select * from ProductSum;結果是

SQL基礎整理(五)關于視圖,子查詢和關聯子查詢

當我們使用子查詢的時候

SQL基礎整理(五)關于視圖,子查詢和關聯子查詢
SQL基礎整理(五)關于視圖,子查詢和關聯子查詢

我們把用作定義視圖使用的select語句,直接放到from 語句 中 并且通過as關鍵字 指定子查詢的名稱,但由于該名稱是一次性的,是以當本次查詢結束之後立刻消失不會儲存起來

三.标量子查詢

1. 标量子查詢就是 傳回值隻能有一行一列的子查詢

2. 我們想查詢銷售單價大于全部商品平均售價的商品 

select product_id,product_name,sale_price

where sale_price>(select AVG(sale_price )

                     from product);   結果如下

SQL基礎整理(五)關于視圖,子查詢和關聯子查詢

在執行這條語句時,資料庫會先執行 select AVG(sale_price )  from product傳回所有商品的平均價格 2097.5

然後在執行剩下的SQL語句時 實際上就成了 執行 

select product_id,product_name,sale_price  

from product  

where sale_price>2097.5

注意事項:(1)标量子查詢絕對不能傳回多個結果 (2)标量子查詢可以出現在select,group by,having ,ordder by子句中

四.關聯子查詢

1. 在這裡 我們先抛出一個問題,在上面我們提到了 查詢售價高于所有商品平均價格的商品資訊,那麼如果我們想要了解到各個商品種類中高于該商品種類的平均銷售單價的商品資訊

2. 這時候就需要關聯子查詢了

select product_type,product_name,sale_price

from product as p1

where sale_price>(select AVG(sale_price) 

                   from product as p2

                    where p1.product_type=p2.product_type

                      GROUP BY product_type);

SQL基礎整理(五)關于視圖,子查詢和關聯子查詢

注意事項:這裡起到關鍵作用的就是在子查詢中添加的where子句,該條件的意思時,在同一商品種類中對各個商品的銷售單價和平均單價進行比較。這次作為比較對象的都是product表,是以進行了as區分, 在細分的組内進行比較時,需要使用關聯子查詢