[SQL] SQL 基礎知識梳理(六)- 函數、謂詞、CASE 表達式


SQL 基礎知識梳理(六)-  函數、謂詞、CASE 表達式

 

目錄

  • 函數
  • 謂詞
  • CASE 表達式

 

一、函數

  1.函數:輸入某一值得到相應輸出結果的功能,輸入值稱為“參數”,輸出值稱為“返回值”。

 

  2.函數的種類

  (1)算術函數 - 數值計算

  (2)字符串函數 - 字符串操作

  (3)日期函數 - 日期操作

  (4)轉換函數 - 轉換數據類型

  (5)聚合函數 - 數據聚合

 

  3.算術函數(加、減、乘、除):+、-、*、/

  【備注】數據類型 NUMBERIC(全體位數,小數位數)可以指定數值的大小。

CREATE TABLE SampleMath
    (
      m NUMERIC(10, 3) ,
      n INTEGER ,
      p INTEGER
    );

BEGIN TRAN;

INSERT INTO dbo.SampleMath
        ( m, n, p )
VALUES  ( 500, -- m - numeric
          0, -- n - integer
          NULL  -- p - integer
          );
INSERT INTO dbo.SampleMath
        ( m, n, p )
VALUES  ( -180, -- m - numeric
          0, -- n - integer
          NULL  -- p - integer
          );
INSERT INTO dbo.SampleMath
        ( m, n, p )
VALUES  ( NULL, -- m - numeric
          NULL, -- n - integer
          NULL  -- p - integer
          );
INSERT INTO dbo.SampleMath
        ( m, n, p )
VALUES  ( NULL, -- m - numeric
          7, -- n - integer
          3  -- p - integer
          );
INSERT INTO dbo.SampleMath
        ( m, n, p )
VALUES  ( NULL, -- m - numeric
          5, -- n - integer
          2  -- p - integer
          );
INSERT INTO dbo.SampleMath
        ( m, n, p )
VALUES  ( NULL, -- m - numeric
          4, -- n - integer
          NULL  -- p - integer
          );
INSERT INTO dbo.SampleMath
        ( m, n, p )
VALUES  ( 8, -- m - numeric
          NULL, -- n - integer
          3  -- p - integer
          );
INSERT INTO dbo.SampleMath
        ( m, n, p )
VALUES  ( 2.27, -- m - numeric
          1, -- n - integer
          NULL  -- p - integer
          );
INSERT INTO dbo.SampleMath
        ( m, n, p )
VALUES  ( 5.555, -- m - numeric
          2, -- n - integer
          NULL  -- p - integer
          );
INSERT INTO dbo.SampleMath
        ( m, n, p )
VALUES  ( NULL, -- m - numeric
          1, -- n - integer
          NULL  -- p - integer
          );
INSERT INTO dbo.SampleMath
        ( m, n, p )
VALUES  ( 8.76, -- m - numeric
          NULL, -- n - integer
          NULL  -- p - integer
          );

COMMIT;
初始化數據

  (1)ABS - 絕對值:不考慮數值的符號,表示一個數到原點距離的數值。

  絕對值的計算方法:0 和正數的絕對值就是其本身,負數的絕對值就是去掉符號后的結果。

--語法: ABS(數值)

圖:第 2 行:-180 的絕對值為 180

   

  (2)MOD - 取余、求余

--語法: MOD(被除數,除數)

  【備注】Oracle、DB2、PostgreSQL、MySQL 支持該函數,而 SQL Server 不支持該函數,所以這里用“%”代替。

 

  (3)ROUND - 四舍五入

   如果指定四舍五入的位數為 1,那么會對小數點第 2 位進行四舍五入;如果指定位數為 2,那么就會對第 3 位進行四舍五入。

 

   4.字符串函數

CREATE TABLE SampleStr
(
    str1 VARCHAR(40),
    str2 VARCHAR(40),
    str3 VARCHAR(40)
)

BEGIN TRAN;
INSERT INTO dbo.SampleStr
        ( str1, str2, str3 )
VALUES  ( 'opx', -- str1 - varchar(40)
          'rt', -- str2 - varchar(40)
          NULL  -- str3 - varchar(40)
          );

INSERT INTO dbo.SampleStr
        ( str1, str2, str3 )
VALUES  ( 'abc', -- str1 - varchar(40)
          'def', -- str2 - varchar(40)
          NULL  -- str3 - varchar(40)
          );

INSERT INTO dbo.SampleStr
        ( str1, str2, str3 )
VALUES  ( 'aaa', -- str1 - varchar(40)
          NULL, -- str2 - varchar(40)
          NULL  -- str3 - varchar(40)
          );

INSERT INTO dbo.SampleStr
        ( str1, str2, str3 )
VALUES  ( 'aaa', -- str1 - varchar(40)
          NULL, -- str2 - varchar(40)
          NULL  -- str3 - varchar(40)
          );

INSERT INTO dbo.SampleStr
        ( str1, str2, str3 )
VALUES  ( NULL, -- str1 - varchar(40)
          'xyz', -- str2 - varchar(40)
          NULL  -- str3 - varchar(40)
          );

INSERT INTO dbo.SampleStr
        ( str1, str2, str3 )
VALUES  ( '@!#$%', -- str1 - varchar(40)
          NULL, -- str2 - varchar(40)
          NULL  -- str3 - varchar(40)
          );

INSERT INTO dbo.SampleStr
        ( str1, str2, str3 )
VALUES  ( 'ABC', -- str1 - varchar(40)
          NULL, -- str2 - varchar(40)
          NULL  -- str3 - varchar(40)
          );

INSERT INTO dbo.SampleStr
        ( str1, str2, str3 )
VALUES  ( 'aBC', -- str1 - varchar(40)
          NULL, -- str2 - varchar(40)
          NULL  -- str3 - varchar(40)
          );

INSERT INTO dbo.SampleStr
        ( str1, str2, str3 )
VALUES  ( 'abc太郎', -- str1 - varchar(40)
          'abc', -- str2 - varchar(40)
          'ABC'  -- str3 - varchar(40)
          );

INSERT INTO dbo.SampleStr
        ( str1, str2, str3 )
VALUES  ( 'abcdefabc', -- str1 - varchar(40)
          'abc', -- str2 - varchar(40)
          'ABC'  -- str3 - varchar(40)
          );

INSERT INTO dbo.SampleStr
        ( str1, str2, str3 )
VALUES  ( 'micmic', -- str1 - varchar(40)
          'i', -- str2 - varchar(40)
          'T'  -- str3 - varchar(40)
          );

COMMIT;
初始化數據

  (1)拼接:+

 

  (2)LEN - 字符串長度

--語法: LEN(字符串)

 

  (3)LOWER - 小寫轉換

--語法:LOWER(字符串)

 

  (4)REPLACE - 字符串的替換

--語法:REPLACE(對象字符串, 替換前的字符串, 替換后的字符串)

 

  (5)SUBSTRING - 字符串的截取

--語法:SUBSTRING(對象字符串,截取的起始位置,截取的字符數)

 

  (6)UPPER - 大寫轉換

--語法:UPPER(字符串)

 

   5.日期函數

  (1)獲取當前日期和時間

 

  (2)DATEPART - 截取日期元素

 

  6.轉換函數

  (1)CAST - 類型轉換

 

  (2)COALESCE - 將 NULL 轉換為其他值

  作用:返回可變參數中左側開始的第一個不是 NULL 的值(參數是可變的,即可以個數是無限的)。

--語法:COALESCE(數據1, 數據2, 數據3 ...)

 

二、謂詞

  1.謂詞:返回值為真值(TRUE/FALSE/UNKNOWN)的函數。

 

  2.LIKE - 字符串的部分一致查詢

  【備注】= 運算符:字符串完全一致。

CREATE TABLE SampleLike
(
strcool VARCHAR(6) NOT NULL,
PRIMARY KEY(strcool)
)

BEGIN TRAN;
INSERT INTO dbo.SampleLike
        ( strcool )
VALUES  ( 'abcddd'  -- strcool - varchar(6)
          );

INSERT INTO dbo.SampleLike
        ( strcool )
VALUES  ( 'dddabc'  -- strcool - varchar(6)
          );

INSERT INTO dbo.SampleLike
        ( strcool )
VALUES  ( 'abdddc'  -- strcool - varchar(6)
          );

INSERT INTO dbo.SampleLike
        ( strcool )
VALUES  ( 'ddabc'  -- strcool - varchar(6)
          )

INSERT INTO dbo.SampleLike
        ( strcool )
VALUES  ( 'abddc'  -- strcool - varchar(6)
          )

COMMIT;
初始化數據

  %:0 字符以上的任意字符串。

  _:任意 1 個字符。

