什么是視圖:從SQL角度來看,視圖就是一張表
與表的區別是:是否保存了實際的數據
視圖的優點:
- 無需保存數據,節省儲存設備容量。
- 將select語句保存成視圖,就可以不用每次都從新書寫
注:應將經常使用的select保存成視圖
創建視圖
創建一個名為商品合計表的視圖
CREATE VIEW ProductSum (product_type, cnt_product)
AS
SELECT product_type, COUNT(*)
FROM Product
GROUP BY product_type;
創建視圖之后可以使用簡單的select語句查詢。
刪除視圖
使用DROP VIEW
多重視圖
視圖之前上再創建視圖,ProductSum為之前創建的視圖
CREATE VIEW ProductSumJim (product_type, cnt_product)
AS
SELECT product_type, cnt_product
FROM ProductSum
WHERE product_type = '辦公用品';
對多數DBMS來說,多重視圖會降低SQL的性能,所以應該盡量避免創建多重視圖。
視圖的限制
- 定義視圖不要使用ORDER BY子句,因為視圖和表一樣數據是沒有順序的
- 對視圖進行更新,不能使用(INSERT/DELETE/UPDATE)語句
視圖更新
有些視圖可以跟新,但必須滿足,select子句為單表,既沒有聚合又沒有結合的select語句
CREATE VIEW ProductJim (product_id, product_name, product_type, sale_price, purchase_price, regist_date)
AS
SELECT *
FROM Product
WHERE product_type = '辦公用品';
-- 向視圖插入數據(原表也插入了此條數據)
INSERT INTO ProductJim VALUES ('0009', '印章', '辦公用品', 95, 10, '2009-11-30');
子查詢(一次性視圖)
執行順序:內層的select子句——>外層的select子句
SELECT product_type, cnt_product
FROM (SELECT product_type, COUNT(*) AS cnt_product
FROM Product
GROUP BY product_type) AS ProductSum;
注:為子查詢設定名稱時,需要使用AS關鍵字,該關鍵字有時也可以省略。
標量子查詢:標量子查詢就是返回單一值(一行一列)的子查詢
1.在where子句中使用標量子查詢
*不能在where子句中使用聚合函數(下面這句是會報錯的!!!!)
SELECT * FROM product
WHERE sale_price > AVG(sale_price);
> 1111 - Invalid use of group function
計算平均銷售單價的標量子查詢(返回單一結果(一行一列))
select avg(sale_price) from product;
匯總:where中使用標量子查詢
SELECT * FROM product
WHERE sale_price > (select avg(sale_price) from product);
注:標量子查詢通常可以在任何使用單一值的位置都可以使用(select/group by/having...)
2.select中使用標量子查詢
-- 標量子查詢結束作為常數
SELECT product_id,
product_name,
sale_price,
(SELECT AVG(sale_price) FROM Product) AS avg_price
FROM Product;
3.having子句中使用標量子查詢
SELECT product_type, AVG(sale_price)
FROM Product
GROUP BY product_type
HAVING AVG(sale_price) > (SELECT AVG(sale_price) FROM Product);
關聯子查詢
在細分的組內進行比較時,需要使用關聯子查詢
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 ROUP BY product_type);