SQL的函數 函數就是將我們經常使用的代碼封裝起來, 需要的時候直接調用, 提高代碼效率和可維護性. SQL函數一般是在數據上執行, 可以方便地轉換和處理數據. 常用的SQL函數 SQL提供了一些常用的內置函數, 也可以自定義, 內置的函數分為四類: 算數函數 字元串函數 日期函數 轉換函數 算數函 ...
SQL的函數
函數就是將我們經常使用的代碼封裝起來, 需要的時候直接調用, 提高代碼效率和可維護性.
SQL函數一般是在數據上執行, 可以方便地轉換和處理數據.
常用的SQL函數
SQL提供了一些常用的內置函數, 也可以自定義, 內置的函數分為四類:
- 算數函數
- 字元串函數
- 日期函數
- 轉換函數
算數函數
算數函數, 其實就是對數據類型的欄位進行算術運算, 常用的如下:
SELECT ABS(-2); // 2
SELECT MOD(101, 3); // 2
SELECT ROUND(37.25, 1); // 37.3
字元串函數
常用的字元串函數如下:
SELECT CONCAT('abc', 123); // abc123
SELECT LENGTH('你好'); // 6
SELECT CHAR_LENGTH('你好'); // 2
SELECT LOWER('ABC'); // abc
SELECT UPPER('abc'); // ABC
SELECT REPLACE('fabcd', 'abc', 123); // f123d
SELECT SUBSTRING('fabcd', 1,3); // fab
日期函數
常用函數如下:
SELECT CURRENT_DATE; // 獲取當前日期
SELECT CURRENT_TIME; // 獲取當前時間
SELECT CURRENT_TIMESTAMP; // 獲取當前日期 + 時間(時間戳)
SELECT EXTRACT(YEAR FROM '2019-07-07'); // 獲取日期年
SELECT EXTRACT(MONTH FROM '2019-07-07'); // 獲取日期月
SELECT EXTRACT(DAY FROM '2019-07-07'); // 獲取日期天
SELECT DATE('2019-07-07 09:54:00'); // 獲取日期
SELECT TIME('2019-07-07 09:54:00'); // 獲取時間
SELECT TIMESTAMP('2019-07-07 09:54:00'); // 獲取時間戳
以後日期類型的比較實用DATE()函數來進行. 這點很重要.
轉換函數
轉換函數的作用是用來轉換數據類型的
SELECT CAST(123.123 AS INT); // 報錯, 原數值有小數, 不會四捨五入, 轉換出錯
SELECT CAST(123.123 AS DECIMAL(8,2)); // 8表示整數+小數總共8位,2表示小數位數有兩位
SELECT COALESCE(NULL, 1, 2); // 第一個部位null的數是1
聚集函數
聚集函數是對一組數據進行彙總的函數, 輸入一組數據, 輸出的是單個值. SQL中的聚集函數一共包括5個
SELECT COUNT(*) FROM heros WHERE hp_max > 6000; // 查詢最大生命值大於6000的英雄數量
SELECT MAX(hp_max) FROM heros WHERE role_main = '射手' or role_assist = '射手'; // 查詢主要定位和次要定位都是射手的英雄的最大生命值
SELECT COUNT(*), AVG(hp_max), MAX(mp_max), MIN(attack_max), SUM(defense_max) FROM heros WHERE role_main = '射手' or role_assist = '射手'; // 一次使用多個聚合函數
SELECT ROUND(AVG(DISTINCT hp_max), 2) FROM heros; // 計算最大生命的平均值,並保留小數點後兩位
註意MAX, MIN, AVG函數會自動忽略值為NULL的數據行.
數據的分組和統計
對數據進行分組需要使用到GROUP BY子句:
SELECT COUNT(*), role_main FROM heros GROUP BY role_main; // 按照英雄的主要定位分組, 並統計每組的英雄數量
SELECT COUNT(*) as num, role_main, role_assist FROM heros GROUP BY role_main, role_assist ORDER BY num DESC; // 多個欄位進行分組, 並按照數量進行降序排序
HAVING過濾分組
使用WHERE 條件可以進行數據的過濾, 但是在分組的時候, 過濾並不能使用WHERE, 而是需要使用HAVING, 簡單的說WHERE用於數據行, HAVING用於分組.
SELECT COUNT(*) as num, role_main, role_assist FROM heros GROUP BY role_main, role_assist HAVING num > 5 ORDER BY num DESC; // 按照主要定位和次要定位進行分組, 查詢數量大於5的分組並降序排序
SELECT COUNT(*) as num, role_main, role_assist FROM heros WHERE hp_max > 6000 GROUP BY role_main, role_assist HAVING num > 5 ORDER BY num DESC; // WHERE和HAVING同時使用, WHERE先排除數據行, 之後分組過濾
SELECT的查詢語句中, 關鍵字的順序是不能顛倒的:
SELECT.....FROM......WHERE......GROUP BY......HAVING......ORDER BY......LIMIT......