事務用於將某些操做的多個 sql 做爲原子性操做,一旦某一個出現錯誤,便可回滾到原來狀態,從而保證數據庫數據完整性。mysql
使用方法:sql
start transaction; # 建立一個事物 SQL指令1; SQL指令2; ... SQL指令n; # 若是數據出現異常,或因爲某些緣由致使不能繼續進行下去,能夠隨時將事物開始後的數據操做取消 rool back;# 回滾數據到事物開始前 # 若是全部操做正常完成,在提交事物前,別的用戶是不能看到更改後的數據的,且當前用戶若是沒有提交,操做也不會保存 commit; # 提交事物更新數據
事物的特性:(ACID)數據庫
視圖是一個虛擬表,本質是根據 SQL 語句獲取動態的數據集,併爲其命名使用視圖名便可獲取結果集,並將結果集看成表來使用,視圖就是用來保存這個虛擬表的。服務器
視圖也是表,因此可使用 show tables;
進行查看。網絡
使用方法函數
# 通常用於須要大量重複使用某一個查詢 SQL,每次都須要重寫SQL指令會很麻煩,可使用視圖將這個查詢 SQL 的結果虛擬成一個表進行保存, 建立視圖 create view 視圖名 as SQL指令; # 將 SQL 指令的結果保存成一個視圖,並命名 使用視圖 select * from 視圖名 修改視圖中的數據 - 修改 update 視圖名 set 列=值; - 插入 insert into 視圖名 values(值1,值2,...) 刪除視圖 drop view 視圖名;
注意優化
若是使用 SQL 過度依賴數據庫中的視圖,即具備強耦合性,那麼擴展 SQL 將極爲不便,所以不推薦使用。code
定製用戶對錶進行增、刪、改操做先後的行爲。orm
建立觸發器對象
create or replace trigger 觸發器名 (before/after/instead of) (inser/delete/update) on 表名 [for each row] when (condition) declare begin 觸發器代碼 # 一句或多句 end; (before/after/instead of)能夠選擇 before 或 after 或 instead of - before:語句實施前執行觸發器 - after:語句實施以後執行觸發器 - instead of:用在對視圖的更新上 (inser/delete/update):DML語句,能夠選擇一個或多個,若是選擇多個,用 or 隔開 [for each row]:可選項,若是註明了 for each row ,則說明了該觸發器是一個行級的觸發器,DML語句處理每條記錄都會執行觸發器;若是沒有註明,則是一個語句級的觸發器,每一個DML語句觸發一次。 when 後的(condition)是觸發器的響應條件,只對行級觸發器有效,當操做的記錄知足 condition 時,觸發器才被執行,不然不執行 condition 中能夠經過 new 對象和 old 對象來引用操做的記錄
使用觸發器
# delimiter:設定 SQL分隔符,默認爲分號‘ ;’,mysql執行語句的標誌 建立觸發器 delimiter // # 當向表1中添加數據的時候,表2添加指定的數據 create trigger tri_before_insert_tb1 before insert on t2 for each row begin insert into t3 (name) values ('aa'); end // delimiter ; 查看觸發器結構 show teiggers\G 刪除觸發器 drop teigger 觸發器名;
存儲過程包含了一系列的可執行sql代碼,存放於 MySQL 中,經過調用它的名字能夠執行內部的一堆 SQL。
建立存儲過程
無參
delimiter // create procedure 存儲過程別名() begin SQL指令 end // delimiter ;
有參
delimiter // create procedure 存儲過程別名( in # 傳入參數 out # 返回值 inout # 既能夠傳入參數又能夠看成返回值 begin SQL指令 end // delimiter ;
執行存儲過程
# 無參數 call 存儲過程名(); # 有參數,全 in call 存儲過程名(1,2) # 有參數,有 in,out,inout set @t1=0; set @t2=3; call proc_name(1,2,@t1,@t2)
刪除存儲過程
drop procedure 存儲過程名;
MySQL中提供的內置函數
char_length(str) 返回值爲字符串 str 的長度,長度的單位爲字符。一個多字節字符算做一個單字符。 對於一個包含五個二字節字符集, length()返回值爲 10, char_length()的返回值爲5。 contact(str1,str2,...) 字符串拼接 若有任何一個參數爲NULL ,則返回值爲 NULL。 format(x,d) 將數字X 的格式寫爲'#,###,###.##',以四捨五入的方式保留小數點後 D 位, 並將結果以字符串的形式返回。若 D 爲 0, 則返回結果不帶有小數點,或不含小數部分。 例如: select format(12332.1,4); 結果爲: '12,332.1000' instr(str,substr) 返回字符串 str 中子字符串的第一個出現位置。 left(str,len) 返回字符串 str 從開始的 len 位置的子序列字符。 lower(str) 字符串變小寫 upper(str) 字符串變大寫 ltrim(str) 返回字符串 str ,其引導空格字符被刪除 rtrim(str) 返回字符串 str ,結尾空格字符被刪去 substring(str,pos,len) 獲取字符串子序列 locate(substr,str,pos) 獲取子序列索引位置 repeat(str,count) 返回一個由重複的字符串str 組成的字符串,字符串str的數目等於count 若 count <= 0,則返回一個空字符串。 若str 或 count 爲 NULL,則返回 NULL 。 replace(str,from_str,to_str) 返回字符串 str 以及全部被字符串 to_str 替代的字符串 from_str reverse(str) 返回字符串 str ,順序和字符順序相反。 right(str,len) 從字符串 str 開始,返回從後邊開始len個字符組成的子序列
將重要的數據另外保存一份,防止意外丟失、故障等問題
語法
mysqldump -h 服務器 -u用戶名 -p密碼 數據庫名 表1名, 表2名,.... > aaa.sql
用法
#單庫備份 mysqldump -uroot -p123 db1 > db1.sql mysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql #多庫備份 mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql #備份全部庫 mysqldump -uroot -p123 --all-databases > all.sql
導入備份恢復數據
source 備份文件路徑.sql