視圖和子查詢


什么是視圖:從SQL角度來看,視圖就是一張表
與表的區別是:是否保存了實際的數據

視圖的優點:

  1. 無需保存數據,節省儲存設備容量。
  2. 將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的性能,所以應該盡量避免創建多重視圖。

視圖的限制
  1. 定義視圖不要使用ORDER BY子句,因為視圖和表一樣數據是沒有順序的
  2. 對視圖進行更新,不能使用(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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM