日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL 笔记6 -- 函数与事务

發布時間:2025/3/12 数据库 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL 笔记6 -- 函数与事务 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MySQL 筆記6 – 函數與事務


MySQL 系列筆記是筆者學習、實踐MySQL數據庫的筆記

課程鏈接: MySQL 數據庫基礎入門教程
參考文檔:
MySQL 官方文檔
SQL 教程


一、內置函數


1、函數

  • 事先編寫的實現某些功能的代碼集合,可以直接調用
  • 函數可以用在SELECT語句及其子句,也可以用在UPDATE,DELETE語句當中
  • 格式:SELECT 函數
  • 函數分類:字符串函數、數值函數、日期和時間函數、流程函數、其它函數

2、字符串函數

函數說明
COMCAT(s1,s2…sn)將傳入的字符連接成一個字符串,任何字符串與null進行連接結果都是null
INSERT(str,x,y,instr)將字符串str從x(從1開始)位置開始,y個字符長的子串替換為instr
LOWER(Str)/UPPER(str)將字符串轉成小/大寫
LEFT(str,x)/RIGHT(str,x)返回字符串最左/右邊的x個字符,x=null 不返回任何字符
LPAD(str,n,pad)/RPAD(str,n,pad)用字符串pad對str最左/右邊進行填充,直到長度為n個字符
REPEAT(str,x)返回str重復x次的結果
REPLACE(str,a,b)用字符串b替換字符串str中所有出現的字符串a
SUBSTRING(str,x,y)返回字符串str中第x位置起y個字符長度的字符

3、數值函數

函數說明
ABS(x)返回X的絕對值
CEIL(x)小數不為零部分上取整,即向上取最近的整數
FLOOR(x)小數部分下取整,即向下取最近的整數
MOD(X,Y)返回X/Y的模
RAND()返回0-1的隨機值
RAND()*n返回0-n的隨機值

4、日期和時間函數

函數:

函數說明
CURDATE()返回當前日期,只包含年月日
CURTIME()返回當前時間,只包含時分秒
NOW()返回當前日期和時間,年月日時分秒都包含
UNIX_TIMESTAMP返回當前日期的時間戳
FROM_UNIXTIME(unixtime)將一個時間戳轉換成日期
WEEK(DATE)返回當前是一年中的第幾周
YEAR(DATE)返回所給日期是那一年
HOUR(TIME)返回當前時間的小時
MINUTE(TIME)返回當前時間的分鐘
DATE_FORMAT(date,fmt)按字符串格式化日期date值
DATE_ADD(date,interval expr type)計算日期相加
DATEDIFF(date1,date2)計算兩個日期相差的天數

格式化日期的格式符:

  • 用在fmt中,形如’%M%D%Y’
  • 可以在格式符中插入自定義的符號,形如’%M-%D-%Y’
格式符說明
%a縮寫星期名
%b縮寫月名
%c月,數值
%D帶有英文前綴的月中的天
%d月的天,數值(00-31)
%e月的天,數值(0-31)
%f微秒
%H小時 (00-23)
%h小時 (01-12)
%I小時 (01-12)
%i分鐘,數值(00-59)
%j年的天 (001-366)
%k小時 (0-23)
%l小時 (1-12)
%M月名
%m月,數值(00-12)
%pAM 或 PM
%r時間,12-小時(hh:mm:ss AM 或 PM)
%S秒(00-59)
%s秒(00-59)
%T時間, 24-小時 (hh:mm:ss)
%U周 (00-53) 星期日是一周的第一天
%u周 (00-53) 星期一是一周的第一天
%V周 (01-53) 星期日是一周的第一天,與 %X 使用
%v周 (01-53) 星期一是一周的第一天,與 %x 使用
%W星期名
%w周的天 (0=星期日, 6=星期六)
%X年,其中的星期日是周的第一天,4 位,與 %V 使用
%x年,其中的星期一是周的第一天,4 位,與 %v 使用
%Y年,4 位
%y年,2 位

5、流程函數

函數說明
IF(value,t,f)如果value是真,返回t,否則返回f
IFNULL(value1,value2)如果value1不為空,返回value1否者返回value2
CASE WHEN value THEN t ELSE f END當value是真,返回t,否則返回f

6、其它函數

函數說明
DATABASE()返回當前數據庫名
VERSION()返回當前數據庫版本
USER()返回當前登陸用戶名
PASSWORD(STR)對str進行加密
MD5()返回str的MD5值

二、自定義函數


1、修改命令結束符

  • 格式:DELIMITER x,將標準分隔符 ; 更改為自定義的 x
  • 因為定義函數時,函數是作為一個整體的,而函數內是多條單獨的語句。為了不讓讓mysql遇到 ;號就解釋語句,需要在定義函數開頭修改分隔符,完成后把分隔符還原為 ;

2、自定義函數

DELIMITER 自定義分隔符 CREATE FUNCTION 函數名() RETURNS 數據類型 begin 語句1; 語句2; .... return 和要求的數據類型一樣的數據; end 自定義分隔符 DELIMITER ;
  • 調用自定義函數格式跟內置函數一致

三、事務


1、事務

  • 不可分割的操作,假設某操作有多個步驟組成,其中任意一個步驟操作失敗,則認為事務失敗,所有步驟全完成該操作才是成功
  • 每條SQL語句都是一個事務,可以把多條SQL語句定義成一個事務
  • 事務只對DML語句有效,對于DQL無效

2、事務的ACID

  • 原子性(Atomicity):事務包含的所有操作要么全部成功,要么全部失敗回滾
  • 一致性(Consistency):事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之后都必須處于一致性狀態,讓數據保持一定上的合理,如:一個商品出庫時,倉庫商品數量減1,對應用戶的購物車中商品加1
  • 隔離性(Isolation):當多個用戶并發訪問數據庫時,比如操作同一張表時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作所干擾,多個并發事務之間要相互隔離
  • 持久性(Durability):一個事務一旦被提交了,就不能再回滾了,已經把數據保存到數據庫當中了

3、事務的使用

操作語句說明
開啟事務start transaction
回滾事務rollback銷執行的sql語句,必須在提交事務之前
提交事務commit事務中的所有語句全部執行完畢時提交事務,若沒有發生異常,更新到數據庫中


4、事務隔離級別

隔離級別:隔離級別越高,數據的完整性和一致性越好,并發性能越低

級別說明
Read uncommitted(讀未提交)未提交事務B修改了數據,事務A讀到就是事務B修改的數據;
Read committed(讀已提交)未提交事務B修改了數據,事務A讀到的數據還是之前的;事務B提交后A讀到的數據是B修改后的數據;
Repeatable read(可重復讀)未提交事務A開始讀取數據后,在提交前讀到的數據(select)都是此刻生成的版本,不管事務B是否修改數據是否提交;事務A提交前的insert、update和delete會更新版本為已提交事務B生成的版本;
Serializable(串行)事務串行化順序執行,事務A執行后才能執行事務B,同時執行會報錯;

查看隔離級別:

  • select @@global.tx_isolation,@@tx_isolation;

設置隔離級別:

  • 全局的:set global transaction isolation level 隔離級別;
  • 當前會話: set session transaction isolation level 隔離級別;

5、事務的并發

問題:

問題說明
臟讀事務A讀取了事務B更新的數據,然后B回滾操作,那么A讀取到的數據是臟數據
不可重復讀事務 A 多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新并提交,導致事務A多次讀取同一數據時,結果不一致
幻讀未提交事務A查詢數據后,已提交事務B刷新了數據庫,事務A提交后再查詢與上次查詢的數據不一致;

各隔離級別會出現的問題:

隔離級別臟讀不可重復讀幻讀
Read uncommitted
Read committed
Repeatable read
Serializable

GOOD LUCK!


總結

以上是生活随笔為你收集整理的MySQL 笔记6 -- 函数与事务的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。