Python/MySQL(四、MySQL數據庫操作)
阿新 • • 發佈:2017-06-10
lba done cas exceptio cal pytho llb create _id
Python/MySQL(四、MySQL數據庫操作)
一、數據庫條件語句:
1 case when id>9 then ture else false
二、三元運算:
1 if(isnull(xx)0,1)
三、上下連表:
select id,name from ta1 union 天然去重(檢測上邊的表和下邊的表行內完全一樣就只顯示一行內容) select num,sname from tb2 ========================================== select id,name from ta1 union all 不去重 select num,snamefrom tb2 ---------------------------------------------------------------------------- 註意:上下連接一定要保證行數相等
四、數據庫臨時表:
1 (select * from student)as B 2 創建一個臨時表(臨時表就是存在內存中的拿到的內容,方便下次使用時再次寫)
五、數據庫視圖:
1 創建視圖 2 create view 視圖名 as sql語句 3 註意:因為視圖是虛擬表,創建視圖就是相當於在實體表中綁定一個動態的表,所以在綁定的實體表數據發生變化時,視圖表也會發生變化。(因為視圖表示虛擬表所以不能進行表的修改操作。)4 修改視圖 5 alter view 視圖名 as sql語句 6 此處修改視圖(修改視圖綁定的實體表,不能對虛擬表進行修改操作) 7 刪除視圖 8 drop view 視圖名
六、數據庫觸發器:
當對某種表進行修改操作時可以綁定一個觸發器(在觸發器中可以編寫想要執行的SQL語句)
1 delimiter // 2 修改MySQL語句中結束語句的符號 3 create trigger t1 BEFORE INSERT on student for EACH ROW 4 創建觸犯器(插入一個數據就執行下邊的代碼一次) 5 BEGIN 6 開始7 INSERT into teacher(tname) values(NEW.sname); 8 老師表中插入一個老師名稱 9 INSERT into teacher(tname) values(NEW.sname); 10 此處NEW(綁定觸發器要插入的值獲取到) 11 INSERT into teacher(tname) values(NEW.sname); 12 INSERT into teacher(tname) values(NEW.sname); 13 END // 14 結束 15 delimiter ; 16 修改MySQL語句中結束語句的符號
NEW --- 代指新數據 OLD --- 代指舊數據
七、數據庫函數:
1、內置函數(使用內置函數去MySQL官網中查看)
2、自定義函數
1 delimiter \ 2 create function f1(i1 int i2 int) 3 returns int 4 定義函數,可以傳參,也具有返回值 5 begin 函數體開始 6 declare num int default 0; 7 set num=i1+i2; 8 return(num) 9 end \\ 函數體結束 10 delimiter ; 重新設置結束語句
3、調用函數方法
1 select 函數名稱加括號進行調用 2 select f1()
註意:在定義函數時,設定了倆個參數但是只用可一個,另一個參數必須進行傳參,並且在函數體內不能進行selsect操作!
八、數據庫存儲過程:
存儲過程就是保存在MySQL上的有別名(集合)--->SQL語句
存儲過程實現了開發人員寫代碼的過程。
存儲過程一:
MySQL存儲過程,在程序或者客戶端這邊只需要知道存儲過程的名稱就可以調用執行。
存儲過程二:
MySQL服務端啟動,客戶端自己進行寫SQL語句。
創建一個無參的存儲過程:
1 create procedure p1() 創建無參存儲過程 2 begin 3 select * from student: 4 insert into teacher(tnaem) values(‘alex‘) 5 end 6 7 調用存儲過程 8 call p1()
創建一個有參存儲過程:參數共分為(in(輸入) out(輸出)inout(可輸入可輸出))
1 delimiter // 2 create procedure p2( 3 in n1 int, 4 in n2 int 創建有參數的存儲過程,(參數都是in 輸入) 5 ) 6 BEGIN 7 8 select * from student where sid > n1; 9 END // 10 delimiter ; 11 12 call p2(12,2) 調用執行存儲過程(傳參數) 13 註意:在定義存儲過程時,設定了倆個參數但是只用可一個,另一個參數必須進行傳參
創建一個帶有輸入參數和輸出參數的存儲過程:
1 delimiter \ 2 create procedrue p3( 3 in n1 int 4 out n2 int 5 ) 6 begin 7 set n2=1212 8 select * from student where sid > n1 9 end \10 delimiter ;
註意:out 對應的傳值必須是變量,在存儲過程當中是沒有返回值(只能用out偽造一個返回值)在存儲過程當中還可以進行 selsect 操作!
九、數據庫事務:
1 delimiter \ 2 create procedure p5( 3 out tse tinyint 4 ) 5 begin 6 declare exit handler for sqlexception 7 begin 8 --error 9 set tse=1 10 rollback 11 end; 12 strat TRANSACTION; 13 delete from tb1; 14 insert into tb2(name) values(‘seven‘) 15 commit: 16 --success 17 set tse=2; 18 end; 19 delimiter ;
十、數據庫遊標:
1 delimiter // 2 create procedure p6() 3 begin 4 declare row_id int; -- 自定義變量1 5 declare row_num int; -- 自定義變量2 6 declare done INT DEFAULT FALSE; 7 declare temp int; 8 9 declare my_cursor CURSOR FOR select id,num from A; 10 declare CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 11 12 13 14 open my_cursor; 15 xxoo: LOOP 16 fetch my_cursor into row_id,row_num; 17 if done then 18 leave xxoo; 19 END IF; 20 set temp = row_id + row_num; 21 insert into B(number) values(temp); 22 end loop xxoo; 23 close my_cursor; 24 25 26 end // 27 delimter ; 28
十一、動態執行SQL(防SQL註入)
防止SQL註入的共有倆種方式,第一種是在pycharm中設置,第二種是在mysql中設置
1 delimiter \ 2 CREATE PROCEDURE p8 ( 3 in nid int 4 ) 5 BEGIN 6 set @nid = nid; 7 PREPARE prod FROM ‘select * from student where sid > ?‘; 8 EXECUTE prod USING @nid; 9 DEALLOCATE prepare prod; 10 END\11 delimiter ;
Python/MySQL(四、MySQL數據庫操作)