mysql常用function


前言: 本文主要是參考mysql官方文檔,並加上自己的測試用例,來加深自己對mysql函數的理解,也借此平台與大家分享,如有不妥和錯誤之處歡迎讀者評論,我會及時改正,願與大家一起學習進步。

概述: 所謂function(特指mysql函數)就是mysql服務器預先編寫的函數,來供我們使用。這些函數可用在where,ORDER BY ,HAVING用於查詢條件,也可用於select之后用於顯示給我們....比較難概述呵呵。

注意:默認情況下,函數名稱和后面的括號之間不應有空格 ,例如CONCAT('My',  'S',  'QL')。這有助於MySQL解析器區分函數調用和對恰好與函數同名的表或列的引用。是否可以使用和--sql-mode=IGNORE_SPACE有關。

零:1TRUE)或 0FALSE

一:流程控制 

1.1 CASE

語法一:
CASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN result ...] [ELSE result] END
語法二:
CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END

eg1(語法1):SELECT CASE 1 WHEN 1 THEN 'one'  WHEN 2 THEN 'two' ELSE 'more' END;     -> 'one'

eg2(語法2):SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;        -> 'true'

1.2 IF(expr1,expr2,expr3)  如果表達式1成立,則輸出2,否則輸出2

eg1: mysql>  SELECT IF(1>2,2,3);    -> 3

eg2: select if(count(a)=22,'yes','no') from test where a='a';  

1.3 IFNULL(expr1,expr2)   NULLIF(expr1,expr2)

二:字符串比較like  

語法:expr LIKE pat [ESCAPE 'escape_char']   //可選參數escape 是指定轉義字符

eg:SELECT 'a' = 'a ', 'a' LIKE 'a '; // 注意空格  like和=的區別

SELECT 'a' = 'a ', 'a' LIKE 'a ';
+------------+---------------+
| 'a' = 'a ' | 'a' LIKE 'a ' |
+------------+---------------+
|          1 |             0 |
+------------+---------------+

like:統配符   

  • 匹配0個或多個字符。

  • 只匹配一個字符。

eg2 :mysql> SELECT 'David!' LIKE 'David_';     -> 1

  mysql> SELECT 'David!' LIKE '%D%v%';    -> 1:

轉義字符:

eg3:mysql> SELECT 'David!' LIKE 'David\_';    -> 0

  mysql> SELECT 'David_' LIKE 'David\_';    -> 1

指定轉義字符‘’

  mysql> SELECT 'David_' LIKE 'David|_' ESCAPE '|'; -> 1

 

三:正則表達式 參考文獻

 ^ : 匹配開頭  

mysql> SELECT 'fofo' REGEXP '^fo$';                   -> 0
mysql> SELECT 'fofo' REGEXP '^fo';                      -> 1

$ :匹配尾部

mysql> SELECT 'fofo' REGEXP '^fofo$';                 -> 1

.   :匹配任意字符

SELECT 'fofo' REGEXP '^f.*$';
+-----------------------+
| 'fofo' REGEXP '^f.*$' |
+-----------------------+
|                     1 |
+-----------------------+

a*  :匹配零個或多個a 字符(*修飾前一個符號)

mysql> SELECT 'Ban' REGEXP '^Ba*n'; -> 1 
mysql> SELECT 'Baaan' REGEXP '^Ba*n'; -> 1


SELECT
'Bn' REGEXP '^B.*n$'; +----------------------+ | 'Bn' REGEXP '^B.*n$' | +----------------------+ | 1 | +----------------------+

a? :匹配零個或一個a字符 (?修飾前一個符號)

mysql> SELECT 'Bn' REGEXP '^Ba?n';                      -> 1
mysql> SELECT 'Ban' REGEXP '^Ba?n';                     -> 1
mysql> SELECT 'Baan' REGEXP '^Ba?n';                    -> 0

de|abc :或 

mysql> SELECT 'pi' REGEXP 'pi|apa';                     -> 1
mysql> SELECT 'axe' REGEXP 'pi|apa';                    -> 0
mysql> SELECT 'apa' REGEXP 'pi|apa';                    -> 1
mysql> SELECT 'apa' REGEXP '^(pi|apa)$';                -> 1
mysql> SELECT 'pi' REGEXP '^(pi|apa)$';                 -> 1
mysql> SELECT 'pix' REGEXP '^(pi|apa)$';                -> 0

(abc)* :()里面是個整體  匹配0個或多個()中的內容

mysql> SELECT 'pi' REGEXP '^(pi)*$';                    -> 1
mysql> SELECT 'pip' REGEXP '^(pi)*$';                   -> 0
mysql> SELECT 'pipi' REGEXP '^(pi)*$';                  -> 1

{1}{2,3}: 和其他正則表達式規則一樣

[a-dX][^a-dX] :

 四:數據庫加密AES(可實現加解密功能,)

AES_ENCRYPT()AES_DECRYPT()函數使用官方的AES算法實現數據的加密和解密,該算法以前稱為 “ Rijndael”,

加密:AES_ENCRYPT(str,key_str[,init_vector]) 通過秘鑰key_str對str進行加密,並返回二進制字符串(crypt_str)

解密:AES_DECRYPT(crypt_str,key_str[,init_vector]) 通過秘鑰key_str對加密后的字符串解密(默認使用128,MySQL 5.7.4以上才支持192和256)

eg:

步驟一:建表
CREATE  TABLE `user` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT ,
`first_name` VARBINARY(100) NULL ,
`address` VARBINARY(200) NOT NULL ,
PRIMARY KEY (`id`)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci
步驟二:插入加密數據
mysql> insert into user (first_name, address) VALUES (AES_ENCRYPT('Obama', 'usa2010'),AES_ENCRYPT('Obama', 'usa2010'));
Query OK, 1 row affected (0.03 sec)
步驟三:查看源數據
mysql> select * from user;
+----+------------------+------------------+
| id | first_name       | address          |
+----+------------------+------------------+
|  1 | b▒▒▒H1bT▒▒&▒m▒        | b▒▒▒H1bT▒▒&▒m▒        |
+----+------------------+------------------+
1 row in set (0.00 sec)
步驟四:查看解密數據
mysql> SELECT AES_DECRYPT(first_name, 'usa2010'), AES_DECRYPT(address, 'usa2010') from user;
+------------------------------------+---------------------------------+
| AES_DECRYPT(first_name, 'usa2010') | AES_DECRYPT(address, 'usa2010') |
+------------------------------------+---------------------------------+
| Obama                              | Obama                           |
+------------------------------------+---------------------------------+

五:數據庫加密MD5 全稱是Message-Digest Algorithm 5(信息-摘要算法)故只是信息的摘要算法其並不算加密算法

MD5(str) :計算'str'字符串的MD5值,並返回32位的字符串 (所有的MD5算法都是一樣的)

eg : mysql> SELECT MD5('testing');    -> 'ae2b1fca515949e5d54fb22b8ed95575'

eg :java:MD5

package com.jinliang.springboot.testUtil;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5_Test {
    public static void main(String[] args) throws NoSuchAlgorithmException {
        // 拿到一個MD5轉換器(如果想要SHA1加密參數換成"SHA1")
        MessageDigest messageDigest = MessageDigest.getInstance("MD5");
        // 輸入的字符串轉換成字節數組
        byte[] inputByteArray = "testing".getBytes();
        // inputByteArray是輸入字符串轉換得到的字節數組
        messageDigest.update(inputByteArray);
        // 轉換並返回結果,也是字節數組,包含16個元素
        byte[] resultByteArray = messageDigest.digest();
        // 字符數組轉換成字符串返回
        System.out.println(byteArrayToHex(resultByteArray));

    }
    public static String byteArrayToHex(byte[] byteArray) {
        // 首先初始化一個字符數組,用來存放每個16進制字符
        char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
        // new一個字符數組,這個就是用來組成結果字符串的(解釋一下:一個byte是八位二進制,也就是2位十六進制字符)
        char[] resultCharArray = new char[byteArray.length * 2];
        // 遍歷字節數組,通過位運算(位運算效率高),轉換成字符放到字符數組中去
        int index = 0;
        for (byte b : byteArray) {
            resultCharArray[index++] = hexDigits[b >>> 4 & 0xf];
            resultCharArray[index++] = hexDigits[b & 0xf];
        }
        // 字符數組組合成字符串返回
        return new String(resultCharArray);
    }
}

 六:日期和時間函數

