一撼泛、函數(shù)
MySQL數(shù)據(jù)庫(kù)中提供了很豐富的函數(shù)挠说。MySQL函數(shù)包括數(shù)學(xué)函數(shù)、字符串函數(shù)愿题、日期和時(shí)間函數(shù)损俭、條件判斷函數(shù)、系統(tǒng)信息函數(shù)潘酗、加密函數(shù)杆兵、格式化函數(shù)等。通過(guò)這些函數(shù)仔夺,可以簡(jiǎn)化用戶的操作琐脏。
(一)數(shù)學(xué)函數(shù)
函數(shù) | 功能 |
---|---|
ABS(x) | 求絕對(duì)值 |
PI() | 返回圓周率 |
SQRT(x) | 平方根函數(shù) |
MOD(x,y) | 求余函數(shù) |
RAND()和RAND(x) | 獲取隨機(jī)數(shù)的函數(shù) |
ROUND(x)、ROUND(x,y)和TRUNCATE(x,y) | 四舍五入函數(shù) |
SIGN(x) | 符號(hào)函數(shù) |
POW(x,y)、POWER(x,y)和EXP(x) | 冪運(yùn)算函數(shù) |
LOG(x)和LOG10(x) | 對(duì)數(shù)運(yùn)算函數(shù) |
(二)字符串函數(shù)
函數(shù) | 功能 |
---|---|
CHAR_LENGTH(s) | 計(jì)算字符串s的字符數(shù) |
LENGTH(s) | 計(jì)算字符串s的長(zhǎng)度 |
CONCAT(s1,s2,...) | 將s1日裙、s2等多個(gè)字符串合并成一個(gè)字符串 |
CONCAT_WS(x,s1,s2,...) | 將s1吹艇、s2等多個(gè)字符串合并成一個(gè)字符串,但可將各字符串直接用參數(shù)x隔開(kāi) |
UPPER(s)和UCASE(s) | 將字符串s的所有字母變成大寫(xiě)字母 |
LOWER(s)和LCASE(s) | 將字符串s的所有字母變成小寫(xiě)字母 |
REPEAT(s,n) | 將字符串s重復(fù)n次 |
STRCMP(s1,s2) | 比較字符串s1和s2昂拂。如果s1大于s2受神,結(jié)果返回1;如果s1等于s2格侯,結(jié)果返回0鼻听;如果s1小于s2,結(jié)果返回-1联四。 |
REVERSE(s) | 將字符串s的順序反過(guò)來(lái) |
SUBSTRING(s,a,b) | 從字符串s中的第a個(gè)字符開(kāi)始取b個(gè)字符 |
(三)日期和時(shí)間函數(shù)
函數(shù) | 功能 |
---|---|
CURDATE()和CURRENT_DATE() | 獲取當(dāng)前日期 |
CURTIME()和CURRENT_TIME() | 獲取當(dāng)前時(shí)間 |
NOW()撑碴、CURRENT_TIMESTAMP()、LOCALTIME()和SYSDATE() | 獲取當(dāng)前的日期和時(shí)間 |
UNIX_TIMESTAMP() | 以UNIX時(shí)間戳的形式返回當(dāng)前時(shí)間 |
UNIX_TIMESTAMP(d) | 將時(shí)間d以UNIX時(shí)間戳的形式返回 |
FROM_UNIXTIME(d) | 把UNIX時(shí)間戳的時(shí)間轉(zhuǎn)換為普通格式的時(shí)間 |
MONTH(d) | 返回日期d中的月份值碎连,其取值范圍是1~12 |
MONTHNAME(d) | 返回日期d中的月份的英文名稱 |
YEAR(d) | 返回日期d中的年份值 |
QUARTER(d) | 返回日期d是本年第幾季度灰羽,值的范圍是1~4 |
HOUR(t) | 返回時(shí)間t中的小時(shí)值 |
MINUTE(t) | 返回時(shí)間t中的分鐘值 |
SECOND(t) | 返回時(shí)間t中的秒鐘值 |
(四)條件判斷函數(shù)
函數(shù) | 功能 |
---|---|
IF(expr,v1,v2) | 如果表達(dá)式expr成立,返回結(jié)果v1鱼辙;否則廉嚼,返回結(jié)果v2。 |
IFNULL(v1,v2) | 如果v1的不為空倒戏,就顯示v1的值怠噪;否則就顯示v2的值。 |
(五)系統(tǒng)信息函數(shù)
函數(shù) | 功能 |
---|---|
VERSION() | 返回?cái)?shù)據(jù)庫(kù)的版本號(hào) |
CONNECTION_ID() | 返回服務(wù)器的連接數(shù)杜跷,也就是到現(xiàn)在為止MySQL服務(wù)的連接次數(shù) |
DATABASE()和SCHEMA() | 返回當(dāng)前數(shù)據(jù)庫(kù)名 |
USER()傍念、SYSTEM_USER()、SESSION_USER()葛闷、CURRENT_USER()和CURRENT_USER | 返回當(dāng)前用戶的名稱 |
LAST_INSERT_ID() | 返回最后生成的AUTO_INCREMENT值 |
(六)加密函數(shù)
函數(shù) | 功能 |
---|---|
PASSWORD(str) | 可以對(duì)字符串str進(jìn)行加密 |
MD5(str) | 可以對(duì)字符串str進(jìn)行加密 |
DECODE(crypt_str,pswd_str) | 可以使用字符串pswd_str來(lái)為crypt_str解密 |
二憋槐、自定義函數(shù)
(一)語(yǔ)法
Create function function_name(參數(shù)列表)returns返回值類(lèi)型
(二)敘述
- 函數(shù)體、函數(shù)名淑趾,應(yīng)合法的標(biāo)識(shí)符阳仔,不應(yīng)與系統(tǒng)關(guān)鍵字沖突。
- 一個(gè)函數(shù)應(yīng)該屬于某個(gè)數(shù)據(jù)庫(kù)扣泊,可以使用db_name.funciton_name的形式執(zhí)行當(dāng)前函數(shù)所屬數(shù)據(jù)庫(kù)近范,否則為當(dāng)前數(shù)據(jù)庫(kù)。
- 參數(shù)部分延蟹,由參數(shù)名和參數(shù)類(lèi)型組成评矩。
- 返回值類(lèi)類(lèi)型。注意阱飘,一定要有return返回值語(yǔ)句斥杜。
(三)舉例
DELIMITER $$
CREATE DEFINER=`root`@`localhost` FUNCTION `ZZZ1`(PARA_VAR varchar(30))
RETURNS varchar(100) CHARSET latin1
BEGIN
DECLARE NAYIBU_FIR VARCHAR(30) DEFAULT 'THIS IS MY FIRST,';
SET NAYIBU_FIR = concat(NAYIBU_FIR,PARA_VAR);
RETURN NAYIBU_FIR;
END$$
(四)查看自定函數(shù)
show function status;
三虱颗、事務(wù)
應(yīng)用中的一個(gè)業(yè)務(wù)邏輯,往往由多條語(yǔ)句組合完成蔗喂。那么我們就可以簡(jiǎn)單地將事務(wù)理解為一組SQL語(yǔ)句的集合上枕,要么這個(gè)集合全部成功集合,要么這個(gè)集合就全部失敗退回到第一句之前的狀態(tài)弱恒。
(一)語(yǔ)法
- 開(kāi)啟事務(wù)start transaction,可以簡(jiǎn)寫(xiě)為 begin
- 然后記錄之后需要執(zhí)行的一組sql
- 提交commit
- 如果所有的sql都執(zhí)行成功棋恼,則提交返弹,將sql的執(zhí)行結(jié)果持久化到數(shù)據(jù)表內(nèi)。
- 回滾rollback
- 如果存在失敗的sql爪飘,則需要回滾义起,將sql的執(zhí)行結(jié)果,退回到事務(wù)開(kāi)始之時(shí)师崎。
- 無(wú)論回滾還是提交默终,都會(huì)關(guān)閉事務(wù)!需要再次開(kāi)啟犁罩,才能使用齐蔽。
- 還有一點(diǎn)需要注意,就是事務(wù)只針對(duì)當(dāng)前連接床估。
(二)舉例
使用第一個(gè)鏈接A
Start transaction;
Insert into students values('qreal',5);
結(jié)果成功含滴,數(shù)據(jù)已經(jīng)變成修改之后!但此時(shí)我們沒(méi)有提交丐巫。再?gòu)钠渌B接B來(lái)查看谈况,發(fā)現(xiàn)數(shù)據(jù)沒(méi)有插入。此時(shí)如果連接A選擇提交递胧,也就是commit操作碑韵。則連接B的數(shù)據(jù)也會(huì)發(fā)生變化。而如果連接A選擇回滾缎脾,也就是rollback操作祝闻。則連接A再次查詢則發(fā)現(xiàn)數(shù)據(jù)還原。
(三)基本原理
提交赊锚,就會(huì)將結(jié)果持久化治筒,不提交就不會(huì)。如果我們不開(kāi)啟事務(wù)舷蒲,只執(zhí)行一條sql耸袜,馬上就會(huì)持久化數(shù)據(jù),可以看出牲平,普通的執(zhí)行就是立即提交堤框。這是因?yàn)镸ySQL默認(rèn)對(duì)sql語(yǔ)句的執(zhí)行是自動(dòng)提交的。也就是說(shuō),開(kāi)啟事務(wù)蜈抓,實(shí)際上就是關(guān)閉了自動(dòng)提交的功能启绰,改成了commit手動(dòng)提交!
我們可以通過(guò)簡(jiǎn)單的對(duì)是否自動(dòng)提交加以設(shè)置沟使,完成開(kāi)啟事務(wù)的目的委可!
自動(dòng)提交的特征是保存在服務(wù)的一個(gè)autocommit的變量?jī)?nèi)±拔耍可以進(jìn)行修改:
Set autocommit = 0;
還需要注意一點(diǎn)着倾,就是事務(wù)類(lèi)似于外鍵約束,只被innodb引擎支持燕少。
(四)事務(wù)的特點(diǎn)
事務(wù)的特點(diǎn)ACID卡者。也就是原子性、一致性客们、隔離性和持久性崇决。
- 原子性:事務(wù)是不可分割的。
- 一致性:保證數(shù)據(jù)在事務(wù)的執(zhí)行周期內(nèi)底挫,是一致的恒傻!
- 隔離型:多個(gè)事務(wù)之間的干擾關(guān)系!隔離級(jí)別建邓!
- 持久性:事務(wù)一旦被提交碌冶,就不可能再被回滾!