函數,事務,索引,存儲過程

重點,事務,索引:
--常見的安全問題:
sql注入:用戶輸入不合法
經過攻擊服務器的安全漏洞竊取數據庫 一種常見的方式
在黑市上能夠買到數據庫信息
裝庫,利用從別處叨叨的用戶名和密碼,嘗試在另一個站點上登陸,從而獲得更多
信息
安全建議:
1.對數據庫設計的建議:在表中存儲加密後的密碼數據,常見加密方式 :md5,sha1
2.對網站程序員的建議:登陸時添加驗證碼
3.對普通用戶的建議:在多個站點間使用不一樣的密碼
oauth:受權登陸,微信,微博,新浪

函數:
? functions;  查看系統內置函數
函數自定義
自動義函數
--特色:必須有返回值
create function 函數名稱(參數列表)returns 返回類型
create function f1() returns int
--函數體
return 10;
--查看函數存在什麼位置---->mysql.proc
select db,name,type from mysql.proc;
--調用自定義函數
select f1();
--刪除函數
drop function f1    # 刪除的時候必須得在本數據庫否則要加數據庫名稱
delete from mysql.proc where name =f1;

--定義一個函數實現加法運算
1.若是函數體中不止一行代碼的時候須要使用begin。。。end
2.定義變量須要使用declare
3.每一個語句都須要添加;表示結束
4.給變量賦值,須要set
5.delimiter 臨時修改結束標示符號
(傳入的參數能夠跟一個類型)
delimiter //
create function f1(a int,b int) returns int
begin
--定義一個變量res
declare res int default 0;
--將a+b賦值給res
set res = a+b;
--返回res
return res;
end
//
delimiter ;

變量:
聲明臨時變量:只能在begain --end
設置 set
用戶變量 用@變量名
賦值 :=
--系統變量
用@@標示系統變量

---分支結構,循環結構
 
---輸出0-100之間的偶數;
delimiter //
create function f3() returns  varchar(300)
begin
--定義一個遞增的變量i,和一個用來拼接偶數的res
declare i int default 0,
declaer res varchar(300) default "",
--經過循環來遞增i
while i <= 100 do
--判斷i是否爲偶數
if i %2 =0 then
--拼接偶數
set res=concat(res,'',i);
end if;
set i = i+1;
end while;
 
--返回res
end
delimiter;

函數在使用過程當中的缺陷。注意事項
1.在函數中調用其餘的函數,不須要使用select
2.在函數中不可以調用select 語句,除了select...into
拿一個值賦值而函數是返回一個值
只要select 有返回值的話,就不能在函數中使用
函數的缺陷:可是能夠用into傳入

存儲過程 和函數很是相似
建立
delimiter //
create procedure 存儲過程名稱(參數類表)
begin
sql(語句)
end
delimiter;

 

--存儲過程的定義
delimiter //
creater procedure procel()
begin
select * from students;
select count(*) from students;
end
//
delimiter
--查看
select db,name ,type from mysql.proc;
--調用(若是沒有參數,小括號能夠省略),有參數必定不可以省略
call procel();
--沒有返回值 能夠經過參數來實現返回值
--sql中的參數有三種類型(一個函數數最多設置1024個參數)不必
--in 默認的參數都是 in 類型,表示傳入類型的參數
--out 傳出類型的參數,經過out類型的參數給存儲過程實現返回值功能
--inout 既能夠傳入,又能夠傳出,通常不用,a,參數的語義很差描述
致使函數的語義不夠清晰,
--傳入一個學生的id,刪除該學生,返回學生的總人數
delimiter //
create procedure deletebysid_getcount(in sid int unsigned,out scount int)
begin
delete from students where id = sid;
select count(*) from students into scount;
end
//
delimiter ;
--
--定義一個用戶變量
set @count =0;
 
call deletebyssid_getcount(15,@count)

存儲過程和函數的區別

面試過程的時候常常會問道
相同點:
1存儲過程和函數都是爲了封裝,可重複的執行操做數據庫的sql語句的集合
2.都是一次編譯,(節省sql執行的時間)
3.減小網絡交互,減小網絡訪問流量
 
