1. 程式人生 > 實用技巧 >SQL:六 函式、謂詞、CASE表示式

SQL:六 函式、謂詞、CASE表示式

各種各樣的函式

所謂函式, 就是輸入某一值得到相應輸出結果的功能,輸入值稱為引數(parameter), 輸出值稱為返回值。

函式的種類

  • 算術函式(用來進行數值計算的函式)

    • ABS(數值)

      • ABS 是計算絕對值的函式
      • ABS 函式的引數為 NULL 時,結果也是 NULL。並非只有 ABS 函式如此,其實絕大多數函式對於 NULL 都返 回NULL
    • MOD(被除數,除數)

      • MOD 是計算除法餘數(求餘)的函式,是 modulo 的縮寫
      • 只能對整數型別的列使用 MOD 函式
    • ROUND(物件數值,保留小數的位數)

      • ROUND函式用來進行四捨五入操作
  • -- 計算數值的絕對值 
    SELECT m, ABS(m) AS abs_col FROM SampleMath; -- 計算除法(n ÷ p)的餘數 SELECT n, p, MOD(n, p) AS mod_col FROM SampleMath; -- 對m列的數值進行n列位數的四捨五入處理 SELECT m, n, ROUND(m, n) AS round_col FROM SampleMath;
  • 字串函式(用來進行字串操作的函式)

    • 字串1 || 字串2

      • 字串拼接
      • SQL Server用“+”運算子(函式)來連線字串
      • MySQL使用CONCAT函式 來完成字串的拼接
    • LENGTH(字串)

      • 獲取字串長度
      • SQL Server使用LEN函式來計算字串的長度
    • LOWER(字串)

      • LOWER 函式只能針對英文字母使用,它將引數中的字串全都轉換為小寫
      • UPPER 大寫轉換函式
    • REPLACE(物件字串,替換前的字串,替換後的字串)

      • 用 REPLACE函式,可以將字串的一部分替換為其他的字串
    • SUBSTRING(物件字串 FROM 擷取的起始位置 FOR 擷取的字元數)

      • 使用 SUBSTRING函式可以截取出字串中的一部分字串
  • -- 拼接兩個字串(str1+str2)
    SELECT str1, str2, 
           str1 || str2 AS
    str_concat FROM SampleStr; -- 計算字串長度 SELECT str1, LENGTH(str1) AS len_str FROM SampleStr; -- 大寫轉換為小寫 SELECT str1, LOWER(str1) AS low_str FROM SampleStr WHERE str1 IN ('ABC', 'aBC', 'abc'); -- 替換字串的一部分 SELECT str1, str2, str3, REPLACE(str1, str2, str3) AS rep_str FROM SampleStr; -- 截取出字串中第3位和第4位的字元 SELECT str1, SUBSTRING(str1 FROM 3 FOR 2) AS sub_str FROM SampleStr;

  • 日期函式(用來進行日期操作的函式)

    • CURRENT_DATE

      • 返回 SQL 執行的日期,也就是該函式執 行時的日期。由於沒有引數,因此無需使用括號
    • CURRENT_TIME

      • CURRENT_TIME函式能夠取得SQL 執行的時間,也就是該函式執行時的時間
    • CURRENT_TIMESTAMP

      • 使用該函式可以同時得到當前的日期和時間,當然也可以 從結果中擷取日期或者時間
    • EXTRACT(日期元素 FROM 日期)

      • 可以截取出日期資料中的一部分,例如YEAR、MONTH、DAY、HOUR、MINUTE、SECOND
      • 該函式的返回值並不是日 期型別而是數值型別
  • -- 獲得當前日期
    SELECT CURRENT_DATE;
    
    -- 取得當前時間
    SELECT CURRENT_TIME;
    
    -- 取得當前日期和時間
    SELECT CURRENT_TIMESTAMP;
    
    -- 擷取日期元素
    SELECT CURRENT_TIMESTAMP, 
           EXTRACT(YEAR FROM CURRENT_TIMESTAMP) AS year, 
           EXTRACT(MONTH FROM CURRENT_TIMESTAMP) AS month, 
           EXTRACT(DAY FROM CURRENT_TIMESTAMP) AS day, 
           EXTRACT(HOUR FROM CURRENT_TIMESTAMP) AS hour, 
           EXTRACT(MINUTE FROM CURRENT_TIMESTAMP) AS minute, 
           EXTRACT(SECOND FROM CURRENT_TIMESTAMP) AS second;

  • 轉換函式(用來轉換資料型別和值的函式)

    • CAST(轉換前的值 AS 想要轉換的資料型別)

      • 型別轉換其實不是為了方便使用者使用而開發的功能,而是為了方便 DBMS內部處理而開發的功能
    • COALESCE(資料1,資料 2,資料 3……)

      • 將NULL轉換為其他值
      • 該函式會返回可變引數 A 中左側開 始第1個不是 NULL的值。引數個數是可變的,因此可以根據需要無限增加。
  • -- 將字串型別轉換為數值型別
    -- SQL Server PostgreSQL 
    SELECT CAST('0001' AS INTEGER) AS int_col;
    
    -- MySQL
    SELECT CAST('0001' AS SIGNED INTEGER) AS int_col;
    
    -- Oracle 
    SELECT CAST('0001' AS INTEGER) AS int_col  
    FROM DUAL;
    
    -- DB2 
    SELECT CAST('0001' AS INTEGER) AS int_col  
    FROM SYSIBM.SYSDUMMY1;
    
    -- 將字串型別轉換為日期型別
    SELECT CAST('2009-12-14' AS DATE) AS date_col;
    
    -- 將NULL轉換為其他值
    SELECT COALESCE(NULL, 1) AS col_1,
           COALESCE(NULL, 'test', NULL) AS col_2,       
           COALESCE(NULL, NULL, '2009-11-01') AS col_3;
  • 聚合函式(用來進行資料聚合的函式)