表12。13日期和時間函數(摘錄官方文檔

名稱 描述
ADDDATE() 將時間值(間隔)添加到日期值
ADDTIME() 添加時間
CONVERT_TZ() 從一個時區轉換為另一個時區
CURDATE() 返回當前日期
CURRENT_DATE(), CURRENT_DATE CURDATE()的同義詞
CURRENT_TIME(), CURRENT_TIME CURTIME()的同義詞
CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP 同義詞NOW()
CURTIME() 返回當前時間
DATE() 提取日期或日期時間表達式的日期部分
DATE_ADD() 將時間值(間隔)添加到日期值
DATE_FORMAT() 格式化日期指定
DATE_SUB() 從日期中減去時間值(間隔)
DATEDIFF() 減去兩個日期
DAY() DAYOFMONTH()的同義詞
DAYNAME() 返回工作日的名稱
DAYOFMONTH() 返回月中的某一天(0-31)
DAYOFWEEK() 返回參數的工作日索引
DAYOFYEAR() 返回一年中的某一天(1-366)
EXTRACT() 提取部分日期
FROM_DAYS() 將日期號碼轉換為日期
FROM_UNIXTIME() 將Unix時間戳格式化為日期
GET_FORMAT() 返回日期格式字符串
HOUR() 提取小時
LAST_DAY 返回參數的月份的最后一天
LOCALTIME(), LOCALTIME NOW()的同義詞
LOCALTIMESTAMP, LOCALTIMESTAMP() NOW()的同義詞
MAKEDATE() 創建年份和年中的日期
MAKETIME() 從小時,分鍾,秒創建時間
MICROSECOND() 從參數返回微秒
MINUTE() 從論證中返回分鍾
MONTH() 從過去的日期返回月份
MONTHNAME() 返回月份名稱
NOW() 返回當前日期和時間
PERIOD_ADD() 將期間添加到年 - 月
PERIOD_DIFF() 返回句點之間的月數
QUARTER() 從日期參數返回季度
SEC_TO_TIME() 將秒轉換為'HH:MM:SS'格式
SECOND() 返回秒(0-59)
STR_TO_DATE() 將字符串轉換為日期
SUBDATE() 使用三個參數調用時DATE_SUB()的同義詞
SUBTIME() 減去時間
SYSDATE() 返回函數執行的時間
TIME() 提取傳遞的表達式的時間部分
TIME_FORMAT() 格式化為時間
TIME_TO_SEC() 返回轉換為秒的參數
TIMEDIFF() 減去時間
TIMESTAMP() 使用單個參數,此函數返回日期或日期時間表達式; 有兩個參數,參數的總和
TIMESTAMPADD() 在datetime表達式中添加間隔
TIMESTAMPDIFF() 從日期時間表達式中減去間隔
TO_DAYS() 返回轉換為days的日期參數
TO_SECONDS() 返回自0年以來轉換為秒的日期或日期時間參數
UNIX_TIMESTAMP() 返回Unix時間戳
UTC_DATE() 返回當前的UTC日期
UTC_TIME() 返回當前的UTC時間
UTC_TIMESTAMP() 返回當前的UTC日期和時間
WEEK() 返回周數
WEEKDAY() 返回工作日索引
WEEKOFYEAR() 返回日期的日歷周(1-53)
YEAR() 回歸年份
YEARWEEK() 返回年份和星期

eg1:TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2) 返回 datetime_expr2-datetime_expr1單位是unit,常用單位有 SECONDMINUTEHOURDAYWEEK, MONTHQUARTERYEAR

