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 基礎知識梳理(六)- 函數、謂詞、CASE 表達式》
【博主】反骨仔
【原文】http://www.cnblogs.com/liqingwen/p/6572284.html
【參考】《SQL ゼロからはじめるデータベース操作》
