<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
表裡面儲存的是實際資料,檢視裡面儲存的是SELECT語句(檢視本身不儲存資料)。
從檢視中讀取資料,此時檢視在內部執行SELECT語句,建立一張臨時表。
使用檢視的好處:其一,檢視不儲存資料,節省儲存裝置容量。其二,將頻繁使用的SELECT語句儲存成檢視,每次使用這些語句時候,不用重複書寫,只需呼叫檢視。其三,資料儲存到表中,要顯式的執行SQL更新語句才能更新資料,而檢視中的資料會隨著原表的變化自動更新。
格式:
CREATE VIEW 檢視名稱(<檢視列名1>,<檢視列名2>,...) AS <SELECT語句>
例子:
CREATE VIEW ProductSum (product_type, cnt_product) AS SELECT product_type, COUNT(*) FROM Product GROUP BY product_type;
可見,如果使用檢視,不用每次都寫GROUP BY等一些語句從Product表中取資料。
並且,如果Product表中資料更新,檢視也自動更新。
這是因為,檢視就是儲存好的SELECT語句。
SELECT product_type, cnt_product FROM ProductSum;
多重檢視:以檢視為基礎建立檢視。但是這樣會降低SQL效能。
CREATE VIEW ProductSumA (product_type, cnt_product) AS SELECT product_type, cnt_product FROM ProductSum WHERE product_type = '辦公用品';
定義檢視時,不能用ORDER BY子句。因為檢視和表,資料行都沒有順序。
(PostgreSQL裡面,定義檢視時候可以用ORDER BY子句,有些DBMS不行)
如果定義檢視的SELECT語句滿足一些條件,檢視可以被更新。
SELECT子句沒用DISTINCT、FROM子句只有一張表、沒用GROUP BY、沒用HAVING。
通過彙總得到的資料無法更新,這是因為檢視和表要同時更新。
如果給上面的ProductSum中新增(‘食物’,3)的資料,原表就需要增加三行種類為食物的資料,但是這些資料我們都不知道,因此沒法更新表中的資料。
可以更新下面這樣,不通過彙總得到的檢視。
CREATE VIEW ProductA (product_id, product_name, product_type, sale_price, purchase_price, regist_date) AS SELECT * FROM Product WHERE product_type = '辦公用品';
向檢視插入資料。
INSERT INTO ProductA VALUES ('0009', '鉛筆', '辦公用品', 95, 10, '2222-10-1');
此時可看到,檢視和表都更新了。
格式
DROP VIEW 檢視名稱(<檢視列名1>,<檢視列名2>,...)
例子
DROP VIEW ProductSum;
然後報錯
ERROR: cannot drop view productsum because other objects depend on it 描述: view productsuma depends on view productsum 提示: Use DROP ... CASCADE to drop the dependent objects too.
這是因為前面以ProductSum為基礎,建立了一個ProductSumA檢視。
可以像下面這樣刪除ProductSum和與之關聯的檢視。
DROP VIEW ProductSum CASCADE;
子查詢,相當於一次性檢視。
定義檢視ProductSum
CREATE VIEW ProductSum (product_type, cnt_product) AS SELECT product_type, COUNT(*) FROM Product GROUP BY product_type;
子查詢:將定義檢視的SELECT語句直接用到FROM子句裡面。
AS ProductSum,ProductSum是子查詢的名稱。執行完外邊的SELECT語句,子查詢就消失了。
下面程式碼,執行順序,先是FROM子句裡面的SELECT語句,然後是外邊的SELECT語句。
SELECT product_type, cnt_product FROM (SELECT product_type, COUNT(*) AS cnt_product FROM Product GROUP BY product_type) AS ProductSum;
下面再次檢視ProductSum發現,ProductSum已經不存在了。由此看出,子查詢是一次性的,並不像檢視一樣儲存到硬碟裡面。
在子查詢的FROM子句裡面,可以繼續使用子查詢。
下面就是把ProductSum裡面cnt_product = 4的資料選出來了。
SELECT product_type, cnt_product FROM (SELECT * FROM (SELECT product_type, COUNT(*) AS cnt_product FROM Product GROUP BY product_type) AS ProductSum WHERE cnt_product = 4) AS ProductSum2;
標量子查詢scalar subquery,返回表中某一行某一列的值(單一值)的子查詢。
可以在WHERE子句中使用標量子查詢。
由於WHERE子句中無法使用聚合函數,像下面的語句就是錯誤的。
SELECT product_id, product_name, sale_price FROM Product WHERE sale_price > AVG(sale_price);
可以通過下面這樣去實現。
SELECT product_id, product_name, sale_price FROM Product WHERE sale_price > (SELECT AVG(sale_price) FROM Product);SELECT product_id, product_name, sale_price FROM Product WHERE sale_price > (SELECT AVG(sale_price) FROM Product);
在任何使用單一值的地方,都可以使用標量子查詢。
在SELECT子句中使用標量子查詢:
SELECT product_id, product_name, sale_price, (SELECT AVG(sale_price) FROM Product) AS avg_price FROM Product;SELECT product_id, product_name, sale_price, (SELECT AVG(sale_price) FROM Product) AS avg_price FROM Product;
在HAVING子句中使用標量子查詢:
不同商品種類的平均銷售單價與全部商品的銷售單價相比。
SELECT product_type, AVG(sale_price) FROM Product GROUP BY product_type HAVING AVG(sale_price) > (SELECT AVG(sale_price) FROM Product);
標量子查詢不能返回多行結果,如果返回多行結果,那就是一個普通的子查詢,不能用到需要單一輸入值的地方了。
現在要選取各個商品種類裡面,高於該商品種類平均銷售價的商品。
按照商品種類計算平均價格:
SELECT AVG(sale_price) FROM Product GROUP BY product_type;
因為有三種商品,上面這個查詢返回三個結果。
那麼就不能用下面這種方法了。因為子查詢不是標量子查詢,不能在WHERE子句裡面用。
SELECT product_id, product_name, sale_price FROM Product WHERE sale_price > (SELECT AVG(sale_price) FROM Product GROUP BY product_type);
在細分的組內進行比較的時候,用到關聯子查詢。
在子查詢裡面新增了一個WHERE子句。目的是在同一商品種類中對各商品銷售單價和平均單價比較。
由於比較物件是同一個Product表,所以用了P1、P2兩個別名。
使用關聯子查詢,用<表名>.<列名>形式,限定product_type,對平均單價比較。
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);
而且,不加GROUP BY,也能得到相同結果:
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);
以上就是PostgreSQL資料庫檢視及子查詢使用操作的詳細內容,更多關於PostgreSQL資料庫的檢視子查詢的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45