1. 程式人生 > >PostgreSQL基礎知識(四)

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....)