子查詢

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

2. 爲什麼說 視圖是對SQL語句的封裝呢?這是因爲,我們在數據庫中建立的一張張表會實際存儲到存儲設備上,比如磁盤,我們每次使用select語句,實際上就是在訪問內存中的表,但是視圖並不是,視圖保存的並不是數據,而是select語句,每次從視圖中讀取數據的時候,相當於是在內部執行select語句並創建出一張臨時表

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

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

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; 查詢結果如下

在執行這條查詢時,數據庫會先執行定義視圖的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;結果是

當我們使用子查詢的時候

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

 

三.標量子查詢
1. 標量子查詢就是 返回值只能有一行一列的子查詢

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

select product_id,product_name,sale_price
from product
where sale_price>(select AVG(sale_price )

                     from product);   結果如下

在執行這條語句時,數據庫會先執行 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);

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

 


--------------------- 
作者:巴塞羅那的風 
來源:CSDN 
原文:https://blog.csdn.net/qq_36437446/article/details/80605708 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

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