文章目錄
- mysql的內置函數
- 時間函數
- 1. 返回值的數據類型和格式
- 2. 功能側重點
- 3. 函數別名情況
- 我現在想給一個日期加上十天,然后輸出加上十天之后的日期,我該怎么做?
- 我現在想給一個日期減去兩天,然后輸出減去兩天之后的日期,我該怎么做?
- 我現在想計算兩個日期之間相差多少天,我該怎么做?
- 我現在創建出了一個表用來記錄生日,請問我如何向表中插入一條生日信息?
- 留言板問題
- 我現在想創建一個留言板,里面的每條記錄屬性包含id,留言的內容,還有留言的日期,我該怎么做?
- 我現在想往這個留言板中插入一條記錄,讓日期自動填充當前時間,我該怎么做?
- 我現在想給這個留言板添加一欄,用于存放發表評論的用戶名,我該怎么做?
- 我想輸出兩分鐘以內發出的所有帖子,我該怎么做?
- 字符串函數
- charset是什么意思?怎么用?
- concat是啥意思?怎么用?
- instr的作用是什么?怎么用?
- ucase和lcase的作用是什么?怎么用?
- left的作用是什么?怎么用?
- replace的作用是什么?怎么用?
- strcmp的作用是什么?怎么用?
- substring的作用是什么?怎么用?
- ltrim和rtrim的作用是什么?怎么用?
- 我現在想獲取emp表的ename列的字符集,我該怎么做?
- 我想在數據庫中,以特定格式展示student表中的信息,具體格式為:“XXX的語文是XXX分,數學是XXX分,英語是XXX分” ,我該怎么做?
- 我想求學生表中學生姓名占用的字節數 ,我該怎么做?
- 我想將EMP表ename欄所有名字中的S替換成上海,我該怎么做?
- 現在我想截取EMP表中ename字段的第二個到第三個字符 ,我該怎么做?
- 我想以首字母小寫的方式顯示所有員工的姓名,我該怎么做?
- 數學函數
- 取-100.2的絕對值
- 將23.04向上取整
- 將23.7向下取整
- 對12.3456保留2位小數位數(小數四舍五入)
- 產生隨機數
- 將十進制數10轉化成二進制數
- 將十進制數15轉化成16進制數
- 將16進制數10轉化成2進制數
- 求10除以-3的余數
- 我現在想生成一個1000以內的隨機數
- 其他函數
- 我現在想對一個字符串信息進行摘要加密,我該怎么做?
- ifnull(val1, val2) 這個表達式的值是多少?
mysql的內置函數
時間函數
在 MySQL 中,有三個比較常見的時間函數CURRENT_DATE()
、CURRENT_TIME()
和 CURRENT_TIMESTAMP()
,這三個函數有啥區別呢?
1. 返回值的數據類型和格式
CURRENT_DATE()
:- 數據類型:
DATE
類型。 - 格式:返回當前日期,格式為
YYYY-MM-DD
,只包含年、月、日信息,不包含時間部分。例如,在 2024年7月15日執行該函數,返回值為2024-07-15
。
- 數據類型:
CURRENT_TIME()
:- 數據類型:
TIME
類型。 - 格式:返回當前時間,格式為
HH:MM:SS
,只包含時、分、秒信息,不包含日期部分 。比如,在 14點35分20秒執行該函數,返回值為14:35:20
。
- 數據類型:
CURRENT_TIMESTAMP()
:- 數據類型:
DATETIME
類型 。 - 格式:返回當前日期和時間,格式為
YYYY-MM-DD HH:MM:SS
,既包含年、月、日,又包含時、分、秒。例如,在 2024年7月15日 14點35分20秒執行該函數,返回值為2024-07-15 14:35:20
。
- 數據類型:
2. 功能側重點
CURRENT_DATE()
:主要用于獲取當前日期,適用于僅需要日期信息的場景,比如統計當天的銷售記錄、計算某日期范圍內的天數等 。CURRENT_TIME()
:專注于獲取當前時間,在記錄操作具體時間點(只關注時間部分),或者進行時間相關的邏輯判斷(如判斷是否在某個時間段內)時會用到 。CURRENT_TIMESTAMP()
:提供完整的日期和時間信息,適用于需要精確記錄事件發生的日期和具體時刻的場景,比如記錄用戶登錄時間、訂單創建時間等 。
3. 函數別名情況
CURRENT_DATE()
:有別名CURDATE()
,二者功能完全相同,可根據個人習慣選用。CURRENT_TIME()
:有別名CURTIME()
,可以互相替換使用。CURRENT_TIMESTAMP()
:和NOW()
功能基本一致,都返回當前的日期和時間。不過在某些特殊場景下,NOW()
返回的是語句開始執行的時間,CURRENT_TIMESTAMP()
返回的是函數執行時的時間。
雖然這三個函數都是獲取當前相關的日期時間信息,但通過數據類型、格式以及功能側重點的差異,能滿足不同的業務需求。
我現在想給一個日期加上十天,然后輸出加上十天之后的日期,我該怎么做?
select + date_add()函數
,其中 date_add()第一個參數傳入日期,第二個參數傳入interval + 日期增量 + 增量單位
像這個題,你想加10天,那第二個參數就是interval 10 day ,如果你想加2年,那第二個參數就是interval 2 year
我現在想給一個日期減去兩天,然后輸出減去兩天之后的日期,我該怎么做?
select + date_sub()函數
,其中date_sub()函數第一個參數傳入日期,第二個參數傳入日期增量
我現在想計算兩個日期之間相差多少天,我該怎么做?
select datediff('日期1', '日期2');
我現在創建出了一個表用來記錄生日,請問我如何向表中插入一條生日信息?
insert into tmp(birthday) values(current_date());
留言板問題
我現在想創建一個留言板,里面的每條記錄屬性包含id,留言的內容,還有留言的日期,我該怎么做?
我現在想往這個留言板中插入一條記錄,讓日期自動填充當前時間,我該怎么做?
insert into msg(content, sendtime) values('這是一條評論', now());
我現在想給這個留言板添加一欄,用于存放發表評論的用戶名,我該怎么做?
ALTER TABLE msg ADD COLUMN username VARCHAR(50);
我想輸出兩分鐘以內發出的所有帖子,我該怎么做?
select * from msg where date_add(sendtime, interval 2 minute) > now();
字符串函數
charset是什么意思?怎么用?
如何查詢msg表中nickname這一列的數據編碼方式/采用的字符集?
select charset(nickname) from msg
concat是啥意思?怎么用?
concat可以將幾個小字符串連接成一個大字符串,使用方法如下
instr的作用是什么?怎么用?
instr(string, substring )
用來返回substring 在string中出現的位置
ucase和lcase的作用是什么?怎么用?
ucase可以將小寫字母轉成大寫字母,lcase可以將大寫字母轉化成小寫字母
使用方法是select + ucase/lcase(‘字符串’);
left的作用是什么?怎么用?
語法:left(string2, length)
作用:從string2中的左邊起截取length個字符
如果length的長度大于總長,或者lenth小于0,會出現在怎樣的情況呢?
length的長度大于總長,那么會返回整個字符串,如果lenth小于0,返回值為空
replace的作用是什么?怎么用?
在str中用replace_str替換search str
如果原字符串中沒有替換目標字符串search str ,此時我們執行replace操作,結果會怎樣呢?
結果原字符串無事發生,然后輸出
strcmp的作用是什么?怎么用?
作用是比較兩個字符串是否相等,用法是select + strcmp + (‘字符串1’, ‘字符串2’);
請問上圖中,為什么第一個結果是-1,第二個結果是1?
因為’aaa’第一個字符a的ASCII碼比’bbb’第一個字符b的ASCII碼小,所以第一個返回-1,第二個結果是1
substring的作用是什么?怎么用?
select substring(str, pos,length);
從str的pos下標開始,截取length長度的子字符串,然后返回輸出
如果lenth的值小于0,或者pos+lenth的長度超過了str的總長度,執行substring(str, pos,length);之后會出現什么結果呢?
如果lenth的值小于0,會返回空
如果pos+lenth的長度超過了str的總長度,那就會一直截取到str的末尾
ltrim和rtrim的作用是什么?怎么用?
ltrim(string):去除字符串左側(前)的空格
rtrim(string):去除字符串右側(后)的空格
trim(string):去除字符串左右兩側(前和后)的空格
我現在想獲取emp表的ename列的字符集,我該怎么做?
select charset(ename) from emp;
我想在數據庫中,以特定格式展示student表中的信息,具體格式為:“XXX的語文是XXX分,數學是XXX分,英語是XXX分” ,我該怎么做?
利用contat將幾個字符串連起來
SELECT CONCAT(name, '的語文是', chinese, '分,數學是', math, '分,英語是', english, '分') AS info FROM student;
我想求學生表中學生姓名占用的字節數 ,我該怎么做?
問題轉化:我想查看表中每條記錄的name屬性信息各占多少字節,我該怎么做?
select lenth(name) from exam_result;
注意:lenth(str),并不是求str有多少個字符。而是求str占多少個字節
我想將EMP表ename欄所有名字中的S替換成上海,我該怎么做?
這個是原表
使用replace語句替換ename列中的關鍵字
提問:執行過replace語句之后,數據庫中ename列中的關鍵字會被永久修改嗎?
不會,這個操作的實際流程是,select先篩選,再對篩選之后的結果(形成一份新文件)進行replace操作
現在我想截取EMP表中ename字段的第二個到第三個字符 ,我該怎么做?
調用substring函數
select substring(ename, 2,1) from emp;
我想以首字母小寫的方式顯示所有員工的姓名,我該怎么做?
- 先使用 SUBSTRING(name, 1, 1) 提取姓名的首字母
- 再用 LOWER 函數將其轉換為小寫
- 接著使用 SUBSTRING(name, 2) 獲取姓名從第二個字符開始的部分
- 最后用 CONCAT 函數將二者拼接起來。
select concat(lcase(SUBSTRING(name, 1, 1)), SUBSTRING(name, 2)) from emp;
數學函數
取-100.2的絕對值
select abs(-100.2);
將23.04向上取整
select ceiling(23.04);
ceiling的意思是天花板
將23.7向下取整
select floor(23.7);
floor的英文意思是地板
對12.3456保留2位小數位數(小數四舍五入)
select format(12.3456, 2);
產生隨機數
select rand();
將十進制數10轉化成二進制數
bin(decimal_number):用于將十進制數轉換為二進制數,例如 bin(10) 會得到 ‘1010’
將十進制數15轉化成16進制數
hex(decimalNumber):把十進制數轉換成十六進制數,像 hex(15) 結果是 ‘F’ 。
將16進制數10轉化成2進制數
conv(number, from_base, to_base):實現數的進制轉換
其中number 是要轉換的數,from_base 是當前進制,to_base 是目標進制
比如 conv(10, 10, 2) 可將十進制的 10 轉換為二進制,得到 ‘1010’
conv(10, 2, 16) 可將二進制的 10 轉換為16進制,得到 2
求10除以-3的余數
mod(number, denominator):求余函數,計算 number 除以 denominator 的余數
例如 mod(7, 3) 返回 1 。
解釋圖中的結果
在 MySQL 中,MOD()函數用于取模運算,其運算規則基于公式a mod b = a - (b * FLOOR(a / b))
,這里FLOOR 是向下取整函數 。以下是對圖中三個運算的解釋:
SELECT MOD(10, -3);
先計算 10 / -3 ,結果約為 -3.33 。
然后對 -3.33 向下取整,得到 -4 。
再根據公式計算 10 - (-3 * -4) = 10 - 12 = -2 ,但 MySQL 中取模結果符號與被除數一致 ,被除數是 10 ,所以最終結果為 1 。
SELECT MOD(-10, 3);
計算 -10 / 3 ,結果約為 -3.33 。
向下取整得到 -4 。
由公式可得 -10 - (3 * -4) = -10 + 12 = 2 ,按照 MySQL 規則,結果符號與被除數一致,最終結果為 -1 。
SELECT MOD(-10, -3);
計算 -10 / -3 ,結果約為 3.33 。
向下取整得到 3 。
依據公式計算 -10 - (-3 * 3) = -10 + 9 = -1 ,結果符號與被除數一致,最終結果就是 -1 。
我現在想生成一個1000以內的隨機數
mysql中rand生成隨機數的范圍是多少?
在 MySQL 里,RAND()函數會生成一個范圍在 0(包含)到 1(不包含)之間的隨機浮點數
SELECT FLOOR(RAND() * 1000);
SELECT FLOOR(RAND() * 1000);
這條語句的執行結果是一個介于 0 到 999 之間的隨機整數(包含 0 和 999)。
-
RAND()
:生成一個 0(包含)到 1(不包含)之間的隨機浮點數,例如0.123
、0.987
等。 -
RAND() * 1000
:將隨機數放大 1000 倍,結果變為 0(包含)到 1000(不包含)之間的浮點數,例如123.456
、999.999
等。 -
FLOOR(...)
:對結果進行向下取整,只保留整數部分,且不四舍五入。例如:- 若
RAND() * 1000
結果為123.456
,FLOOR
后得到123
; - 若結果為
999.999
,FLOOR
后得到999
; - 若結果為
0.123
,FLOOR
后得到0
。
- 若
因此,最終結果是 0 到 999 之間的隨機整數,每次執行可能返回不同的值。
其他函數
我現在想對一個字符串信息進行摘要加密,我該怎么做?
用md5對密碼進行加密:select md5('str')
md5是什么?
MD5(Message-Digest Algorithm 5)屬于一種廣泛使用的哈希函數,能夠把任意長度的數據變換成固定長度(128 位)的哈希值。在數據庫里,該函數常常被用于數據加密、數據完整性校驗等場景。
添加一個新用戶時,先對密碼進行加密,然后插入insert into user (name, passwd) values ('zhangsan', md5('123456'));
其中md5(‘123456’)表示對密碼’123456’進行加密,md5(‘123456’)作為參數,傳入value,完成密碼的插入
既然如此,那我插入的密碼已經不是我最開始的密碼了,我還能通過密碼在數據庫中檢索到我剛剛插入的那條記錄嗎?
可以的兄弟,條件語句可以寫成where passwd=md5(‘123456’),這樣就能查到
ifnull(val1, val2) 這個表達式的值是多少?
這就是我們C語言中的if語句
if(val1==null) return val2;
else if(val1!=null) return val1;