1. 程式人生 > >MySQL基礎知識(五)——函式

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');