編譯:客戶端發送命令給sql,---mysql引擎,分析(sql語法)一個一個對比,
整個sql語句都是符合的dql語法的,會拿正確的sq語句,編譯成可識別的命令
-----執行----執行結果----返回---客戶端
客戶端--sql命令---mysql引擎---分析---語法正確----編譯---可識別的命令--
執行---執行結果---返回---客戶端
不一樣點
標示符不一樣 function 過程 procedure
函數必須有返回值,過程沒有返回值,可是能夠經過設置參數類型(in,out)
來實現多個參數或者返回值
函數使用select調用,存儲過程使用call調用
select(語句能夠在存儲過程當中調用,可是除了select。。into以外的select
語句都不能再函數中調用
經過in out 參數,過程相關函數更加靈活,能夠返回多個結果

視圖 :不能更新,先刪除,再建立

封裝的比較好,構架的,越好維護===思考怎麼讓健壯性,可維護性
對複雜的查詢語句的封裝
解決:定義視圖
視圖 本質:就是對查詢結果的封裝
定義視圖,建議以v_開頭
--視圖的使用
create view 視圖名稱  as select 語句;
create view v_stu as select * from students;
select * from v-stu
 
--刪除
drop view v_stu;

事務四大特性(考試題)

事務普遍運用於訂單系統,銀行系統等多種場景
事務(transaction)是併發控制的基本單位,它是一個操做序列,要麼執行,
要麼都不執行,它是一個不可分割的工做單位,
事務是數據庫維護數據一致性的單位,在每一個事務結束時,都能保持數據一致性
 
begin:開啓事務以後,後續的更新數據的操做(crud),不會當即影響到源數據庫
全部的都執行完成後,
成功,能夠完成修改的提交操做,commit
開啓事務以後的更新操做,纔會影響到源數據庫
若是失敗了,能夠執行回滾的操做,rollback(回滾),將以前的更新撤銷
 
操做指令
begin,commit ,rollback

用戶名惟一
加鎖(寫鎖)
事務四大特性(acid)
原子性,atomicity:不可被分割
一致性,consisitency:
隔離性,solation:相互不影響,在提交的時候就看誰先提交
持久性:對於已提交事務,系統必須保證該事務不被丟失,即便數據庫出現故障
 

 
--開啓事務
--面向鏈接的,數據的變化只會影響當前鏈接的用戶
--begin;
 
inset into classes values(0,」python23「);
select * from classes;
--commit;存儲到數據庫中,提交了事務,以前開啓的實物就結束了,接下來
的操做就不是在事務中完成
--rollback操做:
begin;
---更新的操做默認都是開啓了事務,而且會自動提交
crud
--begin是手動開啓手動,不會自動提交,須要手動執行commit 完成提交的操做
--大批量的數據更新的時候,手動開啓事務效率高仍是低呢?
1.可以提升更新的效率
2.可以保證更新的安全性 (髒數據,須要清楚)
若是出現故障,調用rollback,就不會出現髒數據
大批量數據更新的時候,須要手動更新事務,效率高,數據安全
 

索引

當數據庫數據量 很大時,查找數據會變的很慢
優化方案:索引
主鍵和惟一索引,都是索引,能夠提升查詢速度
主鍵是數據物理存儲的位置
索引會單首創建一個目錄,對應數據的位置
索引分單列索引和組合索引
單列索引 :一個索引只包含單個列,一個表能夠有多個單列索引
組合索引:一個索引包含多個列
索引:BTREE:自平衡排序二叉樹(徹底二叉樹)balance
缺點:1影響更新表的速度、
2.創建索引會佔用磁盤空間的索引空間
兩個極端
整個表沒有一個索引字段
每一個字段都建立了索引
給合適的字段建立索引,提升查詢的速度
 
語法:
--查看索引
show index from 表名(字段名稱(長度));
 
1--造100萬條假數據
2.經過索引字段來查詢對應的數據(查詢耗時)
3.經過非索引字段來查找對應的數據(查詢耗時)
4.對非索引建立索引,而後在經過建立了索引的字段再查詢一次(查詢時間)
5.對比查詢時間,分析效率的提高
1.經過定義存儲過程,插入到數據表中,建立數據表
2create table demo(
id int unsigned primary key auto_inrement not null,
name varchar(10));
 
delimiter //
create procedure domo_proc()
begin
declare i int default 0;
while i <=1000000 do
insert into demo(name) values (concat('domo",i);
set i =i+1;
end while;
end
//
delimiter ;
3.select *from demo;
--經過id來查找
set profiling=1;
select * from demo where id = 1000001;
show profiles;
select * from demo where name= 」demo10000001「
 
4.create index name_index on demo(name(50));
--開啓時間檢測
set profiling=1;
--獲取每一個sql執行的耗時
show profiles
--刪除索引
drop index name_index on demo;
 

mysql與python交互

環境搭建
包管理第三方包:sudo pip install 對應包名(pymysql)
會安裝到默認路徑:
 
在真是的狀況下:相同的包不一樣版本不可以共存,會覆蓋安裝
能夠建立一個虛擬環境,是一個擁有獨立python解釋器環境
,安裝不一樣版本的包,
虛擬環境基本操做
步驟
1.安裝虛擬環境的包
sudo pip install virtualenv
sudo pip install virtualenwrapper
2.建立一個虛擬環境(默認的是python2的解釋器)
py2虛擬環境:mkvirtualenv 虛擬環境名稱
py3的虛擬環境:mkvirtualenv -p /usr/bin/  (得手動配置路徑)
3.運行虛擬環境
workon 虛擬環境名稱
4.安裝pip包(第三方的包)指令:sudo(不能使用sudo,用的話會安裝默認)
指令:pip install 包名
須要聯網(熱點)nat模式下 拔網線

演示一下虛擬環境:

pycharm 配置虛擬環境

總結:
1安全問題:sql注入--‘ 單引號,發生錯誤,;分號,讓錯誤語句結束,而後執行咱們要操做的語句
---目前---能夠用參數防止 sql注入
2.函數---建立,調用------變量 (臨時變量declare,用戶變量set @xx=xx,系統變量@@
建立,調用,刪除
有返回值的sql語句中都不可以執行除了select 。。。into以外
3存儲過程--建立,查看--調用--刪除
參數的類型 in out inout類型的參數 經過out類型的參數能夠給存儲過程實現返回值
存儲過程當中 能夠執行任意的sql語句,更到的靈活,在實際開發中使用更多
 
相同點:減小網絡流量的消耗
4.視圖:對一個複雜的sql語句的封裝
5.事務:安全的更新數據庫的一中方式
四大特徵:原子性,一致性,隔離性,持久性
三個操做指令 begin commit rollbacl
1.手動開啓事務,手動提交事務
2.成功以後,進行提交,一旦提交不可以車腳
3.失敗以後,執行回滾操做,回滾去除髒數據
事務是面向當前鏈接的
事務更新大批量數據的時候,效率高,更新安全(髒數據)
6.索引:提升查詢的效率
下降更新的效率
額外消耗磁盤的效率
7 虛擬環境:virtualenv 使用步驟,使用的時候把網線拔了
 
 

注意在建立函數的時候,聲明變量的格式是:
declare 變量名 類型,default 默認值;
必須得有默認值
相關文章
相關標籤/搜索