謂詞

什麼是謂詞

  • 謂詞就是返回值為真值的函式

LIKE謂詞

  • 字串的部分一致查詢

  • 部分一致大體可以分為三種類型

    • 前方一致

      • 所謂前方一致,就是選取出作為查詢條件的字串與查詢物件字串起始部分相同的記錄的查詢方法
    • 中間一致

      • 所謂中間一致,就是選取出查詢物件字串中含有作為查詢條件的字 符串的記錄的查詢方法。無論該字串出現在物件字 符串的最後還是中間都沒有關係
    • 後方一致

      • 後方一致與前方一致相反,也就是選取出作為查詢條件的字串與查詢物件字串的末尾部分相同的記錄的查詢方法。
  • 這樣不使用“=”來指定條件字串,而以字串中是否包含該條件的規則為基礎的查詢稱為模式匹配,其中的模式也就是前面提到的“規則”。

  • -- 使用LIKE進行前方一致查詢 
    SELECT *  
    FROM SampleLike 
    WHERE strcol LIKE 'ddd%';
    
    -- 使用LIKE進行中間一致查詢 
    SELECT *  
    FROM SampleLike 
    WHERE strcol LIKE '%ddd%';
    
    -- 使用LIKE進行後方一致查詢 
    SELECT *  
    FROM SampleLike 
    WHERE strcol LIKE '%ddd';
    
    -- 使用LIKE和_(下劃線)進行後方一致查詢 
    SELECT *  
    FROM SampleLike 
    WHERE strcol LIKE 'abc__';
    
    -- 查詢“abc+任意3個字元”的字串 
    SELECT *  
    FROM SampleLike 
    WHERE strcol LIKE 'abc___';

BETWEEN謂詞

  • 使用 BETWEEN 可以進行範圍查詢
  • 該謂詞與其他謂詞或者函式的不 同之處在於它使用了3個引數
  • BETWEEN 的特點就是結果中會包含100 和 1000 這兩個臨界值
  • -- 選取銷售單價為100~1000日元的商品
    SELECT product_name, sale_price  
    FROM Product 
    WHERE sale_price BETWEEN 100 AND 1000;
     

IS NULL、IS NOT NULL

  • 判斷是否為NULL
  • 為了選取出某些值為 NULL 的列的資料,不能使用 =,而只能使用特定的謂詞 IS NULL
  • 想要選取 NULL 以外的資料時,需要使用 IS NOT NULL
  • -- 選取出進貨單價(purchase_price)為 NULL的商品 
    SELECT product_name, purchase_price  
    FROM Product 
    WHERE purchase_price IS NULL;

IN謂詞

  • OR的簡便用法

    • IN 謂詞“IN(值,……)”
  • 否定形式 NOT IN

  • 使用 IN 和NOT IN 時是無法選取出 NULL 資料

  • -- 通過OR指定多個進貨單價進行查詢 
    SELECT product_name, purchase_price  
    FROM Product 
    WHERE purchase_price =  320
        OR purchase_price =  500
        OR purchase_price = 5000;
    
    -- 通過IN來指定多個進貨單價進行查詢 
    SELECT product_name, purchase_price  
    FROM Product 
    WHERE purchase_price IN (320, 500, 5000);
    
    -- 使用NOT IN進行查詢時指定多個排除的進貨單價進行查詢 
    SELECT product_name, purchase_price  
    FROM Product 
    WHERE purchase_price NOT IN (320, 500, 5000);

使用子查詢作為IN謂詞的引數

  • IN和子查詢

    • IN 謂詞(NOT IN 謂詞)具有其他謂詞所沒有的用法,那就是可以 使用子查詢作為其引數
  • NOT IN和子查詢

    • IN 的否定形式 NOT IN 同樣可以使用子查詢作為引數,其語法也和 IN 完全一樣
-- 使用子查詢作為IN的引數
SELECT product_name, sale_price  
FROM Product 
WHERE product_id IN (SELECT product_id
                         FROM ShopProduct
                       WHERE shop_id = '000C');

-- 子查詢展開後的結果 
SELECT product_name, sale_price  
FROM Product 
WHERE product_id IN ('0003', '0004', '0006', '0007');

EXIST謂詞

  • EXIST謂詞的使用方法

    • 通常指定關聯子查詢作為EXIST的引數

    • 子查詢中的SELECT *

      • 由於 EXIST 只關心記錄是否存在,因此返回哪些列都沒有關係
      • 可以把在EXIST 的子查詢中書寫SELECT * 當作SQL 的一 種習慣
    • 使用NOT EXIST替換NOT IN

      • NOT EXIST 與 EXIST 相反,當“不存在”滿足子查詢中指定條件的記錄時返回真(TRUE)
-- 使用EXIST選取出“某店在售商品的銷售單價”
SELECT product_name, sale_price  
FROM Product AS P 
WHERE EXISTS (SELECT *
              FROM ShopProduct AS SP 
              WHERE SP.shop_id = '000C'
              AND SP.product_id = P.product_id);

CASE表示式

什麼是CASE表示式

  • 是一種進行運算的功能
  • CASE 表示式是在區分情況時使用的,這種情況的區分在程式設計中通常 稱為(條件)分支

CASE表示式的語法

  • 簡單CASE表示式

  • 搜尋CASE表示式

    • 搜尋CASE 表示式包含了簡單CASE 表示式的全部功能
    • CASE 表示式會從對最初的 WHEN 子句中的“< 求值表示式 >”進行 求值開始執
CASE WHEN <求值表示式> THEN <表示式> 
         WHEN <求值表示式> THEN <表示式> 
         WHEN <求值表示式> THEN <表示式>
           . 
           . 
           . 
          ELSE <表示式> 
END

-- 通過CASE表示式將A~C的字串加入到商品種類當中 
SELECT product_name,
       CASE WHEN product_type = '衣服'
            THEN 'A :' || product_type
            WHEN product_type = '辦公用品'
            THEN 'B:' || product_type
            WHEN product_type = '廚房用具'
            THEN 'C :' || product_type
            ELSE NULL
       END AS abc_product_type  
FROM Product;

CASE表示式的使用方法

  • CASE表示式中的ELSE子句可以省略
  • CASE表示式中的END不能省略。

CASE表示式的書寫位置

  • CASE 表示式的便利之處就在於它是一個表示式
  • 表示式可以書寫在任意位置
-- 通常使用GROUP BY也無法實現行列轉換 
SELECT product_type,
       SUM(sale_price) AS sum_price
FROM Product 
GROUP BY product_type;

-- 使用CASE表示式進行行列轉換 
-- 對按照商品種類計算出的銷售單價合計值進行行列轉換 
SELECT SUM(CASE WHEN product_type = '衣服'
                THEN sale_price ELSE 0 END) AS sum_price_clothes,
       SUM(CASE WHEN product_type = '廚房用具'
                THEN sale_price ELSE 0 END) AS sum_price_kitchen,
       SUM(CASE WHEN product_type = '辦公用品' 
                THEN sale_price ELSE 0 END) AS sum_price_office  
FROM Product;