PostgreSQL數(shù)據(jù)庫視圖及子查詢使用操作
視圖
表里面保存的是實(shí)際數(shù)據(jù),視圖里面保存的是SELECT語句(視圖本身不存儲(chǔ)數(shù)據(jù))。
從視圖中讀取數(shù)據(jù),此時(shí)視圖在內(nèi)部執(zhí)行SELECT語句,創(chuàng)建一張臨時(shí)表。
使用視圖的好處:其一,視圖不保存數(shù)據(jù),節(jié)省存儲(chǔ)設(shè)備容量。其二,將頻繁使用的SELECT語句保存成視圖,每次使用這些語句時(shí)候,不用重復(fù)書寫,只需調(diào)用視圖。其三,數(shù)據(jù)保存到表中,要顯式的執(zhí)行SQL更新語句才能更新數(shù)據(jù),而視圖中的數(shù)據(jù)會(huì)隨著原表的變化自動(dòng)更新。
創(chuàng)建視圖
格式:
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表中取數(shù)據(jù)。
并且,如果Product表中數(shù)據(jù)更新,視圖也自動(dòng)更新。
這是因?yàn)椋晥D就是保存好的SELECT語句。
SELECT product_type, cnt_product FROM ProductSum;
多重視圖:以視圖為基礎(chǔ)創(chuàng)建視圖。但是這樣會(huì)降低SQL性能。
CREATE VIEW ProductSumA (product_type, cnt_product) AS SELECT product_type, cnt_product FROM ProductSum WHERE product_type = '辦公用品';
定義視圖時(shí),不能用ORDER BY子句。因?yàn)橐晥D和表,數(shù)據(jù)行都沒有順序。
(PostgreSQL里面,定義視圖時(shí)候可以用ORDER BY子句,有些DBMS不行)
視圖更新:
如果定義視圖的SELECT語句滿足一些條件,視圖可以被更新。
SELECT子句沒用DISTINCT、FROM子句只有一張表、沒用GROUP BY、沒用HAVING。
通過匯總得到的數(shù)據(jù)無法更新,這是因?yàn)橐晥D和表要同時(shí)更新。
如果給上面的ProductSum中添加(‘食物’,3)的數(shù)據(jù),原表就需要增加三行種類為食物的數(shù)據(jù),但是這些數(shù)據(jù)我們都不知道,因此沒法更新表中的數(shù)據(jù)。
可以更新下面這樣,不通過匯總得到的視圖。
CREATE VIEW ProductA (product_id, product_name, product_type, sale_price, purchase_price, regist_date) AS SELECT * FROM Product WHERE product_type = '辦公用品';
向視圖插入數(shù)據(jù)。
INSERT INTO ProductA VALUES ('0009', '鉛筆', '辦公用品', 95, 10, '2222-10-1');
此時(shí)可看到,視圖和表都更新了。
刪除視圖:
格式
DROP VIEW 視圖名稱(<視圖列名1>,<視圖列名2>,...)
例子
DROP VIEW ProductSum;
然后報(bào)錯(cuò)
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.
這是因?yàn)榍懊嬉訮roductSum為基礎(chǔ),創(chuàng)建了一個(gè)ProductSumA視圖。
可以像下面這樣刪除ProductSum和與之關(guān)聯(lián)的視圖。
DROP VIEW ProductSum CASCADE;
子查詢
子查詢,相當(dāng)于一次性視圖。
定義視圖ProductSum
CREATE VIEW ProductSum (product_type, cnt_product) AS SELECT product_type, COUNT(*) FROM Product GROUP BY product_type;
子查詢:將定義視圖的SELECT語句直接用到FROM子句里面。
AS ProductSum,ProductSum是子查詢的名稱。執(zhí)行完外邊的SELECT語句,子查詢就消失了。
下面代碼,執(zhí)行順序,先是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發(fā)現(xiàn),ProductSum已經(jīng)不存在了。由此看出,子查詢是一次性的,并不像視圖一樣保存到硬盤里面。
在子查詢的FROM子句里面,可以繼續(xù)使用子查詢。
下面就是把ProductSum里面cnt_product = 4的數(shù)據(jù)選出來了。
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;
標(biāo)量子查詢scalar subquery,返回表中某一行某一列的值(單一值)的子查詢。
可以在WHERE子句中使用標(biāo)量子查詢。
由于WHERE子句中無法使用聚合函數(shù),像下面的語句就是錯(cuò)誤的。
SELECT product_id, product_name, sale_price FROM Product WHERE sale_price > AVG(sale_price);
可以通過下面這樣去實(shí)現(xiàn)。
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);
在任何使用單一值的地方,都可以使用標(biāo)量子查詢。
在SELECT子句中使用標(biāo)量子查詢:
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子句中使用標(biāo)量子查詢:
不同商品種類的平均銷售單價(jià)與全部商品的銷售單價(jià)相比。
SELECT product_type, AVG(sale_price) FROM Product GROUP BY product_type HAVING AVG(sale_price) > (SELECT AVG(sale_price) FROM Product);
標(biāo)量子查詢不能返回多行結(jié)果,如果返回多行結(jié)果,那就是一個(gè)普通的子查詢,不能用到需要單一輸入值的地方了。
關(guān)聯(lián)子查詢
現(xiàn)在要選取各個(gè)商品種類里面,高于該商品種類平均銷售價(jià)的商品。
按照商品種類計(jì)算平均價(jià)格:
SELECT AVG(sale_price) FROM Product GROUP BY product_type;
因?yàn)橛腥N商品,上面這個(gè)查詢返回三個(gè)結(jié)果。
那么就不能用下面這種方法了。因?yàn)樽硬樵儾皇菢?biāo)量子查詢,不能在WHERE子句里面用。
SELECT product_id, product_name, sale_price FROM Product WHERE sale_price > (SELECT AVG(sale_price) FROM Product GROUP BY product_type);
在細(xì)分的組內(nèi)進(jìn)行比較的時(shí)候,用到關(guān)聯(lián)子查詢。
在子查詢里面添加了一個(gè)WHERE子句。目的是在同一商品種類中對(duì)各商品銷售單價(jià)和平均單價(jià)比較。
由于比較對(duì)象是同一個(gè)Product表,所以用了P1、P2兩個(gè)別名。
使用關(guān)聯(lián)子查詢,用<表名>.<列名>形式,限定product_type,對(duì)平均單價(jià)比較。
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,也能得到相同結(jié)果:
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數(shù)據(jù)庫視圖及子查詢使用操作的詳細(xì)內(nèi)容,更多關(guān)于PostgreSQL數(shù)據(jù)庫的視圖子查詢的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
psql 執(zhí)行文件 permission denied的解決
這篇文章主要介紹了psql 執(zhí)行文件 permission denied的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01PostgreSQL教程(四):數(shù)據(jù)類型詳解
這篇文章主要介紹了PostgreSQL教程(四):數(shù)據(jù)類型詳解,本文講解了數(shù)值類型、字符類型、布爾類型、位串類型、數(shù)組、復(fù)合類型等數(shù)據(jù)類型,需要的朋友可以參考下2015-05-05Mac系統(tǒng)重置PostgreSQL密碼的方法示例代碼
PostgreSQL 是一個(gè)免費(fèi)的對(duì)象-關(guān)系數(shù)據(jù)庫服務(wù)器(ORDBMS),在靈活的BSD許可證下發(fā)行。這篇文章主要介紹了Mac系統(tǒng)重置PostgreSQL密碼的方法示例代碼,需要的朋友可以參考下2020-02-02postgresql varchar字段regexp_replace正則替換操作
這篇文章主要介紹了postgresql varchar字段regexp_replace正則替換操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01PostgreSQL ERROR: invalid escape string 解決辦法
這篇文章主要介紹了PostgreSQL ERROR: invalid escape string 解決辦法,本文環(huán)境是JDBC+PostgreSQL,需要的朋友可以參考下2014-07-07PostgreSQL使用MySQL外表的步驟詳解(mysql_fdw)
這篇文章主要介紹了PostgreSQL使用MySQL外表的步驟(mysql_fdw),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01PostgreSQL利用遞歸優(yōu)化求稀疏列唯一值的方法
這篇文章主要介紹了PostgreSQL利用遞歸優(yōu)化求稀疏列唯一值的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01在postgresql中運(yùn)行sql文件并導(dǎo)出結(jié)果的操作
這篇文章主要介紹了在postgresql中運(yùn)行sql文件并導(dǎo)出結(jié)果的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01Linux系統(tǒng)安裝PostgreSQL數(shù)據(jù)庫及配置的詳細(xì)過程
這篇文章主要給大家介紹了關(guān)于Linux系統(tǒng)安裝PostgreSQL數(shù)據(jù)庫及配置的詳細(xì)過程,PgSQL(全稱PostgreSQL)是一個(gè)功能強(qiáng)大的開源對(duì)象-關(guān)系型數(shù)據(jù)庫系統(tǒng),結(jié)合了許多安全存儲(chǔ)和擴(kuò)展最復(fù)雜數(shù)據(jù)工作負(fù)載的功能,需要的朋友可以參考下2023-12-12