運算符與函數
字符函數
字符函數<br>
1.CONCAT() ,字符連接<br>
SELECT CONCAT('a','-','b'); 結果為:a-b<br>
2.CONCAT_WS(), 使用指定的分隔符進行字符連接<br>
SELECT CONCAT_WS('|','A','B','C'); 結果為: A|B|C<br>
3.FORMAT() 數字格式化
SELECT FORMAT(12560.7,2); 結果:12,560.70
SELECT FORMAT(12560.78,1); 結果:12,560.8
4.LOWER() 轉換成小寫字母
5.UPPER() 轉換成大寫字母
6.LEFT() 獲取左側字符
SELECT LEFT('mysql',2); 結果:my
7.RIGHT() 獲取右側字符
8.LTRIM() 刪除前導空格(=LEFT TRIM())
9.RTRIM() 刪除后續空格
10.TRIM()刪除前后兩邊的空格,還可以刪除指定的前導和后續的字符,不能刪除中間的字符
SELECT TRIM(LEADING'?','??MYSQL????'); 結果:MYSQL????
SELECT TRIM(TRAILING'?','??MYSQL????'); 結果:??MYSQL
SELECT TRIM(BOTH'?','??MYSQL???'); 結果:MYSQL
11.REPLACE() 替換字符
SELECT REPLACE('??MYSQL???','?','-'); 結果:--MYSQL---
12. SUBSTRING(string,offset,length) 截取字符串
SELECT SUBSTRING('MYSQL',2,3); 結果:SQL
13.[NOT]LIKE 模糊匹配
(%):代表任意個字符,0個或多個
(_):代表任意一個字符,只有一個
SELECT name FROM test WHERE name LIKE'%O%'; 結果:輸入name 中帶‘O’的name
SELECT name FROM test WHERE name LIKE'%1%%' ESCAPE'1'; 找到中間帶% 的匹配name
數值運算符和函數
CEIL()--進一取正
FLOOR()--舍一取正
DIV--整數除法
MOD --取余
POWER() --冪運算
ROUND() --取余(四舍五入)
TRUNCATE() --截斷(不四舍五入)
SELECT CEIL(3.01) ==>4 /*有n.xx 都是n+1 進一取整 向上取整
SELECT FLOOR(3.99) ==>3 /*取n.xx 都是n 舍一取整 向下取整
SELECT 3 DIV 4 ==> 0 /*整數除法
SELECT 3/4 ==>0.75 /*除法
SELECT 21 MOD 2 ==>1 /*取余數(取模)整數,小數都可以
SELECT 21 % 2 ==>1 /*取余數(取模)整數,小數都可以
SELECT POWER(3,4) ==>81 /*3的4次方 冪運算
SELECT ROUND(3.1415926,4) ==>3.142 /*四舍五入
SELECT TRUNCATE(123.89,1) ==>123.8 /*截取小數點后的位置
SELECT TRUNCATE(123.89,0) ==>123 /*截取小數點后的位置,0位為整數部分
SELECT TRUNCATE(123.89,-1) ==>120 /*截取-1,從個位起去掉后面的數值替換為0
比較運算符和函數
比較運算符和函數:(給出的都是閉合的區間)
(1)想在first_name這個字段中查找哪個字段值為NULL,可以用IS [NOT] NULL,這比較運算符,如:SELECT * FROM test WHERE first_name IS NULL;
(2)[NOT] IN 的具體用法,SELECT 16 IN(1,2,16,68),返回的是true就是1.
(3)[NOT] BETWEEN....AND....具體用法:SELECT 6 BETWEEN 0 AND 29,返回的是true也就是1。也可以是字符串。
ELECT 15 BETWEEND 1 AND 20 ==> 1 /*15 在1到20之間 ,返回值是1
SELECT 15 NOT BETWEEND 1 AND 20 ==>0 /* 15在1到20之間,條件不成立 返回值是0
SELECT 10 IN(5,10,15) ==> 1 /*值是否在給定的數值中,如果在返回1,不在返回0 條件成立為1不成立為0
SELECT 10 NOT(5,10,15) ==> 0 /*數值是否不在給定的數值中,如果不在返回1,在返回0 條件成立為1不成立為0
SELECT NULL IS NULL ==>1 /* 空是空 條件成立返回1,不成立返回0
SELECT '' IS NULL ==> 0 /* 除了NULL空其它都是非空 返回都是1
SELECT * FROM ABC WHERE ID IS NOT NULL;
日期時間函數:
NOW():顯示當前日期和時間:
SELECT NOW();
CURDATE():顯示當前日期:
SELECT CURDATE();
CURTIME():顯示當前時間:
SELECT CURTIME();
DATE_ADD():指定日期加上一段日期:
SELECT DATE_ADD('2016-6-6',INTERVAL 1 YEAR);//后面的單位可以是week,year,month等
DATEDIFF():計算兩個日期相差的時間:
SELECT DATEDIFF('2016-6-6','2015-6-6');
DATE_FORMAT():將日期以指定格式顯示:
SELECT DATE_FORMAT('2016-6-6','%m/%d/%Y');
函數信息
(1)CONNECTION_ID(); // 連接ID
mysql> SELECT CONNECTION_ID();
(2)SELECT DATABASE(); // 當前數據庫
(3)LAST_INSERT_ID(); // 最后句插入記錄的 ID 號,如果是一次insert中插入的是多條記錄,得到的是多條中的第一條(而不是最后一條!)
(4)VERSION(); // 版本的信息
(5)USER(); // 當前用戶
SELECT USER();
聚合函數
聚合函數只有一個返回值
AVG() - 平均值
SELECT ROUND(AVG(goods_price),2) AS avg_price FROM tdb_goods;
COUNT() - 計數
SELECT COUNT(goods_id) as counts FROM tdb_goods;
MAX() - 最大值
SELECT MAX(goods_price) as counts FROM tdb_goods;
MIN() - 最小值
SUM() - 求和
SELECT SUM(goods_price) as counts FROM tdb_goods;
加密函數
1.MD5():信息摘要算法,為以后的Web頁面做准備,盡量使用MD5()
舉例 SELECT MD5('admin');
2.PASSWORD():密碼算法,通過PASSWORD()修改(重要用於MYSQL數據庫)當前用戶和其他用戶的密碼,修改客戶端自己的密碼
舉例 SET PASSWORD=PASSWORD(‘dimitar’); 把密碼修改成dimitar。
總結
MySQL內置函數分類:
一、字符函數
(1)CONCAT()//字符連接
(2)CONCAT_WS()//使用指定的分隔符進行字符連接
(3)FORMAT()//數字格式化
(4)LOWER()//轉化小寫
(5)UPPER()//轉換大寫
(6)LEFT()//獲取左側字符
(7)RIGHT()//獲取右側字符
(8)LENGTH()//取得字符串長度
(9)LTRIM(),RTRIM(),TRIM()//刪除前導、后續空格或者指定字符
(10)REPLACE()//替換
(11)SUBSTRING()//字符串截取
(12)[NOT] LIKE//模式匹配——百分號%代表任意個字符;下划線_代表任意一個字符
二、數值函數
(1)CEIL()//進一取整
(2)FLOOR()//舍一取整
(3)DIV//整數除法
(4)MOD//取余數,與%一樣
(5)POWER()//冪運算
(6)ROUND()//四舍五入
(7)TRUNCATE()//截斷
三、比較函數
(1)[NOT] BETWEEN...AND... //[不]范圍之內
(2)NOT IN() //[不]在列出值范圍內
(3)IS [NOT] NULL //[不]為空
四、日期時間函數
(1)SELECT NOW(); // 當前日期時間
(2)SELECT CURDATE(); // 當前日期
(3)SELECT CURTIME(); // 當前時間
(4)SELECT DATE_ADD();//日期的變化
(5)DATEDIFF(); // 日期的差值
(6)DATE_FORMAT(); // 日期格式化
五、信息函數
(1)SELECT CONNECTION_ID() //連接ID
(2)SELECT DATABASE() //當前數據庫
(3)SELECT LAST_INSERT_ID() //最后插入記錄的ID
(4)SELECT USER() //當前用戶
(5)SELECT VERSION() //版本信息
六、聚合函數
(1)AVG()//平均值
(2)COUNT()//計數
(3)MAX()//最大值
(4)MIN()//最小值
(5)SUM()//求和
七、加密函數
(1)MD5();//信息摘要算法
(2)PASSWORD();//加密算法,主要用途修改當前用戶密碼
--------------------
自定義函數
自定義函數
1.自定義函數
用戶自定義函數(user-defined function, UDF)是一種對MySQL擴展的途徑, 其用法與內置函數相同。
自定義函數的兩個必要條件:
a.參數
b.返回值
函數可以返回任意類型的值,同樣可以接受這些類型的參數;
函數的參數與返回值之間,沒有必然的聯系。
2.創建自定義函數
CREATE FUNCTION function_name
RETURNS
{STRING|INTEGER|REAL|DECIMAL}
routine_body - 函數體
3.關於函數體
(1)函數體由合法的SQL語法構成;
(2)函數體可以是簡單的SELECT或INSERT語句;
(3)函數體如果為復合結構則使用BEGIN...END語句;
(4)復合結構可以包括聲明,循環,控制結構。
刪除函數:
DROP FUNCTION [IF EXISTS] function_name;
必要條件:返回值(必須),參數(非必須) 函數可以返回任意類型的值,同樣可以接收這些類型的參數,參數與返回值沒有必然的內在聯系
MySQL中參數的數量不能超過1024個
創建自定義函數:
CREATE FUNCTION function_name(參數) RETURNS 返回值類型
{STRING|INTEGER|REAL|DECIMAL}
routine_body
RETURN 返回值
創建不帶參數的自定義
(1)用date_format()函數寫出想要的日期表達方式
SELECT DATE_FORMAT(NOW(),'%Y年 %m月 %d日 %H點:%i分:%s秒');
(2)用自定義函數寫出想要的日期表達方式
CREATE FUNCTION f1() RETURNS VARCHAR(30)//創建一個f1()函數
RETURN DATE_FORMAT(NOW(),'%Y年 %m月 %d日 %H點:%i分:%s秒');//返回值
SELECT f1();//調用自定義函數f1();
創建日期時間自定義函數:
create function f1() returns varchar(30)
return date_format(now(),'%Y年%m月%d日 %H點:%i分:%s秒');
select f1();
DATE_FORMAT()函數在格式化日期格式時,應該是百分號在代表年、月、日的字母前面,字母的大小寫不同,所表示格式也有所區別:
select date_format(now(),'%Y-%m-%d'),其結果是:
2015-07-04
因此,各字母所表示的含義為:
Y:2015
y:15
M:july
m:07
D:4th
d:04
創建帶參數的自定義函數
創建帶參數的自定義函數:
CREATE FUNCTION f2(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)
RETURNS FLOAT(10,2) UNSIGNED
RETURN(num1+num2)/2;
刪除函數:
DROP FUNCTION fun_name;
創建具有復合結構函數體的自定義函數
修改分隔符:DELEMITER 分隔符
Eg:DELIMITER // /* 將命令分隔符”;”改為”//“ */
當函數體內需要執行的是多條語句時,要使用BEGIN...END語句
且當編寫函數體內容的時候,需要使用 DELIMITER 關鍵字將分隔符先修改為別的,否則編寫語句的時候寫到 ';' 的時候會直接執行,導致函數編寫失敗
刪除函數:DROP FUNCTION [IF EXISTS] function_name
Eg:
DELIMITER //
CREATE FUNCTION ADD_USER(username VARCHAR(20))
RETURNS INT UNSIGNED
BEGIN
INSERT user(username) VALUES(username);
RETURN LAST_INSERT_ID();
END
// /* 此處的”//“為告訴系統函數定義結束 */
總結
函數創建
create function()
必須有:1.參數 2.返回值(只能有一個)
【自定義函數】簡稱UDF;是對MySQL擴展的一種途徑
語法: CREATE FUNCTION ....
------------------------------------------
| test | CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`test` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
創建一個函數:
沒有參數的函數:
CREATE FUNCTION f1()
RETURNS VARCHAR(30)
RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H點%i分%s秒');
帶參數的函數:
CREATE FUNCTION f2(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)
RETURNS FLOAT(10,2) UNSIGNED
RETURN (num1+num2)/2;
說明 f1、f2是函數名 num1、num2是形參
RETURNS (returns) 后面跟的是返回值的數據類型
RETURN 后面跟的是函數體
創建一個執行多條sql語句的函數 f3(),並放回主鍵
如果有多條sql語句,必須放在 BEGIN 與END 之間
修改 結束符號成 ## 原本是; 當然你也可以改回來
1、DELIMITER ##
創建一個函數(功能是傳遞一個參數,參數是表 test 的test字段值,返回插入數據的主鍵)
2、CREATE FUNCTION f3(test varchar(20))
RETURNS INT UNSIGNED
BEGIN
INSERT `test`(`test`)values(test);
RETURN LAST_INSERT_ID();
END
##
修改結束符變回 ; (delimiter)
3、DELIMITER ;
刪除一個函數:
DROP FUNCTION IF EXISTS `f1`;
調用一個函數:
SELECT f1();
SELECT f2(23,2);
--------------------
MySQL存儲過程
存儲過程簡介
輸入SQL命令,MySQL引擎對命令進行分析,查看輸入的語法是否正確,如果正確,再進行編譯,編譯成MySQL引擎可識別的命令,最后再進行執行,並將執行結果返回給客戶端。
如果省略了語法分析和編譯的階段,則效率可提高。
存儲過程:是SQL語句和控制語句的預編譯集合,以一個名稱存儲並作為一個單元處理(類似函數)。存儲過程存儲在數據庫內,可以由應用程序調用執行,而且允許用戶申明變量以及進行流程控制。存儲過程可以接受輸入類型的參數和輸出類型的參數,並且可以存在多個返回值。只在第一次調用時進行語法分析和編譯,以后的調用直接調用編譯的結果,效率大大提高。
優點:
1、增強SQL語句的功能和靈活性:可以通過控制語句對流程進行控制和判斷
2、實現較快的執行速度:客戶端第一次調用存儲過程時,MySQL引擎會對其進行語法分析、編譯等操作,然后將編譯結果存儲到內存中,所以第一次和之前的效率一樣,然而以后會直接調用內存中的編譯結果,效率提高
3、減少網絡流量:例如刪除一個記錄,我們原本要輸入DELETE FROM xx WHERE ...; 要傳輸的字符較多,如果寫成存儲過程,就只要調用存儲過程的名字和相應參數就行,傳輸的字符數量較少,所以減少了網絡流量。
存儲過程語法結構分析
1、存儲過程語法結構分析
CREATE
[DEFINER = {user|CURRENT_USER}]//定義時的用戶,若是不寫就默認為當前用戶
PROCEDURE sp_name ([proc_parameter[,...]]) //可以帶0到多個參數 sp_name存儲過程的名字
[characteristic ...] routine_body
其中參數
proc_parameter:
[IN|OUT|INOUT] param_name type
IN, 表示該參數的值必須在調用存儲過程時指定
OUT, 表示該參數的值可以被存儲過程改變,並且可以返回
INOUT, 表示該參數的值調用時指定,並且可以被改變和返回
2.特性
COMMENT 'string'
{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA|SQL SECURITY{DEFINER|INVOKER}
COMMENT:注釋
CONTAINS SQL:包含SQL語句, 但不包含讀或寫數據的語句
NO SQL:不包含SQL語句
READS SQL DATA:包含讀數據的語句
MODIFIES SQL DATA:包含寫數據的語句
SQL SECURITY {DEFINER|INVOKER}指明誰有權限來執行
3.過程體
(1)過程體由合法的SQL語句構成;
(2)過程體可以是任意SQL語句;對表格進行增刪,連接,但是不能創建數據表<br>
(3)過程體如果為復合結構則使用BEGIN...END語句
(4)復合結構可以使用條件、循環等控制語句
創建不帶參數的存儲過程
1.創建沒有參數的存儲過程
CREATE PROCEDURE sp1() SELECT VERSION();
2.調用存儲過程
CALL sp_name([parameter[,...]]) - 帶參數的存儲過程的調用
CALL sp_name[()] - 不帶參數的存儲過程調用
CALL sp1;
CALL sp1();
創建帶有INT類型參數的存儲過程
1.創建帶有INT類型參數的存儲過程
DESC users;
DELIMITER //
CREATE PROCEDURE removeUserByID(IN id INT UNSIGNED)
BEGIN
DELETE FROM users WHERE id = id;
END
//
DELIMITER ;
CALL removeUserById(3); //參數名稱最好不要和表中的字段相同
SELECT * FROM users; //全刪除了
DELIMITER //
CREATE PROCEDURE removeUserById(IN p_id INT UNSIGNED)
BEGIN DELETE FROM users WHERE id = p_id;
END
//
DELIMITER ;
SELECT * FROM users;
CALL removeUserById(22);
SELECT * FROM users WHERE id = 22;
2.修改存儲過程
ALTER PROCEDURE sp_name [characteristic]
COMMENT 'string'
|{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}
|SQL SECURITY{DEFINER|INVOKER}
3.刪除存儲過程
DROP PROCEDURE [IF EXISTS] sp_name;
DROP removeUserById;
創建帶有IN OUT類型參數的存儲過程
1.用戶變量:以"@"開始,形式為"@變量名"
用戶變量跟mysql客戶端是綁定的,設置的變量,只對當前用戶使用的客戶端生效
2.全局變量:定義時,以如下兩種形式出現,set GLOBAL 變量名 或者 set @@global.變量名
對所有客戶端生效。只有具有super權限才可以設置全局變量
3.會話變量:只對連接的客戶端有效。
4.局部變量:作用范圍在begin到end語句塊之間。在該語句塊里設置的變量
declare語句專門用於定義局部變量。set語句是設置不同類型的變量,包括會話變量和全局變量
DELIMITER //
CREATE PROCEDURE removerUserAndReturnUserName(IN showID INT UNSIGNED,OUT showName INT UNSIGNED)
BEGIN
DELETE FROM user WHERE id = showID;
SELECT count(ID) FROM user INTO showName;
END
//
SELECT count(ID) FROM user INTO showName; /** 該語句中的 INTO 含義就是將 SELECT 語句結果的表達式返回到 showName 變量中 */
CALL removerUserAndReturnUserName(10,@nums); /** @nums 所代表的就是用戶變量,可用 SELECT @nums 輸出 */
用 DECLARE 聲明的變量是局部變量,局部變量只能存在於 BEGIN...END 之間,且聲明時必須置於 BEGIN...END 的第一行
而通過 SELECT...INTO.../SET @id = 07 這種方法設置的變量我們稱之為用戶變量,只能存在於當前用戶所使用的客戶端有效。
CALL rmUserAndRtUserNums(27, @nums);
SELECT @nums; //@nums - 就是用戶變量
DECLARE聲明的變量都是在BEGIN與END之間,是局部變量
SET @i = 7; //通過@或SET設置的變量稱為用戶變量
out 類型參數是返回數據;
create procedure pro_name(IN id smallint unsigned OUT nums int unsigned)
begin
delete from tbl_t1 where 表字段= id;
select count(表字段) from tbl_t1 into(將select 表達式count()結果通過into關鍵字賦給out參數) nums;
end
call remove_user_return_nums(6,@自定義變量); #這里變量范圍從begin到end結束
創建帶有多個OUT類型參數的存儲過程
創建帶有多個OUT類型參數的存儲過程:<br>
1.明確什么是OUT類型的參數,有什么作用?<br>
答:OUT類型參數,表示在調用存儲過程時,該參數的值可以被存儲過程改變,並且返回一個值。通常是這種類型時,調用時寫入的參數都是變量用“@”符號開頭的變量,在BEGIN和END之中的變量是局部變量,在調用存儲過程時寫入的變量是“用戶變量”,比如有一個存儲過程的名稱叫做“addUser()”,調用時addUser(@sum),sum就是用戶變量。
2.ROW_COUNT()函數就相當於PHP的MySQL函數庫中的mysql_affected_rows()這個函數,兩者的作用都是相同的,都是計算當插入記錄和修改記錄、以及添加和刪除記錄時的個數總和的。
3.例子:
SELECT ROW_COUNT() INTO delete_User ;是指調用ROW_COUNT()這個函數,並且把返回值存儲在delete_User這個局部變量中。
SELECT COUNT(id) FROM users INTO remain_User ;是指在刪除用戶后,調用COUNT()函數對剩下的用戶數做一個統計,在哪張表中要說明清楚,然后把返回值存儲在remain_User這個局部變量中。
【因為delete_User和remain_User是OUT類型的參數,所以會返回一個值給調用時的用戶變量,用"SELECT @a,@b"可以知道返回的值是多少了】
ROW_COUNT()函數相當於PHP的MySQL函數庫中的mysql_affected_rows()這個函數,都是計算被影響的記錄數(行數)的總和。
例子:
INSERT test(username) VALUES('A'),('B,'),('C');//寫入三條記錄
SELECT ROW_COUNT();==>3 //返回被修改的記錄總數
DELIMITER //
CREATE PROCEDURE rmUserByAgeAndRtInfos(IN p_age SMALLINT UNSIGNED, OUT delNums SMALLINT UNSIGNED, OUT leftNums SMALLINT UNSIGNED)
BEGIN
DELETE FROM users WHERE age = p_age; //注意變量不同
SELECT ROW_COUNT() INTO delNums;//此處的SELECT... INTO…只是在賦值
SELECT COUNT(id) FROM users INTO leftNums;//同上
END
//
DELIMITER ;
CALL rmUserByAgeAndRtInfos(20, @a, @b);
SELECT @a, @b;
局部變量與用戶函數:
1. 類型聲明
SELECT…INTO…/SET 不需要聲明類型,declare必須指定類型
SET 變量名 = 表達式值 [,variable_name = expression ...]
SELECT 表達式值 INTO 變量;
DECLARE variable_name [,variable_name...] datatype [DEFAULT value];
DECLARE為MySQL的數據類型,如:int, float, date, varchar(length)
例如:DECLARE l_int int unsigned default 40;
2. 位置
SELECT…INTO…/SET 位置可以任意, DECLARE 必須在復合語句的開頭,在任何其它語句之前
3.作用范圍
DECLARE 定義的變量的作用范圍是BEGIN … END塊內,只能在塊中使用,
SET 定義的變量用戶變量,只能存在於當前用戶所使用的客戶端有效。
存儲過程與自定義函數的區別
存儲過程與自定義函數的區別:
1、存儲過程實現的功能相對復雜,函數針對性較強
2、存儲過程可以返回多個值,函數只能有一個返回值
3、存儲過程一般獨立執行,函數可以作為 sql 語句的組成部分來出現
另外,存儲過程也比通過API接口調用程序要快。
修改存儲過程 如圖
存儲過程只能修改一些特性,不能修改過程體。如果要修改過程體 只能先刪除存儲過程
//修改存儲過程
alter procedure sp_name [characteristic ...]
comment 'string'
| {contains sql | no sql | reads sql data | modifies sql data} | sql security {definer | invoker}
存儲過程只能修改簡單的特性,並不能修改過程體
//刪除存儲過程
DROP PROCEDURE [IF EXISTS] sp_name;
1、存儲過程:是SQL語句和控制語句的預編譯集合,以一個名字存儲並作為一個單元來處理。
2、參數:輸入類型 輸出類型 輸入&&是輸出
3、創建:CREATE...PROCEDURE...
4、注意事項:
(1)創建存儲過程或自定義函數時需要通過delimiter語句修改定界符。
(2)如果函數體或過程題有多個語句,需要包含在BEGIN...END語句塊中。
(3)存儲過后才能通過call來調用。
--------------------
MySQL存儲引擎
存儲引擎
(1)MySQL可以將數據以不同的技術存儲在文件(內存)中,這種技術就成為存儲引擎。
每種存數引擎使用不同的存儲機制、索引技巧、鎖定水平,最終提供廣泛且不同的功能。
(2)使用不同的存儲引擎也可以說不同類型的表
(3)MySQL支持的存儲引擎
1. MyISAM
2. InnoDB
3. Memory
4. CSV
5. Archive
並發處理
1.存儲引擎:MyISAM,InnoDB,Memory,CSV,Archive<br>
2.並發控制:<br>
當多個連接對記錄進行修改時保證數據的一致性和完整性。系統使用鎖系統來解決這個並發控制,這種鎖分為:
1).共享鎖(讀鎖)---在同一時間內,多個用戶可以讀取同一個資源,讀取過程中數據不會發生任何變化。
2).排他鎖(寫鎖)---在任何時候只能有一個用戶寫入資源,當進行寫鎖時會阻塞其他的讀鎖或者寫鎖操作。
3.鎖的力度(也叫鎖的顆粒)
鎖顆粒(鎖定時的單位)
---表鎖,是一種開銷最小的鎖策略。得到數據表的寫鎖
---行鎖,是一種開銷最大的鎖策略。並行性最大
表鎖的開銷最小,因為使用鎖的個數最小,行鎖的開銷最大,因為可能使用鎖的個數比較多。
事務處理
事務處理:整個過程每一個單元全部完成才算事務處理成功,某一個單元失敗事務就會回滾.
主要作用:保證數據庫的完整性
事務的特性:
原子性、一致性、隔離性、持久性
簡稱:A(Atomic)C(Consistency)I(Isolation)D(Durable)
外鍵與索引
外鍵:是保證數據一致性的一個策略
索引:對數據表中的一列或多列進行排序的一種結構,可以快速訪問數據表的特定信息。如目錄的作用,可快速定位
普通索引、唯一索引、全文索引
各存儲引擎之間的區別
存儲限制的不同、事務的支持、索引的支持、鎖粒度的支持、數據壓縮的支持、外鍵的支持
各種存儲引擎的特點
Memory的存儲限制是由內存的大小來決定。
索引:普通索引、唯一索引、全文索引、btree索引、hash索引……
CSV存儲引擎不支持索引。
BlackHole:黑洞引擎,寫入的數據都會消失,一般用做數據復制的中繼。
使用最廣泛的兩種存儲引擎:MyISAM/InnoDB
MyISAM:適用於事務的處理不多的情況。
InnoDB:適用於事務處理比較多,需要有外鍵支持的情況。
設置存儲引擎
存儲引擎:數據的系統的心臟,實現數據存儲和查詢的功能,對應的特點為,存儲限制、事務安全、是否支持索引、鎖的粒度大小、是否支持數據壓縮、是否支持外鍵等。每個技術特點解決的問題是不一樣的,不過本質就是為了實現數據存儲和查詢,是實現的技術不一樣,特點不一樣,所以我們應該根據需要選擇最為合適的。
1:存儲限制——數據庫能存多少數據
2:事務安全——能否保證數據完整性
3:是否支持索引——能夠實現快速查詢
4:鎖的粒度大小——用於並發控制,實現數據一致性和完整性
5:是否支持數據壓縮——用於數據壓縮,能夠存儲更多的數據或者改變數據存儲結構
6:是否支持外鍵——能夠保證數據的一致性。
(1)通過修改MySQL配置文件實現
- default-storage-engine = engine
(2)通過創建數據表命令來實現
- CREATE TABLE tbl_name(
...
...
) ENGINE = engine;
(3)通過修改數據表命令實現
- ALTER TABLE tbl_name ENGINE [=] engine_name;
PS:MySQL圖形化管理工具