mysql> SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01') as month;
+-------+
| month |
+-------+
|     3 |
+-------+
1 row in set (0.00 sec)

mysql> SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2013-05-01') as diff;
+------+
| diff |
+------+
|  123 |
+------+
1 row in set (0.00 sec)
//curdate()獲取當前日期
mysql> SELECT TIMESTAMPDIFF(MONTH,'2003-02-01',curdate()) as diff;
+------+
| diff |
+------+
|  192 |
+------+
1 row in set (0.00 sec)
View Code

eg2:DATE_FORMAT(date,format) 根據date格式化字符串為指定形式

form參數

format字符串中 可以使用以下說明 符。%格式說明符字符前需要該 字符。

符    描述
%a    工作日縮寫名稱(Sun.. Sat)
%b    縮寫的月份名稱(Jan.. Dec)
%c    月,數字(0.. 12)
%D    這個月的一天,英語后綴(0th, 1st,2nd, 3rd,...)
%d    每月的某一天,數字(00.. 31)
%e    每月的某一天,數字(0.. 31)
%f    微秒(000000... 999999)
%H    小時(00.. 23)
%h    小時(01.. 12)
%I    小時(01.. 12)
%i    分鍾,數字(00.. 59)
%j    一年中的一天(001.. 366)
%k    小時(0.. 23)
%l    小時(1.. 12)
%M    月份名稱(January.. December)
%m    月,數字(00.. 12)
%p    AM 要么 PM
%r    時間,12小時(hh:mm:ss其次是 AM或PM)
%S    秒(00... 59)
%s    秒(00... 59)
%T    時間,24小時(hh:mm:ss)
%U    周(00.. 53),周日是一周的第一天; WEEK()模式0
%u    周(00.. 53),周一是一周的第一天; WEEK()模式1
%V    周(01.. 53),周日是一周的第一天; WEEK()模式2; 用於 %X
%v    周(01.. 53),周一是一周的第一天; WEEK()模式3; 用於 %x
%W    工作日名稱(Sunday.. Saturday)
%w    星期幾(0=星期日.. 6=星期六)
%X    星期日是星期的第一天的星期,數字,四位數; 用於%V
%x    一周的年份,星期一是一周的第一天,數字,四位數; 用於%v
%Y    年份,數字,四位數
%y    年份,數字(兩位數)
%%    文字%字符
%x    x,對於上面未列出的任何 “ x”
View Code
mysql> SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y');
+------------------------------------------------+
| DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y') |
+------------------------------------------------+
| Sunday October 2009                            |
+------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT DATE_FORMAT(curdate(), '%W %M %Y');
+------------------------------------+
| DATE_FORMAT(curdate(), '%W %M %Y') |
+------------------------------------+
| Tuesday February 2019              |
+------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT DATE_FORMAT('2009-10-04', '%W %M %Y');
+---------------------------------------+
| DATE_FORMAT('2009-10-04', '%W %M %Y') |
+---------------------------------------+
| Sunday October 2009                   |
+---------------------------------------+
1 row in set (0.00 sec)

七:其他字符串函數

MySQL 5.7參考手冊  /  函數和操作符  /字符串函數
12.5字符串函數
12.5.1字符串比較函數
12.5.2正則表達式
12.5.3函數結果的字符集和校對
表12.7字符串運算符

