MySQL基礎知識(五)——函式
一.內建函式
函式可以用在資料表的任何欄位上。
1.字元函式
(1)CONCAT() 字元連線
# 可以連線任意個數的字元 SELECT CONCAT('kim','-','xiaotiantian',' ','so',' ','beautiful','!'); # 建立一張新表 CREATE TABLE tbl_test ( first_name VARCHAR ( 20 ), last_name VARCHAR ( 10 ) ); # 將新表的兩個欄位組合在一起查詢 SELECT CONCAT(first_name,last_name) AS full_name FROM tbl_test;
(2)CONTACT_WS() 使用指定的分隔符進行字元連線
# 第一個值為指定的分隔符,後面為使用分隔符連線的內容,可以連線任意個數的字元
SELECT CONCAT_WS('|','A','B','C','D');
(3)FORMAT() 數字格式化
# 返回結果是一個字元型。第二位是幾,則保留幾位數。
SELECT FORMAT(88888.80032,2);
# 0則保留整數位
SELECT FORMAT(88888.80032,0);
(4)LOWER() 轉換成小寫字母
# 得到一個完全小寫的字元
SELECT LOWER('MySQL');
(5)UPPER() 轉換成大寫字母
# 得到一個完全大寫的字元
SELECT UPPER('Mysql');
(6)LEFT() 獲取左側字元
# LEFT函式有兩個引數,第一個引數是指從哪個字串獲取,第二個引數是獲取幾位
SELECT LEFT('MySQL',2);
# 也可以進行函式的巢狀使用
SELECT LOWER(LEFT('MySQL',2));
(7)RIGHT() 獲取右側字元
# RIGHT函式有兩個引數,第一個引數是指從哪個字串獲取,第二個引數是獲取幾位
SELECT RIGHT('MySQL',3);
(8)LENGTH() 獲取字串長度
# 獲取字串的長度,如果有空格,空格也算長度 SELECT LENGTH(' MySQL ');
(9)LTRIM() 刪除前導空格
# 可以獲取到結果為11
SELECT LENGTH(' MySQL ');
# LTRIM()表示刪除第一個字母前面的空格,可以獲取到結果為9,確定前面的空格被刪除掉
SELECT LENGTH(LTRIM(' MySQL '));
(10)RTRIM() 刪除後續空格
# 可以獲取到結果為11
SELECT LENGTH(' MySQL ');
# RTRIM()表示刪除最後一個字母后面的空格,可以獲取到結果為7,確定後面的空格被刪除掉
SELECT LENGTH(RTRIM(' MySQL '));
(11)TRIM() 刪除前導和後續空格
# 可以獲取到結果為12
SELECT LENGTH(' My SQL ');
# TRIM()表示刪除前面和後面的所有空格,可以獲取到結果為6,確定前面和後面的空格都被刪除掉。無法去掉中間的空格
SELECT LENGTH(TRIM(' My SQL '));
# TRIM()也可以用來刪除指定字元,下面這個SQL表示刪除前導的'?'字元
SELECT TRIM(LEADING '?' FROM '??MySQL???');
# TRIM()也可以用來刪除指定字元,下面這個SQL表示刪除後續的'?'字元
SELECT TRIM(TRAILING '?' FROM '??MySQL???');
# TRIM()也可以用來刪除指定字元,下面這個SQL表示刪除前導和後置的'?'字元,無法刪除中間的。
SELECT TRIM(BOTH '?' FROM '??My?SQL???');
(12)SUBSTRING() 字串擷取
# SUBSTRING擷取字串
# 三個引數,第一個是從哪個字串擷取,第二個是從第幾位擷取,第三個是擷取幾位
SELECT SUBSTRING('hello world','2','3');
# 兩個引數如果不指定擷取幾位,則預設擷取到字串末尾
SELECT SUBSTRING('hello world','2');
# 起始位可以為負值,表示從後往前數幾位
SELECT SUBSTRING('hello world','-3');
(13)[NOT] LIKE() 模式匹配
# %表示任意數,返回結果為1表示True,0表示FALSE
SELECT 'MYSQL' LIKE 'M%';
# %表示任意數,查詢lst_name中帶有o的結果
SELECT * FROM tbl_test WHERE last_name LIKE '%o%';
# 想查詢lst_name中帶有%的結果則要使用下面的方式,表示1後面的%不需要再認為是萬用字元解析了,直接認為是標準的%
SELECT * FROM tbl_test WHERE last_name LIKE '%1%%' ESCAPE 1;
# _下劃線表示任意一個數
SELECT * FROM tbl_test WHERE last_name LIKE '__o';
(14)REPLACE() 字串替換
# 想去掉中間的空格或者字元,可以使用replace替換。
# 第一個引數為要處理的字元,第二個引數為要被替換的字元,第三個引數為替換為的字元
SELECT REPLACE('??My?SQL???','?','');
# 也可以進行1個字元替換多個字元,多個字元替換一個字元,多個字元替換多個字元的操作
SELECT REPLACE('??My?SQL???','??','&!');
SELECT REPLACE('??My?SQL???','?','&!');
SELECT REPLACE('??My?SQL???','??','!');
2.數值運算子與函式
(1)CEIL() 向上取整,進一取整
# 有小數位就向上取整,即用整數位+1.結果為4
SELECT CEIL(3.01);
(2)DIV() 整數除法
# 整數除法,只保留整數位的除法
SELECT 3 DIV 4;
(3)FLOOR() 向下取整,舍一取整
# 有小數位就向下取整,即用整數位-1.結果為3
SELECT FLOOR(3.66);
(4)MOD() 取餘數(取模)
# 取餘數,對整數和消數都可以,和‘%’一樣。
SELECT 5.1 MOD 4;
# 兩個結果一樣
SELECT 5.1 % 4;
(5)POWER() 冪運算
# POWER(n,m),表示n的m次方
SELECT POWER(2,3);
(6)ROUND() 四捨五入
# ROUND表示四捨五入,第一個引數為四捨五入的數,第二個引數表示保留幾位
SELECT ROUND(3.652,2);
# 第二個引數可以為負數,結果為40
SELECT ROUND(35.652,-1);
(7)TRUNCATE() 數字擷取
# 第一個引數為被擷取的數,第二個引數表示保留幾位。結果是125.8,和四捨五入不一樣,這是單純的擷取
SELECT TRUNCATE(125.89,0);
# 第二個引數可以為負數,結果為100
SELECT TRUNCATE(125.89,-2);
3.比較運算子與函式
(1)[NOT] BETWEEN...AND... 【不】在範圍之內
# 在不在某個閉合範圍內,返回1為TRUE,0為FALSE
SELECT 9 NOT BETWEEN 1 AND 10;
SELECT 9 BETWEEN 1 AND 10;
(2)[NOT] IN () 【不】在列出值範圍內
# 在不在列出的值的範圍內,給的是數軸上的某些個特定的點,返回1為TRUE,0為FALSE
SELECT 9 NOT IN (1,2,3,4,5,6,7,8,9);
SELECT 9 IN (1,2,3,4,5,6,7,8,9);
(3)IS [NOT] NULL() 【不】為空
# 是否為空,返回1為TRUE,0為FALSE
# 返回1
SELECT NULL IS NULL;
# 返回0
SELECT '' IS NULL;
# 返回0
SELECT 0 IS NULL;
# 實際中使用,查詢first_name不為空的資料
SELECT * FROM tbl_test WHERE first_name IS NOT NULL;
4.日期時間函式
(1)NOW() 當前日期和時間
# 檢視當前的日期和時間
SELECT NOW();
(2)CURDATE() 當前日期
# 檢視當前的日期
SELECT CURDATE();
(3)CURTIME() 當前時間
# 檢視當前的時間
SELECT CURTIME();
(4)DATE_ADD() 日期變化
# 檢視日期變化
# 在2018-12-12的基礎上+365天
SELECT DATE_ADD('2018-12-12',INTERVAL 365 DAY);
# 在2018-12-12的基礎上-365天
SELECT DATE_ADD('2018-12-12',INTERVAL -365 DAY);
# 在2018-12-12的基礎上+1年
SELECT DATE_ADD('2018-12-12',INTERVAL 1 YEAR);
# 在2018-12-12的基礎上+3周
SELECT DATE_ADD('2018-12-12',INTERVAL 3 WEEk);
# 在2018-12-12的基礎上+2月
SELECT DATE_ADD('2018-12-12',INTERVAL 2 MONTH);
(5)DATEDIFF() 日期差值
# 返回兩個日期的差值
SELECT DATEDIFF('2015-6-1','2018-12-24');
(6)DATE_FORMAT() 日期格式化
# 日期格式化,將常見的一種日期格式轉換成另外一種日期格式
SELECT DATE_FORMAT('2014-3-12','%m/%d/%Y');
5.資訊函式
(1)CONNECTION_ID() 連線ID
# 檢視當前的連線ID
SELECT CONNECTION_ID();
(2)DATABASE() 當前資料庫
# 檢視當前的連線的資料庫
SELECT DATABASE();
(3)LAST_INSERT_ID() 最後插入記錄的ID號
# 要在之前插入一條有自動編號id的資料,得到最後插入記錄的ID號
# 但寫入多條資料的時候,只能獲取到多條中第一條寫入的ID,無法獲取後面寫入的ID
SELECT LAST_INSERT_ID();
(4)USER() 當前使用者
# 檢視當前使用者
SELECT USER();
(5)VERSION() 版本資訊
# 檢視版本資訊
SELECT VERSION();
6.聚合函式
聚合函式的特點是隻有一個返回值。
(1)AVG() 平均值
# 檢視平均價格
SELECT AVG(goods_price) AS avg_price FROM tbl_goods;
(2)COUNT() 計數
# 檢視總條數
SELECT COUNT(goods_id) AS totalnum FROM tbl_goods;
(3)MAX() 最大值
# 最大值,檢視商品價格最高的
SELECT MAX(goods_price) AS avg_price FROM tbl_goods;
(4)MIN() 最小值
# 最小值,檢視商品價格最低的
SELECT MIN(goods_price) AS avg_price FROM tbl_goods;
(5)SUM() 求和
# 求和,檢視全部商品的總價
SELECT SUM(goods_price) AS avg_price FROM tbl_goods;
7.加密函式
(1)MD5() 資訊摘要演算法
# 資訊摘要演算法,加密完為一個32位的數字
# 如果是為了以後的WEB頁面作準備,儘量使用MD5
SELECT MD5('kimtian');
(2)PASSWORD() 密碼演算法
# 進行密碼的計算
SELECT PASSWORD('kimtian');
# 修改客戶端自己密碼的時候,使用PASSWORD修改使用者密碼
SET PASSWORD=PASSWORD('kimtian');
二.自定義函式
1.定義
使用者自定義函式(user-defined function,UDF)是一種對MySQL擴充套件的途徑,其用法與內建函式相同。
自定義函式的兩個必要條件:(1)引數 (2)返回值
函式可以返回任意型別的值,同樣可以接收這些型別的引數,引數不可以超過1024個。
2.語法
CREATE FUNCTION function_name RETURNS {STRING | INTEGER | REAL | DECIMAL} routine_body
routine_body指的是函式體。
3.函式體
(1)函式體由合法的SQL語句構成;
(2)函式體可以是簡單的SELECT或INSERT語句;
(3)函式體如果為複合結構則使用BEGIN...END語句;
(4)複合結構可以包含宣告,迴圈,控制結構。
4.建立不帶引數的自定義函式
在最開始建立自定義函式的時候報錯:
ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
解決辦法:
使用命令:set global log_bin_trust_function_creators=1;
接下來就可以建立成功自定義函數了:
# 想按照年月日 時分秒和指定格式獲取當前日期
SELECT DATE_FORMAT((NOW()),'%Y年%m月%d日 %H點:%i分:%s秒');
# 將上面的查詢封裝成一個函式,方便以後使用,建立函式f1
CREATE FUNCTION f1() RETURNS VARCHAR(30)
RETURN DATE_FORMAT((NOW()),'%Y年%m月%d日 %H點:%i分:%s秒');
# 使用函式f1
SELECT f1();
5.建立帶有引數的自定義函式
# 建立帶有引數的自定義函式
CREATE FUNCTION f2(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)
RETURNS FLOAT(10,2) UNSIGNED
RETURN (num1+num2)/2;
# 使用函式f2
SELECT f2(1002,4233);
6.刪除函式
語法:DROP FUNCTION [IF EXISTS] function_name
# 刪除函式的命令
DROP FUNCTION f2;
7.建立具有複合結構函式體的自定義函式
- 函式體由合法的SQL語句構成;
- 函式體可以是簡單的SELECT或INSERT語句;
- 函式體如果為複合結構則使用BEGIN...END語句;
- 複合結構可以包含宣告,迴圈,控制結構;
# 修改預設的mysql的分隔符,改為必須用$$結束Mysql,不用在結尾加分號,加了分號分隔符就變成了$$;
DELIMITER $$
# 如果使用命令列 擇要修改預設的mysql的分隔符,並在結尾加上$$
CREATE FUNCTION adduser2(username VARCHAR(20))
RETURNS INT UNSIGNED
BEGIN
INSERT inserttest(username) VALUES (username);
RETURN LAST_INSERT_ID();
END
$$
# 如果使navicat等工具,不用加$$
CREATE FUNCTION adduser2(username VARCHAR(20))
RETURNS INT UNSIGNED
BEGIN
INSERT inserttest(username) VALUES (username);
RETURN LAST_INSERT_ID();
END
# 使用複合函式adduser()
SELECT adduser('lalala');