MySQL 笔记6 -- 函数与事务
生活随笔
收集整理的這篇文章主要介紹了
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) |
| %p | AM 或 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 -- 函数与事务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL 笔记5 -- 多表查询
- 下一篇: linux cmake编译源码,linu