MySQL聚合、日期、字符串等函數(shù)深度剖析
MySQL系列
前言
MySQL 提供了豐富的內(nèi)置函數(shù),用于處理數(shù)據(jù)、執(zhí)行計算、轉(zhuǎn)換格式等操作,本篇將介紹MySQL中常用的一些函數(shù)。本篇文章內(nèi)容已操作為主
這里的函數(shù)比較簡單,不再解釋了,再對其解釋就有一種強說愁的感覺了
上篇文章:MySQL 數(shù)據(jù)操作全流程:創(chuàng)建、讀取、更新與刪除實戰(zhàn)
一、聚合函數(shù)
這部分函數(shù)都比較簡單
| 函數(shù)名 | 作用 | 示例 | 結(jié)果 |
|---|---|---|---|
SUM(col) | 求和 | SUM(amount) | 所有 amount 的總和 |
AVG(col) | 平均值 | AVG(age) | 平均年齡 |
COUNT(col) | 計數(shù)(忽略 NULL) | COUNT(id) | 行數(shù) |
COUNT(*) | 計數(shù)(包含 NULL) | COUNT(*) | 總行數(shù) |
MAX(col) | 最大值 | MAX(score) | 最高分數(shù) |
MIN(col) | 最小值 | MIN(price) | 最低價格 |
測試表
CREATE TABLE students ( id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, sn INT NOT NULL UNIQUE COMMENT '學號', name VARCHAR(20) NOT NULL, qq VARCHAR(20) ); create table exam_result ( id int unsigned primary key auto_increment, name varchar(20) not null comment '同學姓名', chinese float default 0.0 comment '語文成績', math float default 0.0 comment '數(shù)學成績', english float default 0.0 comment '英語成績' );
表內(nèi)容


本篇文章主要以上面兩表做測試,上篇文章中已經(jīng)創(chuàng)建,這里直接使用
1、統(tǒng)計班級共有多少同學
select count(*) from students;

2、統(tǒng)計班級有多少 qq 號
select count(qq) from students;

對比上表可以看到count函數(shù),對于NULL值,不做統(tǒng)計。
3、統(tǒng)計本次考試的數(shù)學成績分數(shù)個數(shù)
select count(math) from exam_result;

對比上表可以看到count函數(shù),對于重復(fù)值,不做統(tǒng)計。
4、統(tǒng)計數(shù)學成績不及格人數(shù)
select count(math) from exam_result where math<60;

count函數(shù)可以配合其他語句使用。
5、統(tǒng)計平均總分
select avg(math+chinese+english) 平均總分 from exam_result ;

6、返回英語最高分
select max(english) from exam_result ;

7、返回 > 70 分以上的數(shù)學最低分
select min(math) from exam_result where math >70;

二、日期函數(shù)

1、獲取當前年月日
select current_date();

2、獲取當前時分秒
select current_time;

3、獲取時間戳
select current_timestamp;

4、在時間中提取日期部分
select date(current_timestamp());

5、在日期的基礎(chǔ)上加上日期
select date_add(current_date,interval 10 day);

獲取當前日期,并在該日期的基礎(chǔ)上增加十天
interval后可以根據(jù)需要使用不同單位(年、月、日、分、秒)
6、在日期的基礎(chǔ)上減去日期
select date_sub(current_date,interval 10 day);

獲取當前日期,并在該日期的基礎(chǔ)上減去十天
7、計算兩個日期之間相差多少天
select datediff(current_date,'1949-10-01');

中國成立,距今多少天
8、獲取當前日期和時間
select now();

9、測試
//創(chuàng)建一個留言表
create table msg (
id int primary key auto_increment,
content varchar(30) not null,
sendtime datetime
);
//向表中插入測試數(shù)據(jù)
insert into msg(content,sendtime) values('hello1', now());
insert into msg(content,sendtime) values('hello2', now());
select * from msg;顯示所有留言信息,發(fā)布日期只顯示日期,不用顯示時間:

查詢在1分鐘內(nèi)發(fā)布的帖子:

可以看到日期是支持直接比較的
三、字符串函數(shù)
函數(shù)都可以配合select操作對表中的數(shù)據(jù)進行操作,這里僅對部分場景做演示

1、查看字符串的字符集
select charset(string);

2、要求顯示exam_result表中的信息,顯示格式:“XXX的語文分:XXX,數(shù)學分:XXX,英語分:XXX”

3、在字符串中查找字符串
select instr(string,substring);
在string中查找字符串substring出現(xiàn)的位置,找到返回下標(從1開始),未找到返回0。

當目標字符串重復(fù)出現(xiàn)時,返回的時第一次出現(xiàn)的下標
4、字符串轉(zhuǎn)為大寫
select ucase(strig);

5、字符串轉(zhuǎn)為小寫
select lcase(string);

