1、Pymysql前端
在增刪改文檔的時候,必需要加上.commit確保修改的成功python
#pip3 install pymysql #安裝pymysql模塊,在python中可使用於mysql之間交互 import pymysql client=pymysql.connect( host='127.0.0.1', port=3306, user='root', password='yf123', database='db4', charset='utf8' ) cursor=client.cursor() #mysql郵標是接受sql語句在cmd中,而python中是以cursor爲郵標 sql='insert into t1 values(2,"yf");'#sql語句 try: res=cursor.execute(sql)#execute執行的意思 print(res) client.commit() #改操做必定要commit except Exception: client.rollback() cursor.close()#關閉郵標 client.close()#回收套接字資源
2、增長,刪除mysql
增長sql
#pip3 install pymysql #安裝pymysql模塊,在python中可使用於mysql之間交互 import pymysql client=pymysql.connect( host='127.0.0.1', port=3306, user='root', password='yf123', database='db4', charset='utf8' ) cursor=client.cursor() #mysql郵標是接受sql語句在cmd中,而python中 是以cursor爲郵標 userinfo=[ (6,"cq"), (7,"zz"), (8,"hb") ] # for user in userinfo: sql='insert into t1 values(%s,%s);'#sql語句 # # res=cursor.execute(sql)#execute執行的意思 cursor.executemany(sql,userinfo)#executemany就是循環出userinfo,不須要for循環 client.commit() #改操做必定要commit cursor.close()#關閉郵標 client.close()#回收套接字資源
刪除數據庫
import pymysql client=pymysql.connect( host='127.0.0.1', port=3306, user='root', password='yf123', database='db4', charset='utf8' ) cursor=client.cursor() cursor.execute('delete from t1 where id=3;') client.commit() #改操做必定要commit cursor.close()#關閉郵標 client.close()#回收套接字資源
3、調用存儲過程後端
在密碼前輸入password能夠起到加密做用異步
在密碼輸入以後會到數據庫進行對比,若是有結果出來就表明輸入的賬號密碼是正確的ide
每次刪記錄,針對默認遞增的,若是下次註冊信息不手動填補以前刪除的id那麼會形成跳空,直接按照最後一次的序列號繼續下去,若是手動填補了以前的刪除id,就算後面手動繼續輸入id存儲,默認id遞增序列也會自動跟從函數
在mysql中--是同一行註釋後面的內容oop
Xxx」 -- xxxxx
Xxx」 or 1=1 -- hellsb
Mysql裏面 沒有密碼或者賬號也能登入數據庫,因此在前端以及後端都須要加防,特殊字符的取消
import pymysql client=pymysql.connect( host='127.0.0.1', port=3306, user='root', password='yf123', database='db4', charset='utf8' ) cursor=client.cursor(pymysql.cursors.DictCursor) #查詢 inp_user=input("輸入帳號名:").strip() inp_pwd=input("輸入密碼:").strip() sql='select id from user where name = "%s" and pwd = "%s";' %(inp_user,inp_pwd) rows = cursor.execute(sql) if rows: print("登入成功") else: print("用戶名或者密碼錯誤") cursor.close()#關閉郵標 client.close()#回收套接字資源
client=pymysql.connect( host='127.0.0.1', port=3306, user='root', password='yf123', database='db4', charset='utf8' ) cursor=client.cursor(pymysql.cursors.DictCursor)#將fetchall拿到的結果以一個大列表的形式, # 裏面的每個消息內都是以字典的形式進行顯示 #查詢 inp_user=input("輸入帳號名:").strip() inp_pwd=input("輸入密碼:").strip() sql='select * from user where id > 3;'#執行sql語句不會在原地等,是異步過程 rows = cursor.execute(sql,(inp_user,inp_pwd)) #這種方式,會在用戶輸入帳號密碼以後 # 傳輸以前進行一個檢查是否有特殊符號 # print(rows)#是查詢成功的行數 #內存中拿結果 # print(cursor.fetchall())#fetchall,查看全部的結果,以大元組的形式裏面每個結果以小元組方式 # 用fetchall方式拿完一次,後面直接再拿就沒法獲取到 # cursor.scroll(0,mode="absolute")#絕對位置移動,在第一次fetchall取完內容以後,再用scroll方式 # absolute方法能夠相似指針方式移動到最初位置,最前面的數字輸入多少就是就是從最開始日後移動多少 # print(cursor.fetchall()) # print(cursor.fetchone())#每次拿一條信息 # cursor.scroll(2,mode="relative")#相對當前位置移動,在目前所在位置向後移動,前面的數字表明 # 移動的個數 # print(cursor.fetchmany(2))#是從查詢結果當中拿的條數,括號內填寫的數字是針對一次拿幾條的信息 cursor.close()#關閉郵標 client.close()#回收套接字資源
四、視圖
視圖既是將虛擬表保存下來 create view student2score as select * from student inner join score on student.sid = student_id; create view student2score as select student.*,score.sid as score_sid,student_id,course_id,num from student inner join score on student.sid = student_id;
須要注意的是:
建立視圖須要create view student2score as
另外若是表裏面有重複字段會報錯
視圖建立出來的表,只有表結構沒有表內容,而表的內容都是經過查詢語句每次查詢出來的結果(另外兩張表內),視圖至關於就保存了sql語句,直接使用表不用每次鏈接表,不要去改視圖裏面的記錄,主要是用查詢,簡化查詢語句
強調
#一、字段名不能重複
#二、視圖是爲了簡化查詢的sql語句,不該該修改視圖中的記錄
刪除視圖
drop view student2score(視圖名稱)
5、觸發器
針對記錄的增刪改行爲自動觸發
命名按照
create trigger(建立觸發器) (tri(觸發器) _before(針對以前仍是以後)_insert(針對什麼行爲)_tb1(哪張表))命名方式
# 插入前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
CREATE TABLE cmd ( id INT PRIMARY KEY auto_increment, USER CHAR (32), priv CHAR (10), cmd CHAR (64), sub_time datetime, #提交時間 success enum ('yes', 'no') #0表明執行失敗 ); CREATE TABLE errlog ( id INT PRIMARY KEY auto_increment, err_id int, ); delimiter $$ #更改結束符號 CREATE TRIGGER tri_after_insert_cmd AFTER INSERT ON cmd FOR EACH ROW BEGIN if NEW.success = 'no' then insert into errlog(err_id) values(NEW.id); end if; END $$ delimiter ;
6、事務
transaction 事務,交易
事務能夠包含一系列的sql語句,事務的執行具備原子性
一、原子性:
包含多條sql語句,要麼都執行成功,要麼都執行不成功
二、回滾
rollback,遇到狀況就回滾到以前狀態,就像什麼都沒發生過同樣
start transaction;開啓事務
在這裏面作的全部修改若是遇到rollback就會回到原來的狀態
start transaction; try: update user set balance=900 where id=1; update user set balance=1010 where id=2; update user set balance=1090 where id=3; commit; except Exception: rollback;
七、流程控制:
delimiter // create procedure proc_while() begin declare num int; set num = 0; while num < 10 do select num; set num = num+1; end while; end // delimiter;
delimiter // create procedure proc_repat() begin declare i int; set i = 0; repeat select i; set i=i+1; until i>=5 end repeat; end// delimiter;
begin declare i int default 0; loop_label:loop set i=i+1; if i<8 then iterate loop_label; end if; if i>=10 then leave loop_label; end if; select i; end loop loop_label end
八、函數
select date_format(sub_time,"%Y-%m"),count(id) from blog group by date_format(sub_time,"%Y-%m");#不要單獨使用,要在sql語句中使用
九、存儲過程
delimiter $$ create procedure p1() #建到某一個庫下,p1存儲過程名 begin select * from blog; end $$ delimiter ; call p1()#用call進行調用存儲過程,存儲過程是一系列sql語句的結合體,裏面能夠用mysql裏面的全部功能, 是mysql一堆功能的封裝體,給應用程序用 create table s1( id int, name varchar(20), gender char(6), email varchar(50) );#將表存放進 delimiter $$ #定義階段 create procedure p2() BEGIN declare n int default 1; while (n < 100000) do insert into s1 values(n,concat('yf',n),'male',concat('yf',n,'@163.com')); set n=n+1; end while; END $$ delimiter ;
delimiter $$ create procedure p3( in n int, out res int #進行返回 inout x int #既能傳值也能得到返回值,用其中一個就行 ) begin select * from blog where id>3; set res = 0; #返回值 end $$ delimiter ; 針對out參數要傳變量 set @x=111; call p3(3,@x) #而後再調用 返回值爲0就成功了 select @x; +------+ | @x | +------+ | 0 | +------+ 在python中調用: cursor.callproc('p4',(3,111)) #set @_p4_0 = 3; set @_p4_1 = 111 print(cursor.fetchall()) cursor.execute('select @_p4_1;') print(cursor.fetchone())