備份
方法: 使用mysqldump實現邏輯備份 語法: mysqldump -h 服務器 -u用戶名 -p密碼 數據庫名 > 備份文件.sql 單庫備份: mysqldump -uroot -p123456 db1 > db1.sql mysqldump -uroot -p123456 db1 table1 table2 > db1-table1-table2.sql 多庫備份: mysqldump -uroot -p123456 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql 備份所有庫: mysqldump -uroot -p123456 --all-databases > all.sql 恢復邏輯備份: mysql -uroot -p123456 < all.sql
視圖
視圖 作用:簡化sql語句 本質:保存的就是sql語句 不足:視圖表示強耦合,少用,且不要對視圖做修改 創建視圖格式:create view 視圖名稱 as select語句; 修改視圖格式:alter view 視圖名稱 as select語句; 刪除視圖格式:drop view 視圖名稱; 創建視圖 create view test as select name,age from employee where age > 30; 修改視圖 alter view test as select name,age from employee where age > 40; 使用視圖 select * from test; 刪除視圖 drop view test;
觸發器
觸發器 作用:使用觸發器可以定制用戶對表進行增、刪、改操作時前后的行為,注意:沒有查詢 創建觸發器: 插入前 create trigger 觸發器名稱 before insert on tb1 FOR EACH ROW begin ... end 插入后 create trigger 觸發器名稱 after insert on tb1 for each row begin ... end 刪除前 create trigger 觸發器名稱 before delete on tb1 for each row begin ... end 刪除后 create trigger 觸發器名稱 after delete on tb1 for each row begin ... end 更新前 create trigger 觸發器名稱 before update on tb1 for each row begin ... end 更新后 create trigger 觸發器名稱 after update on tb1 for each row begin ... end 刪除觸發器: drop trigger 觸發器名稱; 注意:NEW表示即將插入的數據行,OLD表示即將刪除的數據行 create table t1( id int primary key, name char(10) ); create table t2( id int primary key, info char(10) ); delimiter // create trigger t1_t2 after insert on t1 for each row begin insert into t2 values(new.id, 'ok'); end // delimiter ; insert into t1 values(1, 'aaa');
事務
事物 定義:事務用於將某些操作的多個sql作為原子性操作,一旦有某一個出現錯誤,即可回滾到原來的狀態,從而保證數據庫數據完整性 注意:回滾不是數據庫自動觸發的,需要寫明rollback語句才會回滾 格式: start transaction; #開始 rollback; #回滾 commit; #提交(結束) #效果等同於沒插入 start transation; insert into t1 values(2, 'bbb'); rollback; commit;
存儲過程
存儲過程 定義:存儲過程包含了一系列可執行的sql語句,存儲過程存放於MySQL中,通過調用它的名字可以執行其內部的一堆sql 優點:用於替代程序寫的SQL語句,實現程序與sql解耦 基於網絡傳輸,傳別名的數據量小,而直接傳sql數據量大 創建存儲過程: 無參: delimiter // create procedure p1() begin select * from t1; select * from t1; end // delimiter ; 調用: call p(); 有參: in 僅用於傳入參數用 out 僅用於返回值用 inout 既可以傳入又可以當作返回值 delimiter // create procedure p2( in n1 int, in n2 int ) begin select * from t1 where id > n1; end // delimiter ; 調用: set @res=0; #0代表假(執行失敗),1代表真(執行成功) call p3(3,@res); select @res; delimiter // create procedure p4( inout n1 int ) BEGIN select * from blog where id > n1; set n1 = 1; END // delimiter ; 調用: set @x=3; call p4(@x); select @x; 刪除存儲過程: drop procedure 存儲過程名稱
函數
函數 內置函數(常用) round(x,y) 返回參數x的四舍五入的有y位小數的值 rand() 返回0到1內的隨機值 avg(col)返回指定列的平均值 count(col)返回指定列中非NULL值的個數 min(col)返回指定列的最小值 max(col)返回指定列的最大值 sum(col)返回指定列的所有值之和 group_concat(col) 返回由屬於一組的列值連接組合而成的結果 char_length(str) 返回值為字符串str 的長度,長度的單位為字符。一個多字節字符算作一個單字符 concart(str1, str2,...) 字符串拼接 concart_as(separator, str1, str2,...) 字符串拼接(自定義連接符),不會忽略任何空字符串 conv(N, from_base, to_base)進制轉換.例如:SELECT CONV('a',16,2); 表示將a由16進制轉換為2進制字符串表示 lower(str)變小寫 upper(str)變大寫 reverse(str)返回字符串str,順序和字符順序相反。 now()返回當前的日期和時間 year(date) 返回日期date的年份(1000~9999) month(date) 返回date的月份值(1~12) dayofmonth(date) 返回date是一個月的第幾天(1~31) hour(time) 返回time的小時值(0~23) minute(time) 返回time的分鍾值(0~59) md5() 計算字符串str的MD5校驗和 password(str) 返回字符串str的加密版本,這個加密過程是不可逆轉的,和UNIX密碼加密過程使用不同的算法。 自定義函數 注意:函數中不要寫sql語句(否則會報錯),函數僅僅只是一個功能,是一個在sql中被應用的功能 說明:若要想在begin...end...中寫sql,請用存儲過程sql語句中調用函數 定義函數 delimiter // create function f1( i1 int, i2 int) returns int BEGIN declare num int; #聲明變量 set num = i1 + i2; #設置變量 return(num); END // delimiter ; 調用函數: select f5(); 刪除函數: drop fucnion f5;
流程控制
條件語句 delimiter // create procedure proc_if () begin declare i int default 0; if i = 1 then SELECT 1; elseif i = 2 then SELECT 2; else SELECT 7; end if; end // delimiter ;
循環語句 delimiter // create procedure proc_while() begin declare num int; set num = 0; while num < 10 do select num ; set num = num + 1 ; end while ; end // delimiter ; delimiter // create procedure proc_repeat() begin declare num int; set i = 0; repeat select i; set i = i + 1; until i >= 5 end repeat; end // delimiter ; delimiter // create procedure proc_loop() begin declare i int default 0; loop_label: loop set i=i+1; if i<8 then iterate loop_label; end if; if i>=10 then leave loop_label; end if; select i; end loop loop_label; end // delimiter ;
索引
索引 作用:加速查找 創建 create index 索引名稱 on 表名(字段) 刪除 drop index 索引名稱 on 表名; 正確使用索引: 不用使用范圍條件來查詢 盡量選擇區分度高的字段作為索引