6、從字符串左端提取len個字符
select left(string,len);

6、從字符串右端提取len個字符
select right(string,len);

7、求字符串占用的字節(jié)數(shù)
selecty

length()函數(shù)在 MySQL 中計算的是字符串的字節(jié)長度,而不是字符個數(shù),當前所使用的字符集漢字占三個字節(jié)。
8、在字符串中進行字符串的替換 replace
select replace(substring,string,str);
在substring中查找string,并將其替換為str

這種替換方式不會影響原表內(nèi)容,若未找到則不做處理
9、字符串截取 substring
select substring(string,pos,len);

從字符串string的pos處開始,向后截取len個字符。
10、去除字符串中最開始和最后的空格 trim
- trime:去除字符串兩端空格
- ltrim:去除字符串最左邊的空格
- rtrim:去除字符串右邊的

在保存用戶信息數(shù)據(jù)時,一般先對數(shù)據(jù)執(zhí)行去除空格操作。由于網(wǎng)絡(luò)傳輸過程可能引入不可見空字符,若直接存儲含此類字符的數(shù)據(jù),后續(xù)用戶登錄時,比如輸入密碼因存在空格匹配不上,會引發(fā)登錄失敗問題,且排查難度極大。所以,要先過濾掉字符串中的空格,再將處理后的數(shù)據(jù)存入數(shù)據(jù)庫,以此規(guī)避因隱性空格導致的登錄故障
四、數(shù)學函數(shù)

1、abs 取絕對值
select abs(N);

2、bin 轉(zhuǎn)二進制
select bin(N);

可以看到在對小數(shù),進行二進制轉(zhuǎn)換時,會將小數(shù)進行向下取整后再操作。
3、hex 轉(zhuǎn)十六進制
select hex(N);

4、 conv 進制轉(zhuǎn)換
select conv(N,fromm_base,to_base);
將數(shù)字N,從from_base進制 轉(zhuǎn)換成 to_base進制.

5、format 格式化,保留小數(shù)
select format(N,D);

將N保留D位小數(shù),處理小數(shù)部分遵循四舍五入,若小數(shù)部分不夠就補0.
6 mod 取模
select mod(x,y);

mod返回x對y取模的值,這里負數(shù)取模的方式大家可以自己嘗試。
7、rand生成隨機數(shù)
select rand();

生成的數(shù)是從 0.0 ~ 1.0,若想要生成指定范圍的我們就直接 * 10n即可實現(xiàn)(如 * 10的話就是 0 ~ 10)
8、ceiling 向上取整
select ceiling(N);

可以看到向上取整,就是當存在小述部分時,去掉小鼠部分直接+1;
9、floor 向下取整
select floor(N);

五、其他函數(shù)
1、查看當前用戶 user
select user();

獲取當前連接到 MySQL 服務(wù)器的用戶信息,返回結(jié)果的格式為 用戶名@主機名'
2、database查看當前數(shù)據(jù)庫
select database();

返回當前會話中使用的數(shù)據(jù)庫名稱
3、md5 加密
在實際開發(fā)中,密碼通常不會以明文形式直接存儲在數(shù)據(jù)庫中,而 MD5 哈希算法是常用的密碼加密方案之一。其核心作用是將原始密碼通過加密計算轉(zhuǎn)換為一段固定長度(32 位)的哈希字符串,從而避免明文密碼在存儲或傳輸過程中泄露的風險。

這種加密方式,缺點很多,這個我在網(wǎng)絡(luò)傳輸部分已經(jīng)介紹了,這里就補贅述了。
4、ifnull(val1,val2)
當 val1 為 NULL 時返回 val2,否則返回 val1 本身

到此這篇關(guān)于MySQL聚合、日期、字符串等函數(shù)深度剖析的文章就介紹到這了,更多相關(guān)mysql聚合日期字符串函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql 啟動1067錯誤及修改字符集重啟之后復(fù)原無效問題
這篇文章主要介紹了mysql 啟動1067錯誤及修改字符集重啟之后復(fù)原無效問題,需要的朋友可以參考下2017-10-10
mysql處理添加外鍵時提示error 150 問題的解決方法
當你試圖在mysql中創(chuàng)建一個外鍵的時候,這個出錯會經(jīng)常發(fā)生,這是非常令人沮喪的2011-11-11
Mysql事務(wù)的隔離級別(臟讀+幻讀+可重復(fù)讀)
這篇文章主要介紹了Mysql事務(wù)的隔離級別(臟讀+幻讀+可重復(fù)讀),文章通告InnoDB展開詳細內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下2022-08-08
MySQL數(shù)據(jù)庫查詢之多表查詢總結(jié)
最近遇到了多表查詢的需求,也稱為關(guān)聯(lián)查詢,指兩個或更多個表一起完成查詢操作,下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫查詢之多表查詢的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-08-08

