PostgreSQL基礎知識(四)
34、子查詢:子查詢就是講用來定義檢視的SELECT語句直接用於FROM子句中。但是子查詢是一次性的,因此不會像檢視那樣儲存在儲存介質當中,而是在執行完SELECT之後就消失了。
之前我們定義的檢視的語句是這樣的。
CREATE VIEW ProductSum (product_type,cnt_product)
AS SELECT product_type ,COUNT(*) FROM 表名 GROUP BY product_type ;
然後使用這個檢視的語句是這樣的。 SELECT product_type,cnt_product FROM ProductSum ;
這是對應的子查詢的語句,SELECT product_type,cnt_product FROM( SELECT product_type ,COUNT(*) FROM 表名 GROUP BY product_type)AS ProductSum ;它和上面執行檢視語句的結果是一樣的,其實就是定義檢視的SELECT語句直接用於FROM子句中。AS ProductSum 就是這個子查詢的名稱(在這個例子中和檢視的名字是一樣的),執行完SELECT之後就消失了。
另外要注意的是子查詢中是SELECT語句的巢狀,執行順序是 先內層SELECT 再外層SELECT 。在原則上子查詢的層數是沒有限制的,但是隨著巢狀層數的增加,SQL語句會變得越來越難讀懂,而且效能也會變差,所以儘量避免多次巢狀的子查詢。
35、標量子查詢 :就是返回單一值的子查詢。(必須而且只能返回1行1列的結果!),由於返回的是單一的值,所以標量子查詢幾乎在所有的地方都可以使用。
例如:SELECT procuct_id,product_name,sale_price FROM Product WHERE sale_price > (SELECT AVG(sale_price) FROM Product ); >號後面的即為 標量子查詢。
36、關聯子查詢
上一個例子中的SQL語句 :SELECT procuct_id,product_name,sale_price FROM Product WHERE sale_price > (SELECT AVG(sale_price) FROM Product ); 我們通過這個語句可以查詢出來,表裡面大於 所有商品售價平均值的東西。但是我們現在有了新的需求,假如表裡面有3組商品, 每組商品有若干個,我們要求出每組裡面哪些商品大於了該組的平均售價。如果是這樣寫的話,就會發生錯誤。SELECT procuct_id,product_name,sale_price FROM Product WHERE sale_price > (SELECT AVG(sale_price) FROM Product GROUP BY product_type ); 錯誤的原因就是:後面不是標量子查詢,它返回的值有3個。可是這3個值,都是我們想用的值,那麼SQL語句該怎麼寫呢?
SELECT procuct_id,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 P1.product_type = P2.product_type 這句話就是關鍵。因為2次都是查詢的一個表,P1 ,P2只是為了區分使用的別名。
關聯子查詢3個知識點 :1. 對細分的組內進行比較時,用關聯子查詢。 2. 關聯子查詢可以對錶中的資料進行切分 3. 結合的條件一定要寫在子查詢中。
37、函式 。 函式的種類很多,大致分為算數函式,字串函式,日期函式,轉換函式和聚合函式。這裡介紹常用的函式。
算數函式:
37.1 絕對值函式。ABS(數值)
37.2 求餘函式 。 MOD(被除數,除數)
37.3 四捨五入函式。 (物件數值,保留的小數的位數)
字串函式:
字串拼接函式。 字串1 | | 字串2
求字串長度函式。 LENGTH(字串)
小寫轉換函式。 LOWER(字串)
字元替換函式。 REPLACE(物件字串,替換前的字串,替換後的字串)
字串的擷取函式。 SUBSTRING(物件字串 FROM 擷取的起始位置 FOR 擷取的字元數)
大寫轉換函式。 UPPER(字串)
日期函式:
當前日期函式 。 CURRENT_DATE
當前時間函式。 CURRENT_TIME
當前日期和時間。CURRENT_TIMESTAMP
擷取日期元素。 EXTRACT(日期元素 FROM 日期)
轉換函式:
型別轉換函式。 CAST(轉換前的值 AS 想要轉換的資料型別)
將NULL轉換為其他值。 COALESCE(資料1,資料2,資料3....)