MySQL高效編程--學習筆記

第1部分 MySQL基礎篇

1、對於企業而言,選擇MySQL數據庫的兩大原因:1)MySQL是開源關係型數據庫產品,使用普及率高;2)性能出色,運行速度塊。MySQL有免費和收費兩種類型的產品。

2、mysql登錄:cd 打開mysql的bin目錄,執行“mysql -u root -p”回車,然後要求輸入密碼Enter password,正確輸入密碼後,回車,即可登錄成功!


3、常用數據庫查詢命令:

show databases;    查看數據庫服務器上的全部數據庫

create database test; 創建一個名稱爲test的數據庫

use test;使用test數據庫

show tables;查看當前數據庫中所有表

創建表:

create table 表名

屬性名數據類型列選項,

……

其中,列選項可以爲AUTO_INCREMENT(自增),DEFAULT '默認值',INDEX(定義爲索引),[NOT]NULL(允許/禁止NULL),PRIMARY KEY(定義爲主鍵),UNIQUE(定義爲唯一性),CHECK(定義可以輸入的值的範圍/選項)。

alter table 表名 modify 列名 數據類型;修改表中列的定義

alter table 表名 add 列名 數據類型;追加新列

alter table 表名 drop 列名;刪除列

DESC 表名顯示錶的結構 

DROP TABLE 表名; 刪除表

Insert into 表名(列名1,列名2,...) values (數據1,數據2,...); 向表裏插入數據

Select 列名1,列名2,... from 表名[條件表達式等];  顯示錶中的數據

Update 表名 set 列名1=值1,列名1=值1,....  where 條件表達式; 更新標誌的記錄

Delete from 表名 where 條件表達式; 刪除表中的記錄

4、數據檢索

①推薦明確指定列名:使用[*]來無條件地獲得所有列數據,第一,獲取到不需要的列就會浪費很多內存;第二,獲得的數據會按表定義的列的順序,如果修改了表列的順序,對應的程序也必須進行修改。

②條件檢索:必須使用WHERE語句。比較運算符有:=、<、>、<=、>=、<>(不等於)、IS[NOT] NULL(是否爲空)、[NOT]LIKE(指定目標一致)、[NOT] BETWEEN(指定範圍)、[NOT] IN(在指定候補值內)。

③模糊檢索:select name from customer where name like '李%';

④ 多條件組合查詢:使用and(並)、or(或)連接。理論運算符的優先順序:NOT->AND->OR。

⑤結果排序:使用order by進行數據排序,可以指定ASC(升序)或DESC(降序),默認是ASC。

如:select name,age from customer where age>21 order by age DESC;

⑥取得指定數間的記錄:LIMIT;

limit 2:從起始位置開始取出兩件;

limit 1,2:從1開始取出兩件。

⑦數據分組:GROUP BY,通常GROUP BY語句與統計函數一起使用。主要統計函數:AVG(列名)平均值、COUNT(列名)件數、MAX(列名)最大值、MIN(列名)最小值、SUM(列名)合計值。

⑧列的別名:select sex,COUNT(mid) as cnt from customer group by sex;其中as可以省略。

5、運算符與數據庫函數

①運算符:+、-、*、/、DIV(除法返回結果的整數部分)、%(求餘)、AND、OR。

②部分數據庫函數

LENGTH函數:返回字符串的字節數

FLOOR/GEILING/TRUNCATE函數:用於小數四捨五入處理

DATE_ADD函數:對日期date進行指定值的加算處理

NOW()當前時間、CURDATE()當前日期、CURTIME()當前時刻、EXTRACT(YEAR_MONTH '2013-11-20 21:02:00')從給定的日期/時刻中取得任意元素(如年、月等)

CASE函數:條件判斷

select name 
		case sex
			when 0 then '男'
			when 1 then '女'
			else 'OTH'
                        end as sex
	from customer;


6、多表連接查詢

①內鏈接:返回結果集合中僅是符合查詢條件和連接條件的記錄;

select m.name,o.oid
	from member m
	inner join ordercord o
	on m.id=o.mid
	(where/order by等語句)

②外連接:返回的查詢結果集中不僅是符合連接條件的行,而且還包括左表(左外連接)或右表(右外連接)中所有數據行;

左外連接:

select 列名1 from 表1
	   LEFT OUTER JOIN 表2
	   ON 表1.外鍵=表2.主鍵[WHERE/ORDER BY語句等]

右外連接:

	select 列名1 from 表1
	     RIGHT OUTER JOIN 表2
	     ON 表1.外鍵=表2.主鍵[WHERE/ORDER BY語句等]

3個或3個以上表間連接,從內往外一層層的連接。
③子查詢:先返回子查詢的結果集,再返回主查詢結果集。



第2部分 MySQL高級應用篇

7、MySQL的功能可以分爲兩部分:外層部分主要完成與客戶端的連接以及事前調查SQL語句的內容的功能;而內層部分就是所謂的存儲引擎部分,它負責接受外層的數據操作指示,完成實際的數據輸入輸出以及文件操作工作。MySQL提供的存儲引擎有:MyISAM(默認的高速引擎,不支持事務處理)、InnoDB(支持行鎖定以及事務處理,比MyISAM的處理速度稍慢)、ISAM等。

8、查看錶中使用的引擎:show create table 表名 [\G];

     修改表使用的引擎:alter table 表名 engine=新引擎;

     其中,\G在MySQL監視框中顯示出信息有序。

====>>事務

9、事務是指作爲單個業務邏輯工作單元執行的一系列操作,要麼全部成功,要麼全部失敗。MySQL提供的3個重要事務處理命令:BEGIN(聲明事務處理開始)、COMMIT(提交整個事務)、ROLLBACK(回滾到事務開始的狀態)。

10、MySQL默認自動提交事務。當然也可以通過SET AUTOCOMMIT=0;將自動提交功能置爲OFF;也可以通過SET AUTOCOMMIT=1;將自動提交功能置爲ON。

11、部分回滾:

       定義保存點:savepoint 保存點名;

       回滾到指定的保存點:rollback to savepoint 保存點名;

12、事務處理的利用範圍,以下幾條SQL命令,執行後將被自動提交,是在事務處理可以利用的範圍之外:DROP DATABASE;DROP TABLE;DROP;ALTER TABLE;

13、多用戶同時操作同一個數據庫時,需要對其進行併發控制,MySQL通過鎖來實現。鎖分爲共享鎖排他鎖,共享鎖是當用戶參照數據時,將對象數據變爲只讀形式的鎖定;排他鎖是使用INSERT/UPDATE/DELETE命令對數據進行更新時,其他進程(或事務)一律不能對讀取該數據。

14、鎖定對象的大小,通常被稱爲鎖定的粒度。支持的粒度隨着數據庫不同而有所差異,一般有3種鎖定粒度:記錄(行)、表、數據庫

15、鎖定的粒度越小,運行性越高,但並不是越小的粒度越好,鎖定的數目越多,消耗的服務器資源也越多。數據庫中行單位粒度的鎖定大量發生時,數據庫有將這些鎖定的粒度自動向上提升的機制,通常稱爲鎖定提升。MySQL只支持行/表粒度,不支持鎖定提升功能。

16、事務處理的隔離級別:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZEABLE。


17、事務處理的機制簡單的說就是留下更新日誌,數據庫會根據這些日誌信息,在必要時將就數據取回,或在發生錯誤是將數據恢復到原先的狀態。與事務處理相關的日誌可以分爲兩個類型:UNDO和REDO。


=====>>索引

18、索引就是表中所有記錄的搜索引導,索引的經過排序的。有索引後,先查找索引再根據索引查找相應的記錄。

19、大多數數據庫中用B樹(平衡樹)的結果來保存索引的。

20、創建索引:create [unique] index 索引名 on 表名(列名,……);

查看錶中所有的索引信息:show index from 表名 [\G];

刪除索引:drop index 索引名 on 表名;

確認索引的使用情況(優劣):explain 調查對象 select 語句;

:explain select * from employee where name='wang' \G;

複合索引:create index idx_employee_name on employee(name,sex);

唯一索引:create unique index  idx_employee_name on employee(name);

索引名建議[idx_]的形式開頭。

21、不適合使用索引的場合:

①模糊查詢要求後方一致或部分一致檢索;如:select * from employee where name like '%w%'或'%w';是不適合的。

②使用了IS NOT NULL、<>比較運算符的場合;如:select * from employee where name is not null;是不適合的。

③對列使用了運算/函數的場合;

④複合索引的第一列沒被包含在where條件語句中的場合。如:select * from employee where name='wang' or age='1';是不適合的。


======>>視圖

22、視圖是僞表,視圖本事不包含如何數據的,將多個物理表的數據通過視圖動態地組織在一起,用戶可以像使用普通物理表那樣使用它。

23、視圖具有以下特性:①可以公開表中特定的行和列;②簡化複雜的SQL查詢;③可以限制可插入/更新的值範圍。

24、創建視圖:create view 視圖名(列名,...) as select 語句 [with check point];

刪除視圖:drop view 視圖名;

查看視圖所有列信息:show fields from 視圖名;

  視圖名建議[v_]的形式開頭。

25、不能進行插入/更新/刪除操作的場合:

①視圖列中含有統計函數

②視圖定義使用了GROUP BY/HAVING語句,DISTINCT語句,UNION語句的情況

注:HAVING是對group by設置查詢條件;distinct是要求查詢結果沒有重複項。

③視圖定義時使用了子查詢

④跨越多個表進行數據的變更操作

26、創建視圖時使用[with check option]命令,將不能插入或更新不符合視圖的檢索條件的數據。

如:

create view v_product300up
	as 
	select * from product where price >=300
	with check option;

此時,變更操作要求price大於或等於300才能進行,否則就會出現[CHECK OPTION failed……]的錯誤信息。


=====>>存儲過程

27、存儲過程是數據庫中保存的一系列SQL命令的集合,這些SQL命令通常並非簡單的組合在一起,還可以使用各種條件判斷、循環控制等,來實現簡單的SQL命令不能實現的負責功能。

28、使用存儲過程可以有這些好處:

①提高執行性能

②可減輕網絡負擔

③可防止對錶的直接訪問,提高安全性

④可將數據庫的處理黑匣子化

29、定義存儲過程:

ceate procedure 存儲過程名(參數的種類1 參數1 參數類型1 [,參數的種類2,參數2,參數類型2…])

begin

處理內容

end

注:存儲過程的參數可以分爲輸入參數(接受調用方的數據),輸出參數(向調用方返回處理結果)。參數的種類可以是IN、OUT、INOUT其中之一。存儲過程名前加上[sp_]的開頭。

如:

delimiter //
create procedure sp_search_customer(IN p_name varchar(20) )
	begin
	if p_name is null or p_name='' then
		select * from customer;
	else
		select * from customer where name like p_name;
	end if;
	end
delimiter ;

注:上面delimiter命令改變分隔符爲//,因爲在存儲過中使用到";"。

30、存儲過程中可使用的控制語句:

①if...elseif...else...end if

②case when 值1 then 執行命令 when 值2 then 執行命令 else 執行名 end case

③循環控制(後置判斷):repeat 直至條件表達式爲true時才執行的命令   until 條件表達式 end repeat

④循環控制(前置判斷):while 條件表達式 do 系列命令 end while

31、查看存儲過程是否存在:show procedure status [\G];

查看存儲過程信息:show create procedure 存儲過程名;

刪除存儲過程:drop procedure 存儲過程名;

執行存儲過程名:call 存儲過程名(參數,……);

32、定義存儲過程可以聲明局部變量:declare 變量名 數據類型[初始值];

賦值給變量:set 變量名=值;


=====>>存儲函數

33、存儲函數是保存在數據庫中的函數(Function)。所謂函數就是按照事先決定的規則進行處理,然後將結果返回的單功能機制。

34、定義存儲函數:

create function 函數名(

參數1 數據類型1

[,數據2 數據類型2...]

)returns 返回值類型

begin

任意系列SQL語句

return 返回值;

end

注:①參數只有輸入型IN

②向調用返回結果值

③存儲函數給定[fn_]的前綴

35、查看全部已創建的存儲函數:show function status;

查看存儲函數的信息:show create function 函數名 [\G];

存儲函數調用:select 函數名(參數);

如:

delimiter //
create function fn_factorial(
	f_num int
	)returns int
	begin
		declare f_result int default 1;--定義局部變量並初始化爲1
		while f_num>1 do
			set f_result=f_result*f_num;
			set f_num=f_num-1;
		end while;
		retrun f_result;		
delimiter ;

調用存儲函數:

select fn_factorial(5), fn_factorial(0);

======>>觸發器

36、觸發器是在操作數據庫時,執行一個動作,而觸發了另一個動作。如刪除表1的一條記錄,在表2中插入一條日誌記錄。

37、創建觸發器:

create trigger 觸發器名 發生時刻 事件名

on 表名 for each row

begin

任意系列SQL語句

end

說明:①觸發器不是直接與運行的,而是針對具體表的操作事時被調用的;

②決定觸發器運行時刻具體是指發生在insert、update、delete等操作的前還是後,用before或after表示。

③for each row 表示以行爲單位執行的,爲固定值。

確認已創建完成的觸發器列表和觸發器的信息:show trigger [\G];

刪除觸發器:drop trigger 觸發器名;

delimiter //
create trigger trg_customer_history after delete(
	on customer for each row
	begin
		insert into customer_history(mid,name,birth,sex,updated)
		values(OLD.mid,OLD.name,OLD.birth,OLD.sex,NOW());
		end;		
delimiter ;

=====>>遊標

38、遊標就是對select語句取出的結果進行一件一件處理的功能。遊標可以將多個查詢記錄進行一件一件的單獨的處理。

delimiter //
create proceduce sp_cursor(
	OUT p_result TEXT
	)
	begin
	--定義標誌變量flag(判斷是否所有記錄都被取出)
	declare flag bit default 0;
	--定義存儲當前行的部署名的變量tmp
	declare tmp varchar(20);
	--定義遊標取出遊標中所有記錄時的處理
	declare cur cursor for select distinct depart from employee;
	--定義取出遊標中所有記錄是的處理
	declare continue handler for not found  set flag=1;
	--打開遊標
	open cur;
	--從遊標中一行行取出數據
	while flag!=1 do
		fetch cur into tmp;--將當前行中的內容保存到本地變量中
		if flag!=1 then
		--將變量tmp以逗號分隔的字符串的形式保存到輸出參數p_result中
		set p_result=concat_ws(',',p_result);
		end if
	end while; --標誌變量爲1後結束循環
	--關閉遊標
	colse cur;
	end		
delimiter ;

調用遊標:call sp_cursor(@p_result);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章