mysql之檢視,事務,儲存過程
一,檢視
什麼是檢視,本質就是一張虛擬的表,它的資料來自select語句
有什麼用?
原表的安全性
功能1,隱藏部分資料,開放指定資料
2,檢視可以將查詢的結果儲存,可以減少書寫sql的次數
如何使用?
建立檢視
create view 檢視名 as select * from 表名; create view test_view as select * from t1;
強調:1,在硬碟中,檢視只是表的結構檔案,沒有表的資料檔案
2,檢視通常是用於插敘,儘量不要修改檢視中的資料
特點;1,每次對檢視進行查詢,都是執行了as後面的sql語句
2,可以對檢視進行修改,修改會同步到原表中
3,檢視是永久儲存的,儲存的不是資料,而是一條as sql語句
二,sql注入問題:
import pymysql # 1,與資料庫伺服器建立連結 conn = pymysql.Connect( host='127.0.0.1', user='root', password='admin', database='day42', port=3306, charset='utf8' ) # 2 獲取遊標物件(用於傳送和接收資料) cursor = conn.cursor(pymysql.cursors.DictCursor) # 3,用遊標執行sql語句 # 這樣輸入or 或者'就會使程式只匹配使用者名稱 inp_name = input('使用者名稱>>>:').strip() #inp_user='egon"--hjkhdkhdk' --表示後面的內容全部為註釋的 inp_psd = input('密碼>>:').strip() #inp_psd = '' sql = 'select * frm user where userword="%s" and password="%s"' %(inp_name,inp_psd) rows = cursor.execute(sql) if rows: print('登入成功') else: print('登入失敗') # 5,關閉連結(先關遊標,再關連結) cursor.close() conn.close()
# 在服務端防止sql注入問題,不要自己拼接字串 import pymysql conn = pymysql.Connect( host='127.0.0.1', user='root', password='admin', database='day42', port=3306, charset='utf8' ) cursor = conn.cursor(pymysql.cursors.DictCursor) inp_name = input('使用者名稱>>>:').strip() #inp_user='egon"--hjkhdkhdk' --表示後面的內容全部為註釋的 inp_psd = input('密碼>>:').strip() #inp_psd = '' sql = 'select * frm user where userword=%s and password=%s' rows = cursor.execute(sql,(inp_name,inp_psd)) #做字串的拼接,在拼接的時候自動過濾特殊字串 # rows = cursor.execute(sql,args=(inp_name,inp_psd)) # 另一種賦值的語句 if rows: print('登入成功') else: print('登入失敗') cursor.close() conn.close()
三,事務
什麼是事務?
一件事情的完成通常不可能一步到位,需要拆分多個小步驟
那麼在Mysql中一組sql語句的集合就是事務
事務的特性:
1,原子性
事務就是一個整體,不可分割
2,隔離性
事務之間要相互隔離,為了維護資料完整性
早併發訪問的時候,導致一些問題
1,髒讀,一個事務讀到了另一個事務未提交的的資料(避免:查詢之前要確保所有所有的資料都已經更新完畢了)
2,幻讀,一個查詢事務沒有結束時,資料被另一個事務執行了insert delete
3,不可重複讀,一個查詢事務沒有結束時,資料被另一個事務執行了update
隔離級別:
1,讀未提交
2,讀已提交
3,可重複讀 預設
4,序列化
3,一致性
當事務執行後,所有的資料都是完整的(外來鍵約束 非空約束)
4,永續性
一旦事務提交,資料就永遠儲存
總結:mysql客戶端預設開啟就自動提交,一條sql語句就是一個單獨的事務
pymysql客戶端是預設不提交的,需要手動commit ,意思就是預設開啟了事務
四,儲存過程
包含一系列可執行的sql語句,儲存過程存放於mysql中,通過呼叫它的名字可以執行其內部的sql語句
三種開發模型:
1,應用程式:只主要開發應用程式的邏輯
mysql:編寫好儲存過程,以供應用程式呼叫
優點:開發效率,執行效率都高
缺點:考慮到認為因素,跨部門溝通等問題,會導致擴充套件性差:
2,應用程式:除了開發應用程式的邏輯,還需要編寫原生的sql
優點:比方式一擴充套件性高(非技術性的)
缺點:1,開發效率,執行效率都不如方式一
2,編寫原生sql太過於複雜,而且需要考慮到sql語句的優化問題
3,應用程式:開發應用程式的邏輯,不需要編寫原生的sql,基於別人編寫好的框架來處理資料
優點:不用編寫純生的sql,這以為著開發效率比方式2高,同時相容方式二擴充套件性高的好處
缺點:執行效率低於方式二
建立儲存過程
在mysql中呼叫儲存過程
delimiter $$ create procedure p1( in m int, in n int, out res int ) begin select tname from teacher where tid > m and tid < n; set res=0; end $$ delimiter ;
在python中呼叫儲存過程
import pymysql conn = pymysql.Connect( host='127.0.0.1', user='root', password='admin', database='day42', port=3306, charset='utf8' ) cursor = conn.cursor(pymysql.cursors.DictCursor) cursor.callproc('p3',(3,100)) print(cursor.fetchall()) #查詢返回結果 cursor.close() conn.close()