一、視圖
視圖是一個虛擬表(非真實存在),其本質是【根據SQL語句獲取動態的數據集,並為其命名】,用戶使用時只需使用【名稱】即可獲取結果集,並可以將其當作表來使用。

1 SELECT 2 * 3 FROM 4 ( 5 SELECT 6 nid, 7 NAME 8 FROM 9 tb1 10 WHERE 11 nid > 2 12 ) AS A 13 WHERE 14 A. NAME > 'alex';臨時表搜索
1、創建視圖

1 --格式:CREATE VIEW 視圖名稱 AS SQL語句 2 CREATE VIEW v1 AS 3 SELET nid, 4 name 5 FROM 6 A 7 WHERE 8 nid > 4View Code
2、刪除視圖

1 --格式:DROP VIEW 視圖名稱 2 3 DROP VIEW v1View Code
3、修改視圖

1 -- 格式:ALTER VIEW 視圖名稱 AS SQL語句 2 3 ALTER VIEW v1 AS 4 SELET A.nid, 5 B. NAME 6 FROM 7 A 8 LEFT JOIN B ON A.id = B.nid 9 LEFT JOIN C ON A.id = C.nid 10 WHERE 11 A.id > 2 12 AND C.nid < 5View Code
4、使用視圖

1 select * from v1View Code
二、觸發器
對某個表進行【增/刪/改】操作的前後如果希望觸發某個特定的行為時,可以使用觸發器,觸發器用於定制用戶對表的行進行【增/刪/改】前後的行為。
1、創建基本語法

1 # 插入前 2 CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW 3 BEGIN 4 ... 5 END 6 7 # 插入後 8 CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW 9 BEGIN 10 ... 11 END 12 13 # 刪除前 14 CREATE TRIGGER tri_before_delete_tb1 BEFORE DELETE ON tb1 FOR EACH ROW 15 BEGIN 16 ... 17 END 18 19 # 刪除後 20 CREATE TRIGGER tri_after_delete_tb1 AFTER DELETE ON tb1 FOR EACH ROW 21 BEGIN 22 ... 23 END 24 25 # 更新前 26 CREATE TRIGGER tri_before_update_tb1 BEFORE UPDATE ON tb1 FOR EACH ROW 27 BEGIN 28 ... 29 END 30 31 # 更新後 32 CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROW 33 BEGIN 34 ... 35 ENDView Code

1 delimiter //
2 CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW
3 BEGIN
4
5 IF NEW. NAME == 'alex' THEN
6 INSERT INTO tb2 (NAME)
7 VALUES
8 ('aa')
9 END
10 END//
11 delimiter ;
插入前觸發器

1 delimiter //
2 CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW
3 BEGIN
4 IF NEW. num = 666 THEN
5 INSERT INTO tb2 (NAME)
6 VALUES
7 ('666'),
8 ('666') ;
9 ELSEIF NEW. num = 555 THEN
10 INSERT INTO tb2 (NAME)
11 VALUES
12 ('555'),
13 ('555') ;
14 END IF;
15 END//
16 delimiter ;
後觸發器
特別的:NEW表示即將插入的數據行,OLD表示即將刪除的數據行。
2、刪除觸發器

1 DROP TRIGGER tri_after_insert_tb1;View Code
3、使用觸發器
觸發器無法由用戶直接調用,而是由於對表的【增/刪/改】操作被動引發的。

1 insert into tb1(num) values(666)View Code
三、存儲過程
存儲過程是一個SQL語句集合,當主動去調用存儲過程時,其中內部的SQL語句會按照邏輯執行。
1、創建存儲過程

1 -- 創建存儲過程 2 3 delimiter // 4 create procedure p1() 5 BEGIN 6 select * from t1; 7 END// 8 delimiter ; 9 10 11 12 -- 執行存儲過程 13 14 call p1()View Code
對於存儲過程,可以接收參數,其參數有三類:

1 -- 創建存儲過程 2 delimiter \\ 3 create procedure p1( 4 in i1 int, 5 in i2 int, 6 inout i3 int, 7 out r1 int 8 ) 9 BEGIN 10 DECLARE temp1 int; 11 DECLARE temp2 int default 0; 12 13 set temp1 = 1; 14 15 set r1 = i1 + i2 + temp1 + temp2; 16 17 set i3 = i3 + 100; 18 19 end\\ 20 delimiter ; 21 22 -- 執行存儲過程 23 set @t1 =4; 24 set @t2 = 0; 25 CALL p1 (1, 2 ,@t1, @t2); 26 SELECT @t1,@t2;有參存儲過程
2、刪除存儲過程

1 drop procedure proc_name;View Code
3、執行存儲過程

1 -- 無參數 2 call proc_name() 3 4 -- 有參數,全in 5 call proc_name(1,2) 6 7 -- 有參數,有in,out,inout 8 set @t1=0; 9 set @t2=3; 10 call proc_name(1,2,@t1,@t2)View Code

1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 import pymysql
4
5 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
6 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
7 # 執行存儲過程
8 cursor.callproc('p1', args=(1, 22, 3, 4))
9 # 獲取執行完存儲的參數
10 cursor.execute("select @_p1_0,@_p1_1,@_p1_2,@_p1_3")
11 result = cursor.fetchall()
12
13 conn.commit()
14 cursor.close()
15 conn.close()
16
17
18 print(result)
pysql執行存儲過程
四、事務
事務用於將某些操作的多個SQL作為原子性操作,一旦有某一個出現錯誤,即可回滾到原來的狀態,從而保證數據庫數據完整性。