圖:前部分一致

圖:中間一致

圖:后部分一致

  后面 ddd 是 3 個字符,所以“abc__(2個 _)”不滿足條件。

 

   3.BETWEEN - 范圍查詢

 

  BETWEEN 會在結果中包含臨界值(100 和 1000)。如果不想包含臨界值可以使用 < 和 >。

 

  4.IS NULL、IS NOT NULL - 判斷是否為 NULL

  為了選取部分值為 NULL 的列的數據,不能使用 =,只能使用 IS NULL。

 

  取反(不為空的數據),請使用 IS NOT NULL。

 

  5.IN - OR 的簡便用法

 

  用 IN 替換上述語句:

 

  否定形式 NOT IN:

 

   【備注】IN 和 NOT IN 是無法選取 NULL 數據的。

  

  6.使用子查詢作為 IN 謂詞的參數

  IN 和 NOT IN 謂詞具有其它謂詞沒有的用法,它的參數可以是子查詢。 

-- DDL:創建表
CREATE TABLE TenpoShohin
(tenpo_id  CHAR(4)       NOT NULL,
 tenpo_mei  VARCHAR(200) NOT NULL,
 shohin_id CHAR(4)       NOT NULL,
 suryo     INTEGER       NOT NULL,
 PRIMARY KEY (tenpo_id, shohin_id));

-- DML:插入數據

INSERT INTO TenpoShohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES ('000A',    '東京',        '0001',    30);
INSERT INTO TenpoShohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES ('000A',    '東京',        '0002',    50);
INSERT INTO TenpoShohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES ('000A',    '東京',        '0003',    15);
INSERT INTO TenpoShohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES ('000B',    '名古屋',    '0002',    30);
INSERT INTO TenpoShohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES ('000B',    '名古屋',    '0003',    120);
INSERT INTO TenpoShohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES ('000B',    '名古屋',    '0004',    20);
INSERT INTO TenpoShohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES ('000B',    '名古屋',    '0006',    10);
INSERT INTO TenpoShohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES ('000B',    '名古屋',    '0007',    40);
INSERT INTO TenpoShohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES ('000C',    '大阪',        '0003',    20);
INSERT INTO TenpoShohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES ('000C',    '大阪',        '0004',    50);
INSERT INTO TenpoShohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES ('000C',    '大阪',        '0006',    90);
INSERT INTO TenpoShohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES ('000C',    '大阪',        '0007',    70);
INSERT INTO TenpoShohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES ('000D',    '福岡',        '0001',    100);
測試數據

 

  7.EXIST 

  很多時候基本上可以使用 IN 或 NOT IN 來代替該謂詞。

  作用:判斷是否存在滿足某種條件的記錄。

 

  NOT EXIST 與 EXIST 相反,不存在:

 

三、CASE 表達式

   1.CASE 表達式:(條件)分歧。

 

   2.語法

--語法
--CASE WHEN <判斷表達式> THEN <表達式>
--     WHEN <判斷表達式> THEN <表達式>
--     ...
--     ELSE <表達式>
--END

  判斷表達式類似“鍵 = 值”的形式,返回值為真值(TRUE/FALSE/UNKNOW)的表達式。如果結果為真,就會返回 THEN 子句中的表達式;如果不為真,就跳轉到下一條 WHEN 子句的判斷中;如果到最后的 WHEN 子句都不為真,就執行最后一條 ELSE 的表達式。

 

  下面是簡化版的 CASE 表達式:

 

  3.行轉列

 

 

備注

  這里采用 MS SQL Server 進行驗證,不保證所有的 DBMS 執行結果正確。

 

《SQL 基礎知識梳理》系列

  《SQL 基礎知識梳理(一) - 數據庫與 SQL

  《SQL 基礎知識梳理(二) - 查詢基礎

  《SQL 基礎知識梳理(三) - 聚合和排序

  《SQL 基礎知識梳理(四) - 數據更新

  《SQL 基礎知識梳理(五) - 復雜查詢

  《SQL 基礎知識梳理(六)- 函數、謂詞、CASE 表達式

  《SQL 基礎知識梳理(七)- 集合運算

 

 


【博主】反骨仔

【原文】http://www.cnblogs.com/liqingwen/p/6572284.html

【參考】《SQL ゼロからはじめるデータベース操作》

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM