mysql:默認4G內存,能存儲800萬T數據,5000萬行記錄。
數據庫:處理業務
數據的存儲
學校->院系->班級->班
關係型數據庫:體現業務
表中的字段:管理各自職能範圍內的業務。(數據)java
一個關係數據庫是一種軟件:
1.可以實現具備表、列和索引的數據庫
2.保證了各類表的行之間是引用完整性
3.自動更新索引,索引放在字段裏。
4.解釋sql查詢和聯合各表信息mysql
數據庫的幾個定義
1.數據庫:是表的集合,具備相關數據。
2.表:表是用數據矩陣表現的數據展示形式
在一個數據庫中咱們也能夠把它看作是excel的展示正則表達式
3.列:一列包含一個數據類型相同的數據集合。(會出現數據類型這個概念)
4.行:一組相關的數據,表示當前表全部列的一行集合。
5.冗餘:存儲數據兩次,冗餘能使系統更快。
6.主鍵:主鍵是惟一的,不能在一個表中出現兩次。
使用主鍵能夠快速的查找到某一行sql
7.外鍵:兩個表之間的聯接字段
8.複合鍵:是由多個列組成的,一個鍵沒法知足惟一標識。
9.索引:索引是對數據庫表中一列或多列的值進行排序的一種結構,
使用索引可快速訪問數據庫表中的特定信息。就像一本書裏的目錄數據庫
show create table t_idcard;//顯示建表語句
desc t_idcard;//顯示錶結構服務器
SQL語言
一、sql語句是用於訪問和處理數據的標準計算機語言
二、可以對數據進行:select delete insert update
insert into table(字段) values(字段值)
delete from table where ..
update table set ... where ...
select .. from .. where .. -- 返回的是一個結果集數據結構
三、擴展功能:表、視圖、存儲過程、存儲函數。
四、在數據庫裏有許多表,可是表的名字在當前數據庫是惟一的,表裏包含數據記錄。
1》表的命名規則:t(顯示當前表的實在乎義)_tableName 、game(項目名)_user
加標籤用於區分表,表名的表示意義比較多的時候能夠加多個下滑線。併發
五、字符的引號和java中同樣,都須要用英文的單引號,不一樣的是字符串也是單引號。
(mysql中只有單引號,沒有雙引號)。sql自己對大小寫不敏感,但表中的數據對大小寫
超級敏感(mysql默認對大小不區分,若是要區分,在字段前面加binary)。oracle
六、mysql要求每條語句末尾都以分號結尾,這是一種標準寫法。
七、alert(修改數據庫表)
drop (drop表會把整表數據和表結構所有刪除)
create index (建立索引) 、drop index(刪除索引)數據庫設計
八、select:
查詢表中的數據,用來展現。
把查詢出來的結果存儲到一個結果表裏,稱爲結果集。
1》distinct 去掉重複的,返回惟一不一樣值。
2》where
where語句它只是select語句中的一個限定條件,起到過濾做用。
一般狀況下添加where條件,sql就會取出知足條件的結果集。
where過濾運算符,過濾的越多放在越後面。
運算符 描述
= 等於
<> 不等於mysql用!=
>
<
=>
<=
between num1 and num2 在某個範圍內
like % 模糊匹配
in 指定針對某個列多個可能值
limit 分頁處理,limit a,b(a起始條數從0開始,b控制顯示條數),如limit 0,10顯示前十條0-9
LIMIT 子句能夠被用於強制 SELECT 語句返回指定的記錄數。LIMIT 接受一個或兩個數字參數。
參數必須是一個整數常量。若是給定兩個參數,第一個參數指定第一個返回記錄行的偏移量,
第二個參數指定返回記錄行的最大數目。初始記錄行的偏移量是 0(而不是 1):
爲了與 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。
mysql> SELECT * FROM table LIMIT 5,10; // 檢索記錄行 6-15
//爲了檢索從某一個偏移量到記錄集的結束全部的記錄行,能夠指定第二個參數爲 -1:
mysql> SELECT * FROM table LIMIT 95,-1; // 檢索記錄行 96-last.
//若是隻給定一個參數,它表示返回最大的記錄行數目:
mysql> SELECT * FROM table LIMIT 5; //檢索前 5 個記錄行
//換句話說,LIMIT n 等價於 LIMIT 0,n。
where字句就像if同樣,後面跟着的判斷條件實際是if語句的boolean表達式。
where字句是拿數據庫表裏存的數據跟外部拿入的數據進行比較,若是比較的
結果爲true則返回該表的對應行數據。
在where字句裏作比較時候不區分大小寫,若是要區分則要在判斷條件(=)前的
字段前加binary關鍵字。如作like比較的時候,要區分大小寫。
mysql數據類型:數字、時間日期、字符串類型
1、數字類型
1》int 正常大小的整數,能夠帶符號。容許範圍-2147483648~2147483647
2》tinyint 一個很是小的整數,能夠帶符號,有符號範圍是-128~127,
無符號範圍是0~255,能夠多達4位數的寬度。
3》smallint 一個小的整數,能夠帶符號-32768~32767,無符號是65535
4》mediumint 一箇中等大小的整數,能夠帶符號,範圍是-8388608~8388607。
無符號是0~16777215
5》bingint 一個大的整數,能夠帶符號。能夠指定20位的寬度。
6》float(m,d) 不能使用無符號的數字。能夠顯示長度(m)和小數位(d),默認是10和2。
2表示小數的位數,10表示數字的總數。小數的精度能夠到24個浮點
7》double(m,d) 不能使用符號的雙精度浮點,可顯示長度(m)和小數位(d)。
默認值(16,4)其中16表示整數位4表示小數位 ,小數精度能夠達到53位。
8》decimal(m,d) 非壓縮的浮點數,不能是符號數,沒有默認值。
2、日期和時間類型
mysql時間日期類型包括:
一、date (mysql取當前系統時間用new()方法)
以YYYY-MM-DD格式的日期,在公元1000-01-01到9999-12-31之間。
例如2016年8月5號在mysql裏存儲2016-8-5。
二、datetime 日期和時間組合格式:YYYY-MM-DD HH:MM:SS格式。
在公元1000-01-01 00:00:00到9999-12-31 23:59:59。
例如2016年8月5號上午9點3分57秒將會存儲成2016-8-5 09:03:57
三、timestamp 1970年1月1號午夜之間的時間戳,到2037年的某個時間。
不須要鏈接符(-,:)。如(yyyymmddhhmmss)19731230153001
四、time 存儲的時間格式:hh:mm:ss
五、year(m)以2位和4位數字格式來存儲年份,長度若是指定2則定義方式爲year(2)。
1970到2069(70-69)。若是長度指定爲4位則定義的方式爲year(4)1901-2155,
若是不給長度則默認長度爲4。
3、字符串類型
雖然數字和日期類型存儲的樣式比較豐富,可是存儲的大多數數據均可以是字符串樹。
一、char(M) 固定長度的字符串,是以長度爲1到255個字符長度(char(5))。
存儲右空格填充到指定長度,能夠不指定長度,有默認是1。
二、varchar 可變長度的字符串,長度爲1-255(高版本的超過了255)
建立varchar類型的字段必須定義長度(varchar(10))沒有默認長度。
三、blod或者text字段最長65535個字符,blod是「二進制大對象」,用來存儲大的
二進制數據,如圖像或者其餘類型的文件。定義text文本字段持有大量的數據。
blod和text的區別主要是在排序和比較上,blod大小寫比較敏感而text不區分
大小寫。blod和text在定義時不須要指定長度。犀牛服務器
四、bold和text blod或者text字段用255的最大長度,不指定長度。
五、mediumblod或mediumtext 長度16777215定義的時候不須要指定長度。
六、longblod或者longtext 長度4294967295(4G-2)不指定長度
七、enum
排序 order by
select col1,col2,col3 from table
[where condition1 and|or condition2]
order by coll [,col2...] [asc] [desc]
asc:正序 ,默認的。
desc:倒序,要顯示的寫。
若是是varchar類型排序要經過cast signed強轉成原數據類型再排序,
varchar是一位一位的比較(逐位比較)。
join 聯接:a表和b表經過join聯接起來,聯接條件爲on後面的判斷,
只取出兩表匹配上的數據,其餘的不要。
例如:
select a.col1,a.col2,b.col3
from table a
join table2 b
on a.id=b.out_id [condition]; //聯接條件
left join (左聯接)
select
from table1 a
left join
table2 b
on a.id=b.outid ;[condition]
把左聯接當作是關鍵字left join的左右匹配,把左表做爲主動表,把右表做爲從動表。
從動表去匹配主動表,從動表匹配上了的數據取出,沒有匹配上的不要。而主動表中
沒有匹配上的數據也要取出來。
right join(右鏈接)
join右邊的表爲主動表,左側的表爲從動表其餘相似左聯接。
inner join(等值鏈接) 只返回兩個表中聯結字段相等的行
null:
一、is null 若是列的值爲null(不是""空字符串)返回true
二、is not null 若是列的值不爲null,返回true。
三、<=> 運算符的比較,(不一樣於 =)即便兩個空值都返回true。
通常狀況下涉及null的條件都比較特殊,不能使用 列=null或者!=null來匹配列的空值
null = null也是不行的。查找列的值是否爲null只能使用is null或者is not null
正則表達式(regexp)
模糊匹配:like..%..
mysql支持另外一種類型的模式匹配基於正則表達式和正則表達式運算符
正則運算符:
模式 什麼樣的模式匹配
∧ 開始的一個字符串('∧小')
$ 結束的一個字符串('ggk$')
. 任意單個字符
[] 方括號中列出的任何字符
[∧...] 任何字符方括號之間不會被列出
p1|p2|p3 交替匹配的任何模式p1,p2,p3
* 前一個元素的零個或者多個實例
+ 前面元素的一個或者多個實例
{n} 前一個元素的n個實例
{m,n} 前一個元素的m到n個實例
事務
事務是數據庫處理操做,執行起來就好像是一個有序的工做單元。
換而言之,事務將永遠不會是徹底的、除非在組內的每一個單獨的操做是成功的,
若是有一個環節失敗,那麼整個事務就失敗。
事務的性質又稱ACID特性:
一、原子性:確保了工做單位中的全部操做都成功,不然事務終止,
在失敗時會回滾到事務操做之前的狀態。
二、一致性:可確保數據庫正確的更改狀態,在一個成功事務的提交前提下。
三、隔離性:使事務相互獨立的進行操做。
四、持久性:確保了提交事務的結果或系統故障的狀況下任然存在做用。
提交和回滾
commit rollback
當一個成功的事務完成後,commit命令發出的變化對全部涉及的表有效。
若是發生故障,rollback命令發出後,事務中引用的每一個表都會回滾到
事務開始以前的狀態。
begin
declare sqlException param varchar(1) default
begin transaction;
insert into .... not null
if
param =1 then rollback ;
else
commit;
end
索引(index)
數據的索引也是一種數據結構,它的目的是提升表的操做速度。
可使用一個或者多個列提升快速隨機查找和訪問記錄的高效排序來建立索引。
實際上索引也是表,它保存主鍵和索引字段的指針而且指向每一個記錄到實際的表的類型。
做用就是爲了保證查詢速度,提升效率。
insert和update語句須要建立索引的時間比單純的select語句耗費的多。
在執行insert或update的時候須要耗費時間去更新索引值。
根據數據庫的功能,能夠在數據庫設計器中建立三種索引:惟一索引、主鍵索引和彙集索引。
簡單和惟一索引
能夠在表中建立惟一值索引,意味着兩行不能有相同的索引值。
create unique index index_name on table_name(col1,col2...);
惟一索引 UNIQUE
惟一索引是不容許其中任何兩行具備相同索引值的索引。
當現有數據中存在重複的鍵值時,大多數數據庫不容許將新建立的惟一索引與表一塊兒保存。
數據庫還可能防止添加將在表中建立重複鍵值的新數據。例如,若是在employee表中職員的
姓(lname)上建立了惟一索引,則任何兩個員工都不能同姓。
主鍵索引 PRIMARY
數據庫表常常有一列或列組合,其值惟一標識表中的每一行。該列稱爲表的主鍵。
在數據庫關係圖中爲表定義主鍵將自動建立主鍵索引,主鍵索引是惟一索引的特定類型。
該索引要求主鍵中的每一個值都惟一。當在查詢中使用主鍵索引時,它還容許對數據的快速訪問。
彙集索引
在彙集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個彙集索引。
若是某索引不是彙集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非彙集索引相比,
彙集索引一般提供更快的數據訪問速度。
使用alter命令來添加和刪除索引
一、添加主鍵,這意味着索引值必須是惟一的,而且不能爲空。
二、建立一個索引量的值必須惟一
三、增長普通索引,任何值的出現是屢次的。
四、建立一個用於文本搜索目的的特殊索引filetext索引
alert table table_name add index(c);
alert table table_name drop index(c);
顯示索引信息
show index from table_name;
重複處理:unique
select distinct age from t_student;
存儲過程 2016.8.11
一、建立存儲過程
語法:
create procedure sp_name([proc_params])
[characteristics...]
routine_body
解釋:
proc_params:指定存儲過程的參數列表
[IN|OUT|INOUT]param_name_type
in:輸入參數;out:輸出參數;inout:輸入輸出均可以
characteristics:
language sql
|[not]deterministic
|{ contains sql|no sql|reads sql data|modifies sql data}
|sql security{definer|invoker}
|comment 'string'
routine_body:變量的做用域
valid sql procedure statement
解釋:
language sql:說明routine_body部分是由sql組成的,當前系統支持的語言爲sql
[not]deterministic :指明存儲過程的執行結果的正確性,deterministic表示若是結果是正確的,
每次執行存儲過程時,有相同的輸出。not表示結果爲不正確,相同的輸入有可能輸出結果不一樣。
默認是deterministic
{ contains sql|no sql|reads sql data|modifies sql data}:指明程序使用sql的語句限制
contains sql:代表子程序包含sql語句,可是不包含讀寫數據的語句。
no sql:代表子程序中不包含sql語句
reads sql data:包含讀數據的語句
modifies sql data:包含寫數據的語句,默認狀況,系統會指定contains sql
sql security{definer|invoker}
definer表示只有定義者才能執行,代表誰有執行的權限.
invoker表示有權限的調用者均可以執行,默認狀況爲definer
comment 'string' 註釋信息。
routine_body是sql代碼的內容,begin ... end 表示sql代碼的開始和結束。
drop procedure if exists proc_test //刪除相同的存儲過程
delimiter $$
create procedure proc_test(IN v_id INT)
begin
select * from t_position_salary where id=v_id;
end
call proc_test(2);
變量的使用
做用域:begin...end
聲明、使用
一、變量定義
declare:聲明變量的關鍵字,須要記憶
變量的名字:var_name[var_name1,var_name2...]
data_type: [default value];變量的類型(int char varchar(10)沒有默認值)
default value 給咱們當前變量一個默認值
eg:默認值以前聲明瞭a,b類型int,a+b
二、給變量賦值
定義變量以後,爲變量賦值能夠改變變量的默認值。
mysql中使用關鍵字set給變量賦值
set var_name=exp[var_name=exp]....
eg:
declare var1,var2.... int;
set var1=10,var2=20;
set var3=var1+var2;
//單行操做語句
select ... into 爲一個或者多個變量賦值
存儲函數
建立一個存儲函數須要使用create function 語句。
基本語法:
create function func_name([func_paramer])
returns type(返回值類型)
[charactristics....]
rountine_body
create function 建立存儲過程的關鍵字
func_name 函數的名字
func_paramer 函數的參數,有三種類型(in|out|inout)
參數類型:parm type
returns type 表示函數返回的數據類型
charactristics相似存儲過程
存儲過程和函數的區別
1)通常來講,存儲過程實現的功能要複雜一點,而函數的實現的功能針對性比較強。
存儲過程,功能強大,能夠執行包括修改表等一系列數據庫操做;
用戶定義函數不能用於執行一組修改全局數據庫狀態的操做。
2)對於存儲過程來講能夠返回參數,如記錄集,而函數只能返回值或者表對象。
函數只能返回一個變量;而存儲過程能夠返回多個。存儲過程的參數能夠有IN,OUT,INOUT三種類型,
而函數只能有IN類,存儲過程聲明時不須要返回類型,而函數聲明時須要描述返回類型,
且函數體中必須包含一個有效的RETURN語句。
3)存儲過程,可使用非肯定函數,不容許在用戶定義函數主體中內置非肯定函數。
4)存儲過程通常是做爲一個獨立的部分來執行( EXECUTE 語句執行),
而函數能夠做爲查詢語句的一個部分來調用(SELECT調用),因爲函數能夠返回一個表對象,
所以它能夠在查詢語句中位於FROM關鍵字的後面。SQL語句中不可用存儲過程,而可使用函數。
定義條件和處理過程:8.12
特定條件特定處理,這些條件能夠聯繫到錯誤,以及子程序中的通常流程控制。
一、定義條件:是事先定義程序執行過程當中遇到的問題。
二、處理程序:定義了在遇到問題的時候應該採起什麼處理方式,
而且保證存儲過程或者函數在遇到警告或錯誤的時候能繼續執行。
能夠加強存儲過程的處理問題能力,避免程序異常中止運行。
語法:
一、定義條件(condition)
declare condition_name condition for[condition_type]
[condition_type]:
sqlstate[value]: sqlstate_value |mysql_error_code
condition_name 條件名稱
condition_type 條件類型
sqlstate_value 和mysql_error_code都是mysql本身的錯誤
state_value是長度5的字符串錯誤代碼
mysql_error_code數值類型的錯誤碼,長度是4位。
errror1142(42000),sqlstate_value:42000,mysql_error1142
定義條件指定須要特殊處理條件,它將一個名字和指定的錯誤條件關聯起來,
供處理程序使用。
eg:
對sqlstate類型的錯誤定義條件
declare condi_test condition for sqlstate '42000';
對mysql_error_code類型的錯誤定義條件
declare condi_test_error condition for sqlstate'1142';
二、處理程序(handler)
declare handler_type handler for condition_value[,...] sp_statement
handler_type:continue|exit|undo
condition_value:
sqlstate[value] sqlstate_value|condition_name|sqlwarning|
not found|sqlException|mysql_error_code
其中,handler_type 指明錯誤的處理方式,三種方式:
continue遇到錯誤不進行任何抵抗,繼續向下執行;
exit遇到錯誤立刻退出;
undo遇到錯誤撤回以前的全部操做,可是mysql不支持。
注意:一般狀況下,執行過程當中遇到錯誤應該馬上中止執行下面的程序,並撤回前面全部操做。
因爲mysql不支持撤回以前全部操做,那麼遇到錯誤的時候exit 。
若是可以精準的預判錯誤類型,而且能夠處理相關的錯誤,那麼能夠執行continue。
condition_value指明錯誤類型
sqlstate_value和mysql_error_code
condition_name declare定義的條件名稱
sqlwarning 表示以01開頭的sqlstate_value值
not found 表示以02開頭的sqlstate_value值
sqlException 表示沒有被sqlwarning和not found捕獲的sqlstate_value值。
sp_statement一些存儲過程或函數的執行語句
eg:
捕獲一下sqlstate_value
declare continue handler for sqlstate '42000' set @info='1';
捕獲sqlstate_value值,若是遇到sqlstate_value值爲42000,執行語句continue,
而且同時作了一個操做給info賦值,這個變量的賦值是爲了後面作存儲過程的處理準備。(回滾)
捕獲mysql_error_code
declare continue handler for sqlstate '1148' set @info='1';
捕獲mysql_error_code值,若是遇到的mysql_error_code值爲1148時,
執行continue語句,並給變量賦值。
先定義條件,而後處理
declare condi_handler condition for 1142;
declare condition handler fro condi_handler set @info=2;
定義條件,而後再調用條件,定義一個confi_handler 遇到1142錯誤時,
執行continue語句,並給變量賦值。
捕獲sqlwarning
declare exit handler for sqlwarning set set @info=3;
sqlwarning捕獲到以01開頭的sqlstate_value值,執行exit操做,而且給變量賦值
捕獲not found
declare exit handler for not found set @info=4;
使用not found,當not found捕獲到以02開頭的sqlstate_alue值時,
程序執行exit操做,而且給not found的變量賦值,賦值自己的意義在於後面存儲過程當中
執行遊標循環取值作not found準備。(遊標是一個結果集,以行爲單位)
捕獲sqlExcepion
declare exit handler for sqlException set @info=5;
當sqlException 捕獲到沒有被sqlwarning和not found捕獲到的sqlstate_value值,
執行exit操做,而且給變量賦值。
eg:
delimiter $$
create procedure condiHandler1()
begin
declare continue(exit) handler for sqlstate '23000' set @x=6;
set @x=1;
insert into t_class_copy(id) values(10);
set @x=2;
insert into t_class_copy(id) values(10);
set @x=3;
end
call condiHandler1();-- continue (exit)
select @x;
光標(oracle和sqlserver叫遊標)是一個結果集。
查詢語句能夠查詢出多條記錄,在存儲過程和函數中使用光標來逐條讀取查詢結果集中的記錄。
光標的使用包括:聲明光標,打開光標,使用光標和關閉光標。
光標必須聲明在處理程序(handler)以前,而且聲明在變量和條件(condition)以後
一、聲明光標
mysql中是經過使用declare關鍵字來聲明一個光標,具體語法:
declare cursor_name cursor for select_statement;
cursor_name 光標的名稱
sursor 光標的關鍵字
select_statement select語句的內容,返回的是一個建立光標的結果集。
eg:
declare cur_position cursor for
select * from t_position_salary;
把t_position_salary表的全部字段全部數據放到光標裏做爲數據集合。
declare cur_position cursor for
select posName,salary from t_position_salary;
把t_position_salary表中的posName、salary這兩個字段的數據拿出來放到光標裏
二、打開光標
mysql中使用關鍵字open來打開光標,語法格式:
open cursor_name;
cursor_name 是以前定義好的光標名字
eg:
open cur_position;
三、使用光標
mysql中使用關鍵字fetch來使用關鍵字,一條一條的迭代,基本格式:
fetch cursor_name into v_name[,v_name....];
cursor_name 光標名稱
v_name 將光標中select查詢出來的信息放入的對象。v_name聲明在光標以前。
eg:
fetch cur_position into v_posname,v_salary;
光標取出來的數據須要和變量實際意義一一對應。
四、關閉光標
mysql使用close關鍵字關閉光標,語句結構 :
close cursor_name;
eg:
close cur_position;
注意:一旦光標關閉就不能再被使用了。mysql的光標只能在存儲過程和函數中使用。
流程控制的使用
存儲過程和函數可使用流程控制來控制語句的執行。
mysql中使用if、case、loop、leave、iterate、repeat、while進行流程控制。
每一個流程中可能包含一個單獨的語句,或者是使用begin...end來構造複合語句,
構造能夠被嵌套。
一、if語句
if語句用來進行條件判斷,根據是否知足條件來執行不一樣的語句,語法格式:
if search_codition then statement_list
[else if search_condition then statement_list]...
[else statement_list]
end if;
search_condition 判斷語句;
statement_list不一樣條件的執行語句。
注意mysql自有的函數if();
eg:
if age>20 then set @count1=@count1+1;
else if age=20 then set @count2=@count2+1;
else set set @count3=@count3+1;
end if;
delimiter $$
create procedure proc_selDept(v_positionId int(10))
begin
declare v_deptId varchar(10);
declare cur_fetchDeptId cursor for
select deptId from t_position_salary
where id=v_positionId ;
end
delimiter $$
create procedure proc_selDept(v_positionId int(10))
begin
-- 聲明變量
declare v_deptId varchar(10);-- 聲明一個部門變量
declare v_notFound varchar(1) default '1';-- 聲明處理程序變量
-- 聲明定義條件
-- 聲明一個光標
declare cur_fetchDeptId cursor for
select deptId from t_position_salary
where id=v_positionId ;-- statement是爲了給光標賦值
-- 聲明處理程序
declare continue handler for not found
set v_notFound='0' ;-- 用來監聽光標取值爲null時
open cur_fetchDeptId; -- 打開光標
fetch cur_fetchDeptId into v_deptId; -- 使用光標,一次取一行數據
if -- 流程控制,做用是從處理程序裏取not found的閥值
v_notFound='0' then close cur_fetchDeptId;-- 處理程序
else
select * from t_position_salary where deptId=v_deptId;
close cur_fetchDeptId; -- 關閉光標
end if; -- 流程控制結束
end
call proc_selDept(4);
二、case 語句
case語句也是用來進行條件判斷,它實現了比if語句更爲複雜的條件判斷。
case語句一:
case case_value
when when_value then statement_list
[when when_value then statement_list]...
[else statement_list]
end case;
case_value判斷條件的變量,key(Map)
when_value 表示變量的取值,value
statement_list 表示不一樣的when_value值對應的執行語句
eg:
case v_salary -- 能夠把存儲過程或函數聲明的變量拿來使用
when '50000' then '項目經理'
end case;
case語句二:
case
when search_condition then statement_list
[when search_condition then statement_list]...
[else statement_list]
end case;
search_condition :判斷語句
statement_list :不一樣的條件語句執行的語句
注意:存儲過程或函數裏的case不能有else null字句和用end case 代替end;
三、loop語句
loop語句可使某些特定的語句(fetch)重複執行,實現簡單的循環。
loop自己是沒有中止循環語句的,只能遇到leave、iterate語句才能中止循環。
eg:
[begin_lable]loop
statement_list
end loop [end_lable];
begin_lable:循環開始標籤
end_lable:循環結束標籤
注意:begin_lable和end_lable必須同名,而且均可以省略。
statement_list 循環控制語句中的執行語句。
四、leave語句
主要用於跳出循環控制,語法格式:
leave lable;
lable表示循環的標籤
eg:
delimiter $$
create procedure proc_add()
begin
set @count=0;
add_num:loop
set @count= @count +1;
if @count=10 then
leave add_num;
end if;
end loop add_num;
end
五、iterate 語句
iterate語句也是用來跳出循環,iterate語句是用來跳出本次循環,而後進入下一次循環。
iterate語句能夠在loop、repeat、while語句中使用,語法格式:
iterate lable;
注意:iterate(跳出本次循環)和leave(跳出循環體)的區別。
六、repeat語句(先執行再判斷)
repeat語句是有條件控制的循環語句,當知足特定條件的時候就會跳出循環語句
語法格式:
[begin_lable]repeat
statement_list
until search_condition
end repeat [end_lable]
begin_lable:循環開始標籤(和loop同樣)
end_lable:循環結束標籤
statement_list循環執行語句
search_statement 表示結束循環的條件,知足該條件的循環結束。
eg:
set @count=0;
add_num:repeat
set @count=@count+1;
until @count=10
end repeat add_num;
七、while語句(先判斷再執行)
while語句也是有條件控制的循環語句,可是while語句和repeat是語句不同的
while語句是當條件知足是執行循環語句。
語句格式:
[begin_lable]while search_condition do
statement_list
end while[end_lable];
search_condition循環執行的條件,知足條件以後才能執行
statement_list循環執行語句
eg:
set @count=0;
while @count<10
do set @count+@count+1;
end while
事務 8.15
mysql事務主要是用來處理操做量大,複雜度高的數據。
如:insert、update、delete等
一、在mysql中只有使用了innodb數據庫引擎的數據庫和表才支持事務。
二、事務處理能夠用來維護數據庫的完整性,保證成批的sql語句
要麼所有執行要不就全都不執行(回滾)。
三、事務是用來管理insert、update、delete語句。
事務必須知足4個條件:原子性,穩定性,隔離性,可靠性。
一、原子性:一組事務,要麼成功要麼撤回。
二、穩定性:有非法數據(外鍵約束),事務撤回。
三、隔離性:事務獨立運行。一個事務處理後的結果若是影響了其餘事務,
那麼其餘事務撤回。事務100%隔離,須要下降速度。
四、可靠性:軟、硬件崩潰後innodb數據表驅動會利用日誌文件(binlog)
重構修改可靠性和高速不可兼得,innodb_flush_log_at_trx_commit選項
決定何時把事務保存到日誌裏。
在mysql裏控制檯採用事務來操做
一、開啓一個事務:start transaction(begin)
二、保存點(可選):
save point proint_name (折回點)
rollback to savepoint proint_name,回滾到proint_name,
意味着在當前保存點之前的操做所有commit。
三、操做(對數據處理的一個過程):
四、可回滾可提交,沒問題就提交(commit)有問題就回滾(rollback);
事務的提交:自動提交、手動提交。(mysql默認自動提交)
set autocommit=0;禁止自動提交 set autocommit=1;開啓自動提交。
事務的鎖定模式
系統默認:不須要等待某事務結束,可直接查詢到結果,可是不能再進行修改、刪除。
優勢:不須要等待某事務結束,可直接查詢結果。
缺點:查詢到的結果有可能過時。
鎖的類型有三種:
一、共享(S)鎖:多個事務可封鎖一個共享頁;任何事務都不能修改該頁(只讀操做,如select);
一般是該頁被讀取完畢,S鎖當即被釋放。
二、排它(X)鎖:僅容許一個事務封鎖此頁;其餘任何事務必須等到X鎖被釋放才能對該頁進行訪問;
X鎖一直到事務結束才能被釋放。
三、更新(U)鎖:用來預約要對此頁施加X鎖,它容許其餘事務讀,但不容許再施加U鎖或X鎖;
當被讀取的頁將要被更新時,則升級爲X鎖;U鎖一直到事務結束時才能被釋放。
MySQL有三種鎖的級別:頁級、表級、行級。
MyISAM和MEMORY存儲引擎採用的是表級鎖(table-level locking);
BDB存儲引擎採用的是頁面鎖(page-levellocking),但也支持表級鎖;
InnoDB存儲引擎既支持行級鎖(row-level locking),也支持表級鎖,但默認狀況下是採用行級鎖。
MySQL這3種鎖的特性可大體概括以下:
表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的機率最高,併發度最低。
行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的機率最低,併發度也最高。
頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度通常。
僅從鎖的角度來講:
表級鎖更適合於以查詢爲主,只有少許按索引條件更新數據的應用,如Web應用
行級鎖則更適合於有大量按索引條件併發更新少許不一樣數據,同時又有併發查詢的應用,
如一些在線事務處理系統。
因爲MySQL認爲寫請求通常比讀請求要重要,因此若是有讀寫請求同時進行的話,MYSQL將會優先執行寫操做。這樣MyISAM表在進行大量的更新操做時(特別是更新的字段中存在索引的狀況下),會形成查詢操做很難得到讀鎖,從而致使查詢阻塞。