1 delimiter \\
2 create PROCEDURE p1(
3 OUT p_return_code tinyint
4 )
5 BEGIN
6 DECLARE exit handler for sqlexception
7 BEGIN
8 -- ERROR
9 set p_return_code = 1;
10 rollback;
11 END;
12
13 DECLARE exit handler for sqlwarning
14 BEGIN
15 -- WARNING
16 set p_return_code = 2;
17 rollback;
18 END;
19
20 START TRANSACTION;
21 DELETE from tb1;
22 insert into tb2(name)values('seven');
23 COMMIT;
24
25 -- SUCCESS
26 set p_return_code = 0;
27
28 END\\
29 delimiter ;
30 set @i =0;
31 call p1(@i);
32 select @i;
支持事務的存儲過程
五、索引
索引,是數據庫中專門用於幫助用戶快速查詢數據的一種數據結構。類似於字典中的目錄,查找字典內容時可以根據目錄查找到數據的存放位置,然後直接獲取即可。
30
10 40
5 15 35 66
1 6 11 19 21 39 55 100
MySQL中常見索引有:
1、普通索引
普通索引僅有一個功能:加速查詢

1 create table in1( 2 nid int not null auto_increment primary key, 3 name varchar(32) not null, 4 email varchar(64) not null, 5 extra text, 6 index ix_name (name) 7 )創建表和索引

1 create index index_name on table_name(column_name)創建索引

1 drop index_name on table_name;刪除索引

1 show index from table_name;查看索引
注意:對於創建索引時如果是BLOB 和 TEXT 類型,必須指定length。
create index ix_extra on in1(extra(32));
2、唯一索引
唯一索引有兩個功能:加速查詢 和 唯一約束(可含null)

1 create table in1( 2 nid int not null auto_increment primary key, 3 name varchar(32) not null, 4 email varchar(64) not null, 5 extra text, 6 unique ix_name (name)表+唯一索引

1 create unique index 索引名 on 表名(列名)創建唯一索引

1 drop unique index 索引名 on 表名刪除唯一索引
3、主鍵索引
主鍵有兩個功能:加速查詢 和 唯一約束(不可含null)

1 create table in1( 2 nid int not null auto_increment primary key, 3 name varchar(32) not null, 4 email varchar(64) not null, 5 extra text, 6 index ix_name (name) 7 ) 8 9 OR 10 11 create table in1( 12 nid int not null auto_increment, 13 name varchar(32) not null, 14 email varchar(64) not null, 15 extra text, 16 primary key(ni1), 17 index ix_name (name) 18 )創建主鍵和主鍵索引

1 alter table 表名 add primary key(列名);創建主鍵

1 alter table 表名 drop primary key; 2 alter table 表名 modify 列名 int, drop primary key;刪除主鍵
4、組合索引
組合索引是將n個列組合成一個索引
其應用場景為:頻繁的同時使用n列來進行查詢,如:where n1 = 'alex' and n2 = 666。

1 create table in3( 2 nid int not null auto_increment primary key, 3 name varchar(32) not null, 4 email varchar(64) not null, 5 extra text 6 )創建表

1 create index ix_name_email on in3(name,email);創建組合索引
如上創建組合索引之後,查詢:
注意:對於同時搜索n個條件時,組合索引的性能好於多個單一索引合並。
六、其他

1 delimiter \\ 2 CREATE PROCEDURE proc_if () 3 BEGIN 4 5 declare i int default 0; 6 if i = 1 THEN 7 SELECT 1; 8 ELSEIF i = 2 THEN 9 SELECT 2; 10 ELSE 11 SELECT 7; 12 END IF; 13 14 END\\ 15 delimiter ;if語句

1 delimiter \\ 2 CREATE PROCEDURE proc_while () 3 BEGIN 4 5 DECLARE num INT ; 6 SET num = 0 ; 7 WHILE num < 10 DO 8 SELECT 9 num ; 10 SET num = num + 1 ; 11 END WHILE ; 12 13 END\\ 14 delimiter ;while循環

1 delimiter \\ 2 CREATE PROCEDURE proc_repeat () 3 BEGIN 4 5 DECLARE i INT ; 6 SET i = 0 ; 7 repeat 8 select i; 9 set i = i + 1; 10 until i >= 5 11 end repeat; 12 13 END\\ 14 delimiter ;repeat循環

1 delimiter \\ 2 CREATE PROCEDURE proc_loop () 3 BEGIN 4 5 declare i int default 0; 6 loop_label: loop 7 select i; 8 set i=i+1; 9 if i>=5 then 10 leave loop_label; 11 end if; 12 end loop; 13 14 END\\ 15 delimiter ;loop

1 delimiter \\ 2 DROP PROCEDURE IF EXISTS proc_sql \\ 3 CREATE PROCEDURE proc_sql () 4 BEGIN 5 declare p1 int; 6 set p1 = 11; 7 set @p1 = p1; 8 9 PREPARE prod FROM 'select * from tb2 where nid > ?'; 10 EXECUTE prod USING @p1; 11 DEALLOCATE prepare prod; 12 13 END\\ 14 delimiter ;動態執行mysql