
常用的 SQL 函數(shù)有哪些
一、算術(shù)函數(shù)
算術(shù)函數(shù),顧名思義就是對數(shù)值類型的字段進行算術(shù)運算。常用的算術(shù)函數(shù)及含義如下表所示:

這里我舉一些簡單的例子,你來體會下:
SELECT ABS(-2),運行結(jié)果為 2。
SELECT MOD(101,3),運行結(jié)果 2。
SELECT ROUND(37.25,1),運行結(jié)果 37.3
二、字符串函數(shù)
常用的字符串函數(shù)操作包括了字符串拼接,大小寫轉(zhuǎn)換,求長度以及字符串替換和截取等。具體的函數(shù)名稱及含義如下表所示:
這里同樣有一些簡單的例子,你可以自己運行下:
SELECT CONCAT('abc', 123),運行結(jié)果為 abc123。
SELECT LENGTH('你好'),運行結(jié)果為 6。
SELECT CHAR_LENGTH('你好'),運行結(jié)果為 2。
SELECT LOWER('ABC'),運行結(jié)果為 abc。
SELECT UPPER('abc'),運行結(jié)果 ABC。
SELECT REPLACE('fabcd', 'abc', 123),運行結(jié)果為 f123d。
SELECT SUBSTRING('fabcd', 1,3),運行結(jié)果為 fab。
三、日期函數(shù)
日期函數(shù)是對數(shù)據(jù)表中的日期進行處理,常用的函數(shù)包括:
下面是一些簡單的例子,你可自己運行下:
SELECT CURRENT_DATE(),運行結(jié)果為 2019-04-03。
SELECT CURRENT_TIME(),運行結(jié)果為 21:26:34。
SELECT CURRENT_TIMESTAMP(),運行結(jié)果為 2019-04-03 21:26:34。
SELECT EXTRACT(YEAR FROM '2019-04-03'),運行結(jié)果為 2019。
SELECT DATE('2019-04-01 12:00:05'),運行結(jié)果為 2019-04-01。
這里需要注意的是,DATE 日期格式必須是yyyy-mm-dd的形式。如果要進行日期比較,就要使用 DATE 函數(shù),不要直接使用日期與字符串進行比較,我會在后面的例子中講具體的原因。
四、轉(zhuǎn)換函數(shù)
轉(zhuǎn)換函數(shù)可以轉(zhuǎn)換數(shù)據(jù)之間的類型,常用的函數(shù)如下表所示:
這兩個函數(shù)不像其他函數(shù),看一眼函數(shù)名就知道代表什么、如何使用。下面舉了這兩個函數(shù)的例子,你需要自己運行下:
SELECT CAST(123.123 AS INT),運行結(jié)果會報錯。
SELECT CAST(123.123 AS DECIMAL(8,2)),運行結(jié)果為 123.12。
SELECT COALESCE(null,1,2),運行結(jié)果為 1。
CAST 函數(shù)在轉(zhuǎn)換數(shù)據(jù)類型的時候,不會四舍五入,如果原數(shù)值有小數(shù),那么轉(zhuǎn)換為整數(shù)類型的時候就會報錯。不過你可以指定轉(zhuǎn)化的小數(shù)類型,在 MySQL 和 SQL Server 中,你可以用DECIMAL(a,b)來指定,其中 a 代表整數(shù)部分和小數(shù)部分加起來最大的位數(shù),b 代表小數(shù)位數(shù),比如DECIMAL(8,2)代表的是精度為 8 位(整數(shù)加小數(shù)位數(shù)最多為 8 位),小數(shù)位數(shù)為 2 位的數(shù)據(jù)類型。所以SELECT CAST(123.123 AS DECIMAL(8,2))的轉(zhuǎn)換結(jié)果為 123.12。
五、練習(xí)
顯示英雄以及他的物攻成長,對應(yīng)字段為attack_growth。我們讓這個字段精確到小數(shù)點后一位,需要使用的是算術(shù)函數(shù)里的 ROUND 函數(shù)
SELECT name, ROUND(attack_growth,1) FROM heros;

代碼中,ROUND(attack_growth,1)中的attack_growth代表想要處理的數(shù)據(jù),“1”代表四舍五入的位數(shù),也就是我們這里需要精確到的位數(shù)

假設(shè)我們想顯示英雄最大生命值的最大值,就需要用到 MAX 函數(shù)。在數(shù)據(jù)中,“最大生命值”對應(yīng)的列數(shù)為hp_max,在代碼中的格式為MAX(hp_max)
SELECT MAX(hp_max) FROM heros;

假如我們想要知道最大生命值最大的是哪個英雄,以及對應(yīng)的數(shù)值,就需要分成兩個步驟來處理:首先找到英雄的最大生命值的最大值,即SELECT MAX(hp_max) FROM heros,然后再篩選最大生命值等于這個最大值的英雄
SELECT name, hp_max FROM heros WHERE hp_max = (SELECT MAX(hp_max) FROM heros)

假如我們想顯示英雄的名字,以及他們的名字字?jǐn)?shù),需要用到CHAR_LENGTH函數(shù)
SELECT CHAR_LENGTH(name), name FROM heros;

假如想要提取英雄上線日期(對應(yīng)字段 birthdate)的年份,只顯示有上線日期的英雄即可(有些英雄沒有上線日期的數(shù)據(jù),不需要顯示),這里我們需要使用 EXTRACT 函數(shù),提取某一個時間元素。所以我們需要篩選上線日期不為空的英雄,即WHERE birthdate is not null,然后再顯示他們的名字和上線日期的年份
SELECT name, EXTRACT(YEAR FROM birthdate) AS birthdate FROM heros WHERE birthdate is NOT NULL;
或
SELECT name, YEAR(birthdate) AS birthdate FROM heros WHERE birthdate is NOT NULL;

假設(shè)我們需要找出在 2016 年 10 月 1 日之后上線的所有英雄。這里我們可以采用 DATE 函數(shù)來判斷 birthdate 的日期是否大于 2016-10-01,即WHERE DATE(birthdate)>'2016-10-01',然后再顯示符合要求的全部字段信息
SELECT * FROM heros WHERE DATE(birthdate)>'2016-10-01'

假設(shè)我們需要知道在 2016 年 10 月 1 日之后上線英雄的平均最大生命值、平均最大法力和最高物攻最大值。同樣我們需要先篩選日期條件,即WHERE DATE(birthdate)>'2016-10-01',然后再選擇AVG(hp_max), AVG(mp_max), MAX(attack_max)字段進行顯示
SELECT AVG(hp_max), AVG(mp_max), MAX(attack_max) FROM heros WHERE DATE(birthdate)>'2016-10-01';



