SQL必知必會(SQL函數(shù))

常用的 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';
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容