數據庫高級操做

視圖

視圖就是一個虛擬的表

create view 視圖名 select * from 數據庫;

觸發器

使用觸發器能夠定製用戶對錶進行增、刪、改操做的先後行爲。mysql

  1. 建立觸發器
# 插入前
create trigger tri_before_insert_tb1 before insert on tb1 for each row
BEGIN
    ...
END

# 插入後
create trigger tri_after_insert_tb1 after insert on tb1 for each row
BEGIN
    ...
END

# 刪除前
create trigger tri_before_delete_tb1 before delete on tb1 for each row
BEGIN
    ...
END

# 刪除後
create trigger tri_after_delete_tb1 after delete on tb1 for each row
BEGIN
    ...
END

# 更新前
create trigger tri_before_update_tb1 before update on tb1 for each row
BEGIN
    ...
END

# 更新後
create trigger tri_after_update_tb1 after update on tb1 for each row
BEGIN
    ...
END

# 刪除觸發器
如: drop trigger tri_after_insert_cmd;

示例

create table cmd(
    id int primary key auto_increment,
    user varchar(32),
    priv varchar(10),
    cmd varchar(64),
    sub_time datetime,  # 提交時間
    success enum('yes', 'no')  # 0表明執行失敗
);

create table errlog(
    id int primary key auto_increment,
    err_cmd char(64),
    err_time datetime
);

# 建立觸發器
delimiter //
create trigger tri_after_insert_cmd after insert on cmd for each row
BEGIN
    if NEW.success = 'no' THEN
        insert into errlog(err_cmd, err_time) values(NEW.cmd, NEW.sub_time);
    END IF;
END//
delimiter ;

# 往cmd表中插入記錄,觸發觸發器,根據IF的結果決定是否插入錯誤日誌
insert into cmd(user, priv, cmd, sub_time, success) values('nihao', '1111', 'ls -alh', NOW(), 'yes');

# 查詢錯誤日誌
select * from errlog;

存儲過程

存儲過程包含了一系列可執行的sql語句,存儲過程存放在MySQL中,經過調用它的名字能夠執行其內部的sql。程序員

  • 優勢
    • 用於替代程序員寫的sql語句,實現程序與sql解耦。
    • 基於網絡傳輸,傳別名的數據量小,而直接傳sql數據量大。
  • 缺點
    • 程序員想要擴展功能不便利

建立無參的存儲過程

delimiter //
create procedure 存儲過程名()
BEGIN
    select * from class;
END //
delimiter ;

# 查看建立的存儲過程
show create procedure 存儲過程名;

# 存儲過程的調用
## mysql中
call 存儲過程名();

## Pythonz中
cursor.callproc('存儲過程名')

建立無參的存儲過程

delimiter //
create procedure 存儲過程名(in n1 int, in n2 int, out ret int)
BEGIN
    select * from teacher where tid > n1 and tid < n2;
    set ret=1;
END //
delimiter ;

# 存儲過程的調用
## mysql中
set @x;
call 存儲過程名(1, 3, @x);
select @x;

## Python中
cursor.callproc('存儲過程名', (1, 3, 0))
cursor.execute('select @_存儲過程名_2;')
cursor.fetchone()

事務

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

create table user(
    id int primary key auto_increment,
    name varchar(32),
    balance int
);

insert into user(name, balance) values('xxx', 1000), ('yyy', 1000);

# 開啓事務
start transaction;
update user set balance=900 where name='xxx';
update user set balance=800 where name='xxx';
commit;

# 出現異常就回滾到初始狀態
start transaction;
update user set balance=900 where name='xxx';
update user set balance=800 where name='xxx';
rollback;
commit;

函數

內置函數請百度。數據庫

自定義函數

delimiter //
create function f1(
    i1 int, 
    i2 int)
returns int
BEGIN
    declare num int;
    set num = i1 + i2;
    return(num);
END //
delimiter ;
delimiter //
create function f(
    i int
)
returns int
begin
    declare ret int default 0;
    if i = 10 then
        set ret = 100;
    elseif i=20 then
        set ret = 200;
    elseif i=30 then
        set ret = 300;
    else
        set ret = 400;
    end if;
    return ret;
end //
delimiter ;

刪除函數

drop function func_name;

執行函數

# 獲取返回值
select upper('xxx') into @res;
select @res;

# 查詢中使用
select f1(i1, nid), name from tb2;

索引

索引是存儲引擎中的一個鍵,經過減小幫助查詢過程當中的IO操做,從而提升查詢效率。網絡

  • 建索引的字段儘可能小
  • 索引的最左匹配

彙集索引

InnoDB存儲引擎表示索引組織表,表中數據按照主鍵順序存放。彙集索引是按照每張表的主鍵構造一棵B+樹,葉子結點存放的是整張表的行記錄數據,咱們將彙集索引的葉子結點成爲數據頁。彙集索引的這一特性決定了索引組織表中數據也是索引的一部分。同B+樹數據結構同樣,每一個數據頁都經過一個雙向鏈表來進行連接。數據結構

一張表只能有一個B+樹。函數

輔助索引

表中除了彙集索引外其餘索引都是輔助索引。fetch

葉子結點除了包含鍵值外,每一個葉子節點中的索引行中還包含了一個書籤。該書籤用來告訴InnoDB存儲引擎去哪找與索引相應的行數據。因爲InnoDB存儲引擎是索引組織表,所以InnoDB存儲引擎的輔助引擎的書籤就是相應行數據的彙集索引鍵。指針

輔助索引的存在並不影響數據在彙集索引中的組織,所以每張表上能夠有多個輔助索引,但只能有一個彙集索引。當經過輔助索引來尋找數據時,InnoDB存儲引擎會遍歷輔助索引並經過葉子級別的指針得到指向主鍵索引的主鍵,而後再經過主鍵索引來找到一個完整的行記錄。日誌

彙集索引和輔助索引的區別

葉子結點是否包含行記錄的所有數據。

索引是否是建的越多越好?

不是,索引加的多了會致使寫入數據慢。

建立索引

1.ALTER TABLE
ALTER TABLE用來建立普通索引、UNIQUE索引或PRIMARY KEY索引。

ALTER TABLE table_name ADD INDEX index_name (column_list)
ALTER TABLE table_name ADD UNIQUE (column_list)
ALTER TABLE table_name ADD PRIMARY KEY (column_list)
  1. CREATE INDEX
    CREATE INDEX可對錶增長普通索引或UNIQUE索引。
CREATE INDEX index_name ON table_name (column_list)
CREATE UNIQUE INDEX index_name ON table_name (column_list)

刪除索引

利用ALTER TABLE或DROP INDEX語句來刪除索引。相似於CREATE INDEX語句,DROP INDEX能夠在ALTER TABLE內部做爲一條語句處理。

DROP INDEX index_name ON talbe_name
ALTER TABLE table_name DROP INDEX index_name
ALTER TABLE table_name DROP PRIMARY KEY

其中,前兩條語句是等價的,刪除掉table_name中的索引index_name。

第3條語句只在刪除PRIMARY KEY索引時使用,由於一個表只可能有一個PRIMARY KEY索引,所以不須要指定索引名。若是沒有建立PRIMARY KEY索引,但表具備一個或多個UNIQUE索引,則MySQL將刪除第一個UNIQUE索引。

若是從表中刪除了某列,則索引會受到影響。對於多列組合的索引,若是刪除其中的某列,則該列也會從索引中刪除。若是刪除組成索引的全部列,則整個索引將被刪除。

查看索引

show index from table_name;
show keys from table_name;
相關文章
相關標籤/搜索