名稱    描述
ASCII()    返回最左側字符的數值
BIN()    返回包含數字的二進制表示的字符串
BIT_LENGTH()    以位為單位返回參數長度
CHAR()    返回傳遞的每個整數的字符
CHAR_LENGTH()    返回參數中的字符數
CHARACTER_LENGTH()    CHAR_LENGTH()的同義詞
CONCAT()    返回連接字符串
CONCAT_WS()    返回與分隔符連接
ELT()    返回索引號處的字符串
EXPORT_SET()    返回一個字符串,使得對於值位中設置的每個位,您獲得一個on字符串,並且對於每個未設置的位,您將得到一個關閉字符串
FIELD()    返回后續參數中第一個參數的索引(位置)
FIND_IN_SET()    返回第二個參數中第一個參數的索引位置
FORMAT()    返回格式化為指定小數位數的數字
FROM_BASE64()    解碼base64編碼的字符串並返回結果
HEX()    返回十進制或字符串值的十六進制表示形式
INSERT()    在指定位置插入一個子字符串,直到指定的字符數
INSTR()    返回第一次出現的子串的索引
LCASE()    LOWER()的同義詞
LEFT()    返回指定的最左邊的字符數
LENGTH()    以字節為單位返回字符串的長度
LIKE    簡單的模式匹配
LOAD_FILE()    加載指定的文件
LOCATE()    返回第一次出現的子串的位置
LOWER()    以小寫形式返回參數
LPAD()    返回字符串參數,使用指定的字符串進行左填充
LTRIM()    刪除前導空格
MAKE_SET()    返回一組以逗號分隔的字符串,這些字符串具有相應的位設置位
MATCH    執行全文搜索
MID()    返回從指定位置開始的子字符串
NOT LIKE    簡單模式匹配的否定
NOT REGEXP    REGEXP的否定
OCT()    返回包含數字的八進制表示的字符串
OCTET_LENGTH()    LENGTH()的同義詞
ORD()    返回參數最左側字符的字符代碼
POSITION()    LOCATE()的同義詞
QUOTE()    轉義參數以在SQL語句中使用
REGEXP    string是否匹配正則表達式
REPEAT()    重復指定次數的字符串
REPLACE()    替換指定字符串的出現次數
REVERSE()    反轉字符串中的字符
RIGHT()    返回指定的最右邊的字符數
RLIKE    string是否匹配正則表達式
RPAD()    追加指定次數的字符串
RTRIM()    刪除尾隨空格
SOUNDEX()    返回soundex字符串
SOUNDS LIKE    比較聲音
SPACE()    返回指定數量的空格的字符串
STRCMP()    比較兩個字符串
SUBSTR()    返回指定的子字符串
SUBSTRING()    返回指定的子字符串
SUBSTRING_INDEX()    在指定的分隔符出現次數之前從字符串返回子字符串
TO_BASE64()    返回轉換為base-64字符串的參數
TRIM()    刪除前導和尾隨空格
UCASE()    UPPER()的同義詞
UNHEX()    返回包含數字的十六進制表示的字符串
UPPER()    轉換為大寫
WEIGHT_STRING()    返回字符串的權重字符串
View Code

eg1:CONCAT(str1,str2,.....)  連接多個字符串。

mysql> SELECT CONCAT('My', 'S', 'QL');
+-------------------------+
| CONCAT('My', 'S', 'QL') |
+-------------------------+
| MySQL                   |
+-------------------------+
1 row in set (0.00 sec)

mysql> SELECT CONCAT('My', NULL, 'QL');
+--------------------------+
| CONCAT('My', NULL, 'QL') |
+--------------------------+
| NULL                     |
+--------------------------+
1 row in set (0.00 sec)

mysql> select concat(name,' 分數:',score) from students;
+-------------------------------+
| concat(name,' 分數:',score)   |
+-------------------------------+
| 小白 分數:81                  |
| 小兵 分數:55                  |
| 小林 分數:85                  |
| 小新 分數:91                  |
| 小王 分數:89                  |
| 小麗 分數:85                  |
| 小路 分數:81                  |
| NULL                          |
+-------------------------------+
8 rows in set (0.01 sec)

備注:如果有字符串為null時,則返回的數據也是null

eg2:LOWER(str) 返回字符串的小寫形式  

  mysql> SELECT LOWER('QUADRATICALLY'); -> 'quadratically'

eg3:RIGHT(str,len) 返回字符串右邊  可類比LEFT(str,len)

  mysql> SELECT RIGHT('foobarbar', 4); -> 'rbar'

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM