1. 程式人生 > >mysql知識點

mysql知識點

標簽 相等 快速 用戶 維護 else if tid 日誌 給定


mysql:默認4G內存,能存儲800萬T數據,5000萬行記錄。
數據庫:處理業務
數據的存儲
學校->院系->班級->班
關系型數據庫:體現業務
表中的字段:管理各自職能範圍內的業務。(數據)

一個關系數據庫是一種軟件:
1.能夠實現具有表、列和索引的數據庫
2.保證了各種表的行之間是引用完整性
3.自動更新索引,索引放在字段裏。
4.解釋sql查詢和聯合各表信息

數據庫的幾個定義
1.數據庫:是表的集合,具有相關數據。
2.表:表是用數據矩陣表現的數據展現形式
在一個數據庫中我們也可以把它看做是excel的展現

3.列:一列包含一個數據類型相同的數據集合。(會出現數據類型這個概念)
4.行:一組相關的數據,表示當前表所有列的一行集合。
5.冗余:存儲數據兩次,冗余能使系統更快。
6.主鍵:主鍵是唯一的,不能在一個表中出現兩次。
使用主鍵可以快速的查找到某一行

7.外鍵:兩個表之間的聯接字段
8.復合鍵:是由多個列組成的,一個鍵無法滿足唯一標識。
9.索引:索引是對數據庫表中一列或多列的值進行排序的一種結構,
使用索引可快速訪問數據庫表中的特定信息。就像一本書裏的目錄


show create table t_idcard;//顯示建表語句
desc t_idcard;//顯示表結構

SQL語言
1、sql語句是用於訪問和處理數據的標準計算機語言
2、能夠對數據進行:select delete insert update
insert into table(字段) values(字段值)
delete from table where ..
update table set ... where ...
select .. from .. where .. -- 返回的是一個結果集

3、擴展功能:表、視圖、存儲過程、存儲函數。
4、在數據庫裏有許多表,但是表的名字在當前數據庫是唯一的,表裏包含數據記錄。
1》表的命名規則:t(顯示當前表的實在意義)_tableName 、game(項目名)_user
加標簽用於區分表,表名的表示意義比較多的時候可以加多個下滑線。

5、字符的引號和java中一樣,都需要用英文的單引號,不同的是字符串也是單引號。
(mysql中只有單引號,沒有雙引號)。sql本身對大小寫不敏感,但表中的數據對大小寫
超級敏感(mysql默認對大小不區分,如果要區分,在字段前面加binary)。

6、mysql要求每條語句末尾都以分號結尾,這是一種標準寫法。
7、alert(修改數據庫表)
drop (drop表會把整表數據和表結構全部刪除)
create index (創建索引) 、drop index(刪除索引)

8、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》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) 非壓縮的浮點數,不能是符號數,沒有默認值。

二、日期和時間類型
mysql時間日期類型包括:
1、date (mysql取當前系統時間用new()方法)
以YYYY-MM-DD格式的日期,在公元1000-01-01到9999-12-31之間。
例如2016年8月5號在mysql裏存儲2016-8-5。

2、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

3、timestamp 1970年1月1號午夜之間的時間戳,到2037年的某個時間。
不需要連接符(-,:)。如(yyyymmddhhmmss)19731230153001

4、time 存儲的時間格式:hh:mm:ss

5、year(m)以2位和4位數字格式來存儲年份,長度如果指定2則定義方式為year(2)。
1970到2069(70-69)。如果長度指定為4位則定義的方式為year(4)1901-2155,
如果不給長度則默認長度為4。

三、字符串類型
雖然數字和日期類型存儲的樣式比較豐富,但是存儲的大多數數據都可以是字符串樹。

1、char(M) 固定長度的字符串,是以長度為1到255個字符長度(char(5))。
存儲右空格填充到指定長度,可以不指定長度,有默認是1。

2、varchar 可變長度的字符串,長度為1-255(高版本的超過了255)
創建varchar類型的字段必須定義長度(varchar(10))沒有默認長度。

3、blod或者text字段最長65535個字符,blod是“二進制大對象”,用來存儲大的
二進制數據,如圖像或者其他類型的文件。定義text文本字段持有大量的數據。
blod和text的區別主要是在排序和比較上,blod大小寫比較敏感而text不區分
大小寫。blod和text在定義時不需要指定長度。犀牛服務器

4、bold和text blod或者text字段用255的最大長度,不指定長度。
5、mediumblod或mediumtext 長度16777215定義的時候不需要指定長度。
6、longblod或者longtext 長度4294967295(4G-2)不指定長度
7、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:
1、is null 如果列的值為null(不是""空字符串)返回true
2、is not null 如果列的值不為null,返回true。
3、<=> 運算符的比較,(不同於 =)即使兩個空值都返回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特性:
1、原子性:確保了工作單位中的所有操作都成功,否則事務終止,
在失敗時會回滾到事務操作以前的狀態。
2、一致性:可確保數據庫正確的更改狀態,在一個成功事務的提交前提下。
3、隔離性:使事務相互獨立的進行操作。
4、持久性:確保了提交事務的結果或系統故障的情況下任然存在作用。

提交和回滾
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命令來添加和刪除索引
1、添加主鍵,這意味著索引值必須是唯一的,並且不能為空。
2、創建一個索引量的值必須唯一
3、增加普通索引,任何值的出現是多次的。
4、創建一個用於文本搜索目的的特殊索引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
1、創建存儲過程
語法:
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
聲明、使用
1、變量定義
declare:聲明變量的關鍵字,需要記憶
變量的名字:var_name[var_name1,var_name2...]
data_type: [default value];變量的類型(int char varchar(10)沒有默認值)
default value 給我們當前變量一個默認值
eg:默認值之前聲明了a,b類型int,a+b

2、給變量賦值
定義變量之後,為變量賦值可以改變變量的默認值。
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
特定條件特定處理,這些條件可以聯系到錯誤,以及子程序中的一般流程控制。
1、定義條件:是事先定義程序執行過程中遇到的問題。
2、處理程序:定義了在遇到問題的時候應該采取什麽處理方式,
並且保證存儲過程或者函數在遇到警告或錯誤的時候能繼續執行。
可以增強存儲過程的處理問題能力,避免程序異常停止運行。

語法:
1、定義條件(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‘;

2、處理程序(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)之後
1、聲明光標
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這兩個字段的數據拿出來放到光標裏

2、打開光標
mysql中使用關鍵字open來打開光標,語法格式:
open cursor_name;
cursor_name 是之前定義好的光標名字
eg:
open cur_position;

3、使用光標
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;
光標取出來的數據需要和變量實際意義一一對應。

4、關閉光標
mysql使用close關鍵字關閉光標,語句結構 :
close cursor_name;
eg:
close cur_position;
註意:一旦光標關閉就不能再被使用了。mysql的光標只能在存儲過程和函數中使用。


流程控制的使用
存儲過程和函數可以使用流程控制來控制語句的執行。
mysql中使用if、case、loop、leave、iterate、repeat、while進行流程控制。
每個流程中可能包含一個單獨的語句,或者是使用begin...end來構造復合語句,
構造可以被嵌套。

1、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 @[email protected]+1;
else if age=20 then set @[email protected]+1;
else set set @[email protected]+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);

2、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;

3、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 循環控制語句中的執行語句。


4、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

5、iterate 語句
iterate語句也是用來跳出循環,iterate語句是用來跳出本次循環,然後進入下一次循環。
iterate語句可以在loop、repeat、while語句中使用,語法格式:
iterate lable;

註意:iterate(跳出本次循環)和leave(跳出循環體)的區別。

6、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 @[email protected]+1;
until @count=10
end repeat add_num;

7、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 @[email protected]+1;
end while


事務 8.15
mysql事務主要是用來處理操作量大,復雜度高的數據。
如:insert、update、delete等
1、在mysql中只有使用了innodb數據庫引擎的數據庫和表才支持事務。
2、事務處理可以用來維護數據庫的完整性,保證成批的sql語句
要麽全部執行要不就全都不執行(回滾)。
3、事務是用來管理insert、update、delete語句。

事務必須滿足4個條件:原子性,穩定性,隔離性,可靠性。
1、原子性:一組事務,要麽成功要麽撤回。
2、穩定性:有非法數據(外鍵約束),事務撤回。
3、隔離性:事務獨立運行。一個事務處理後的結果如果影響了其他事務,
那麽其他事務撤回。事務100%隔離,需要降低速度。
4、可靠性:軟、硬件崩潰後innodb數據表驅動會利用日誌文件(binlog)
重構修改可靠性和高速不可兼得,innodb_flush_log_at_trx_commit選項
決定什麽時候把事務保存到日誌裏。

在mysql裏控制臺采用事務來操作
1、開啟一個事務:start transaction(begin)
2、保存點(可選):
save point proint_name (折回點)
rollback to savepoint proint_name,回滾到proint_name,
意味著在當前保存點以前的操作全部commit。
3、操作(對數據處理的一個過程):
4、可回滾可提交,沒問題就提交(commit)有問題就回滾(rollback);

事務的提交:自動提交、手動提交。(mysql默認自動提交)
set autocommit=0;禁止自動提交 set autocommit=1;開啟自動提交。

事務的鎖定模式
系統默認:不需要等待某事務結束,可直接查詢到結果,但是不能再進行修改、刪除。
優點:不需要等待某事務結束,可直接查詢結果。
缺點:查詢到的結果有可能過期。

鎖的類型有三種:
1、共享(S)鎖:多個事務可封鎖一個共享頁;任何事務都不能修改該頁(只讀操作,如select);
通常是該頁被讀取完畢,S鎖立即被釋放。

2、排它(X)鎖:僅允許一個事務封鎖此頁;其他任何事務必須等到X鎖被釋放才能對該頁進行訪問;
X鎖一直到事務結束才能被釋放。

3、更新(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表在進行大量的更新操作時
(特別是更新的字段中存在索引的情況下),會造成查詢操作很難獲得讀鎖,從而導致查詢阻塞。

mysql知識點