day 37

數據庫補充

1. 事物

事務用於將某些操做的多個 sql 做爲原子性操做,一旦某一個出現錯誤,便可回滾到原來狀態,從而保證數據庫數據完整性。mysql

  • 使用方法:sql

    start transaction;    # 建立一個事物
    
    SQL指令1;
    SQL指令2;
    ...
    SQL指令n;
    
    # 若是數據出現異常,或因爲某些緣由致使不能繼續進行下去,能夠隨時將事物開始後的數據操做取消
    rool back;# 回滾數據到事物開始前    
    
    # 若是全部操做正常完成,在提交事物前,別的用戶是不能看到更改後的數據的,且當前用戶若是沒有提交,操做也不會保存
    commit;   # 提交事物更新數據
  • 事物的特性:(ACID)數據庫

    1. 原子性 (Atomicity):原子意爲最小的粒子,即不能再分的事務,要麼所有執行,要麼所有取消
    2. 一致性 (Consistency):指事務發生先後,數據的總額依然匹配
    3. 隔離性 (Isolation):簡單點說,某個事務的操做,對其餘事務是不可見的
    4. 永久性 (Durability):當事務完成後,其影響應該保留下來,不能撤銷,只能經過「補償性事務」來抵消以前的錯誤

2. 視圖

視圖是一個虛擬表,本質是根據 SQL 語句獲取動態的數據集,併爲其命名使用視圖名便可獲取結果集,並將結果集看成表來使用,視圖就是用來保存這個虛擬表的。服務器

視圖也是表,因此可使用 show tables; 進行查看。網絡

  • 使用方法函數

    # 通常用於須要大量重複使用某一個查詢 SQL,每次都須要重寫SQL指令會很麻煩,可使用視圖將這個查詢 SQL 的結果虛擬成一個表進行保存,
    
    建立視圖
    create view 視圖名 as SQL指令; # 將 SQL 指令的結果保存成一個視圖,並命名
    
    使用視圖
    select * from 視圖名
    
    修改視圖中的數據
      - 修改
          update 視圖名 set 列=值;
      - 插入
          insert into 視圖名 values(值1,值2,...)
    
    刪除視圖
    drop view 視圖名;
  • 注意優化

    1. 對視圖的操做會改變原表數據
    2. 視圖雖然能夠不用重複寫相同的 SQL 的指令,可是查詢效率低,建立視圖不如想辦法優化 SQL 指令
    3. 若是 SQL 指令須要修改,若是涉及到視圖部分,必須去數據庫中修改,須要浪費大量時間和 DBA 溝通
    4. 若是涉及多個表,沒法修改視圖中的記錄

若是使用 SQL 過度依賴數據庫中的視圖,即具備強耦合性,那麼擴展 SQL 將極爲不便,所以不推薦使用。code

3. 觸發器

定製用戶對錶進行增、刪、改操做先後的行爲。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 觸發器名;

4. 存儲過程

存儲過程包含了一系列的可執行sql代碼,存放於 MySQL 中,經過調用它的名字能夠執行內部的一堆 SQL。

  • 優勢:
    1. 用於替代程序寫的sql語句,實現程序與sql解耦
    2. 基於網絡傳輸,傳別名的數據量小,而直接傳sql數據量大
  • 缺點: 擴展性差
  1. 建立存儲過程

    • 無參

      delimiter //
      
      create procedure 存儲過程別名()
      begin
      SQL指令
      end //
      
      delimiter ;
    • 有參

      delimiter //
      
      create procedure 存儲過程別名(
              in      # 傳入參數
              out     # 返回值
              inout   # 既能夠傳入參數又能夠看成返回值
      begin
      SQL指令
      end //
      
      delimiter ;
  2. 執行存儲過程

    # 無參數
    call 存儲過程名();
    
    # 有參數,全 in
    call 存儲過程名(1,2)
    
    # 有參數,有 in,out,inout
    set @t1=0;
    set @t2=3;
    call proc_name(1,2,@t1,@t2)
  3. 刪除存儲過程

    drop procedure 存儲過程名;

5. 數據庫內置函數

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個字符組成的子序列

6. 數據庫備份

將重要的數據另外保存一份,防止意外丟失、故障等問題

  • 語法

    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
相關文章
相關標籤/搜索