此次介紹mysql
以及在python
中如何用pymysql
操做數據庫, 以及在mysql
中存儲過程, 觸發器以及事務的實現, 對應到pymysql
中應該如何操做.
'-----------------------------------------------------------------'python
cmd
窗口中展現常見的sql
命令鏈接數據庫 mysql -u root -p password -h (localhost)
mysql
顯示數據庫 show databases;
linux
create database pymysql_db default charset utf8 collate utf8_general_ci;
use pymysql_db;
顯示當前數據庫全部的表 show tables;
sql
'-----------------------------------------------------------------'數據庫
userinfo
建立表以下ide
-- 建立一個名爲userinfo的表 CREATE TABLE `userinfo` ( `nid` INT (11) NOT NULL AUTO_INCREMENT, `name` VARCHAR (32) DEFAULT NULL, `color_nid` INT (11) DEFAULT NULL, PRIMARY KEY (`nid`), CONSTRAINT `userinfo_ibfk_1` FOREIGN KEY (`color_nid`) REFERENCES `color` (`nid`) ) ENGINE = INNODB DEFAULT CHARSET = utf8;
刪除表內容(自增也清零) truncate table 表名函數
修改表結構oop
- 增長一列 alter table 表名 add 列名 類型
- 刪除一列 alter table 表名 drop column 列名
- 修改列類型 alter table 表名 modify column 列名 新類型;
- 修改列名稱和列類型(類型保持不變也可) alter table 表名 change 原列名 新列名 類型;
刪除默認值 alter table 表名 alter 列名 drop default;性能
'-------------------------------------------------------------'fetch
'----------------------------------------------------------------'
- select A.xx B.oo from A, B where A.x=B.o 沒有A.x=B.o對應的數據則不顯示任何結果
- select A.xx B.oo from A inner join B where A.x=B.o A和B具備對等位置, 沒有A.x=B.o對應的數據則不顯示任何結果
- select A.xx B.oo from A left join B where A.x=B.o A表顯示全部, 對於B表若無符合A.x=B.o的數據則其值爲null來顯示
- select A.xx B.oo from B right join A where A.x=B.o A表顯示全部, 對於B表若無符合A.x=B.o的數據則其值爲null來顯示
'---------------------------------------------------------------'
在介紹觸發器,存儲過程,函數以及事務以前咱們先簡單的過一下mysql
中的條件和循環語句
if 條件 then 普通sql語句; elseif 條件 then 普通sql語句; else 普通sql語句; end if;
- while循環
while 條件 do 普通sql語句; end while;
- loop循環
loop_label:標籤名 普通sql語句; - -繼續循環 iterate loop_label; - - 跳出循環 leave loop_label; end loop;
'---------------------------------------------------------------'
-- 定義結束符爲$$, 在mac和linux中頗有必要 delimiter $$ -- 若是存在tri_before_update_userinfo觸發器則刪除, 方便調試和修改 DROP TRIGGER if EXISTS tri_before_update_userinfo $$ -- 建立tri_before_update_userinfo觸發器, 該觸發器會在更新userinfo表以前執行begin和end之間的內容(before表示以前, after表示以後) CREATE TRIGGER tri_before_update_userinfo BEFORE UPDATE ON userinfo FOR EACH ROW BEGIN -- 若是在userinfo表中更改name爲tom的行則會在color表中插入一行(old表示原來的數據) IF old.name = 'tom' THEN INSERT INTO color(tag) VALUES('black'); -- 若是在userinfo表中有name修改後爲cc則會在color表中插入一行(new表示修改後的數據) ELSEIF new.name = 'cc' THEN INSERT INTO color(tag) VALUES('yellow'); END IF; end $$ delimiter ;
'-------------------------------------------------------------------'
DELIMITER $$ DROP PROCEDURE IF EXISTS p1 $$ CREATE PROCEDURE p1( IN in_1 INT, INOUT inout_1 INT, OUT out_1 INT ) BEGIN - - 聲明語句塊中的臨時變量 DECLARE tmp_in_1 INT; DECLARE tmp_inout_1 INT; - -賦值語句 SET tmp_in_1 = in_1; SET tmp_inout_1 = inout_1; SET out_1 = tmp_in_1 + tmp_imout_1; - - 正常的esql查詢語句 SELECT * FROM userinfo LIMIT in_1, onout_1; END $$ DELIMITER;
-- 設置用戶變量傳值,in類型可不用變量傳值, out類型不能傳入值, -- set @in_1_tmp=1; set @inout_1_tmp=3; -- 調用存儲過程, 傳入參數 CALL p1 (1,@inout_1_tmp,@out_1_tmp); -- 取得存儲過程的執行結果, 包括sql語句結果集以及變量值(in, inout以及out類型變量都能取得他們的值) SELECT @in_1,@inout_1_tmp,@out_1_tmp;
DROP procedure 存儲過程名
’--------------------------------------------------------------‘
- 普通索引 index : 僅僅加速查詢, 無約束
- 惟一索引 unique : 加速查詢, 指定的列不能重複, 可出現一次null
- 主鍵索引 primary key : 加速查詢, 列值惟一切不能爲null
- 組合索引 : 多列做爲共同體組成索引, 效率高於多個索引列合併查詢
- 全文索引: 數據庫存儲時候對存儲內容進行分詞存儲便於搜索查詢
查看當前表那些字段有索引 SHOW INDEX FROM userinfo;
如下狀況即便建立了索引也不會使用索引:
- %開頭的模糊匹配條件: select * from 表名 where 列名 like '%其餘';
對創建索引的列使用函數查詢: select * from 表名 where 函數名(列名) = 其餘條件- 列類型匹配錯誤的條件查詢時候 : select * from 表名 where 列名 = 不正確的類型;
- 當or條件中含有未創建索引的列時: select * from 表名 where 條件01 or 條件02';
- 匹配條件爲不等於時候(主鍵例外) : select * from 表名 where 非主鍵列 != 其餘;
- 匹配條件爲大於的時候(主鍵或索引爲整型例外) : select * from 表名 where 列名 > 其餘;
- 排序時候選擇的映射與排序列不同即便都是索引列也不走索引(主鍵例外) : select 索引列-01 from 表名 order by 索引列-02 desc;
- 組合索引爲 索引列-01和索引列-02, 當先查索引列-02時候也不走索引
用執行計劃能夠詳細顯示sql語句(使用查詢語句纔有意義)的執行狀況, 例如如執行EXPLAIN SELECT * from userinfo;
關於上述表中詳細字段解釋 :
- id 查詢順序標識, 表示sql查詢語句的執行順序
- select_type 查詢語句的類型: 簡單查詢SIMPLE, 最外層查詢PRIMARY, 子查詢DERIVED, 映射是子查詢SUBQUERY, 聯合查詢UNION, 聯合查詢所得UNION RESULT
- table 正在訪問的表名
- partitions 分區類型
- type 查詢方式, 查詢時間性能排序 : 全表掃描all > 全索引掃描index > 索引部分範圍內掃描range > 多單列索引合併掃描index_merge > 索引匹配一個或多個值掃描ref > 聯合主鍵索引或者惟一索引掃描eq_ref > 最多有一個匹配行優化後做爲常量表掃描const, 還有system特列, 性能與const近似
- possible_keys 可能使用的索引
- key 實際使用的索引
- key_len 字節長度
- rows 預測找到所需內容要查找的行數
- extra 其餘信息, 多爲mysql解決查詢的詳細信息
-- 查詢第1000條數據以後的10條數據 -- 這種查詢方式會進行全文掃描 SELECT * FROM userinfo LIMIT 1000,5; -- 這種方式僅僅優化了一點, 使用了一些普通索引和索引合併查詢 EXPLAIN SELECT * FROM userinfo WHERE nid > (SELECT nid FROM userinfo LIMIT 1000, 1) LIMIT 5; -- 直接根據計算所得後的最大條數倒序排列查詢 SELECT * FROM userinfo WHERE nid < 上次最大條數 ORDER BY nid DESC LIMIT 5;
- 查看全局變量 show global variables like "%名稱"
- 設置全局變量 set global 變量名=值
- 是否開啓慢日誌全局變量 slow_query_log = OFF
- 時間限制全局變量 long_query_time = 2
- 日誌文件存放位置全局變量 slow_query_log_file = /usr/slow.log
- 是否記錄未使用索引的查詢語句全局變量 log_queries_not_using_indexes = OFF
- 版本 -v或者--verbose
- 調試模式 -d或者--debug
- 排序方式 -s 規則選項, 默認是平均查詢時間at
- 倒序排列顯示 -r
- 顯示前number條 -t number
- 不要將sql中數字轉換成N,字符串轉換成S, 選項爲, -a
'----------------------------------------------------------------'
#!/usr/bin/env python # -*- coding:utf-8 -*- import pymysql # 建立鏈接通道, 設置鏈接ip, port, 用戶, 密碼以及所要鏈接的數據庫 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='pymysql_db') # 建立遊標, 操做數據庫, 指定遊標返回內容爲字典類型 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 調用存儲過程, 傳入參數 cursor.callproc('p1', (1, 5, 0)) # 獲得結果集1, 即sql語句執行結果 select_result = cursor.fetchone() print(select_result) # 執行存儲過程, 獲取返回值, @_存儲過程名_第一個參數 cursor.execute("select @_p1_0,@_p1_1,@_p_2") select_result = cursor.fetchone() print(select_result) cursor.close() conn.close()