1. 程式人生 > 資料庫 >MySQL基礎回顧

MySQL基礎回顧

1、資料庫介紹

1.1 什麼是資料庫

​ 資料庫:儲存資料的倉庫。它體現在我們電腦中,就是一個檔案系統。然後把資料都儲存這些特殊的檔案中,並且需要使用固定的語言(SQL語言)去操作檔案中的資料。

技術定義: 資料庫(Database)是按照資料結構來組織、儲存和管理資料的建立在計算機儲存裝置上的倉庫。

1.2 資料庫介紹

​ 我們開發應用程式的時候,程式中的所有資料,最後都需要儲存到專業軟體中。這些專業的儲存資料 的軟體我們稱為資料庫。 我們學習資料庫,並不是學習如何去開發一個數據庫軟體,我們學習的是如何使用資料庫以及資料庫中的資料記錄的操作,而資料庫軟體是由第三方公司研發。

1.3 資料庫的分類

關係型、非關係型的資料庫

常見的資料庫軟體:

Oracle:它是Oracle公司的大型關係型資料庫,它是收費的。

DB2:IBM公司的資料庫,它是收費的。

SqlServer:微軟資料庫。收費

Sybase:Sybase公司的。 工具PowerDesign 資料庫建模工具。

MySql:早期瑞典一個公司發明,後期被sun公司收購,後期被Oracle。

1.4 什麼是關係型資料庫

​ 在開發軟體的時候,軟體中的資料之間必然會有一定的關係存在,需要把這些資料儲存在資料庫中, 同時也要維護資料之間的關係,這時就可以直接使用上述的那些資料庫。而上述的所有資料庫都屬於關係 型資料庫。

​ 描述資料之間的關係,並儲存在資料庫中,同時學習如果根據這些關係查詢資料庫中的資料, 關係型資料:設計資料庫的時候,需要使用E-R圖來描述。實體關係 E-R:實體關係圖。

​ 實體:可以理解成我們Java程式中的一個物件。在E-R圖中使用 矩形(長方形) 表示。

​ 針對一個實體中的屬性,我們稱為這個實體的資料,在E-R圖中使用 橢圓表示。 實體和實體之間的關係:在E-R圖中使用菱形表示。

2、 mysql在linux安裝篇

2.1 centOS7安裝時配置動態ip

#檢視埠
ip a
#編輯ifcfg-ens33檔案
vi /etc/sysconfig/network-scripts/ifcfg-ens33
#保證ifcfg-ens33檔案兩個地方正確
BOOTPROTO=dhcp
ONBOOT=yes
#儲存退出
:wq
#重啟網絡卡
systemctl restart network
#再檢視ip就分配了ip了
ip a

2.2 centOS7關於防火牆的命令

#檢視防火牆狀態
firewall-cmd --state
#關閉防火牆
systemctl stop firewalld.service
#禁止防火牆開機啟動
systemctl disable firewalld.service

2.3 安裝mysql(5.7)

#建立目錄
mkdir -p /usr/local/mysql
#進入目錄
cd /usr/local/mysql
#安裝mysql,如果安裝8.0版本,把連結改為https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm
wget http://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm
rpm -ivh mysql57-community-release-el7-8.noarch.rpm
yum -y install mysql-server
#重啟mysql
service mysqld restart
#找到預設的密碼
grep "password" /var/log/mysqld.log
#登入mysql
mysql -uroot -p
#輸入密碼登入
#設定密碼的驗證強度等級
set global validate_password_policy=LOW;
#設定密碼的長度為6
set global validate_password_length=6;
#修改密碼
set password for root@localhost = password('123456');
#退出,然後重新登入
quit;
mysql -uroot -p
#輸入密碼登入
#修改遠端訪問
use mysql;
update user set host = '%' where user ='root';
quit
service mysqld restart
#開放3306埠
firewall-cmd --zone=public --add-port=3306/tcp --permanent
#重新載入防火牆
firewall-cmd --reload
#檢視開放埠
firewall-cmd --zone=public --list-ports
#開放埠成功就可以在外部用navicat直接連線了

3、 mysql基本操作篇

3.1 基本的SQL語句

首先登入mysql,sql語句不區分大小寫

pet.txt的內容:

Fluffy	Harold	cat	f	1993-02-04
Claws	Gwen	cat	m	1994-03-17
Buffy	Harold	dog	f	1989-05-13
Fang	Benny	dog	m	1990-08-27
Bowser	Diane	dog	m	1979-08-31	1995-07-29
Chirpy	Gwen	bird	f	1998-09-11
Whistler	Gwen	bird	1997-12-09
Slim	Benny	snake	m	1996-04-29
-- 查詢mysql當前版本以及當前日期
SELECT VERSION(),CURRENT_DATE;
-- 可以進行簡單運算
SELECT SIN(PI()/2),(4+1)*5;
-- SQL語句是以分號結尾的,sql語句寫了一半,又不想執行可以在語句末尾加上 \c
-- 查看錶結構
DESC 表名;
-- 檢視建立表的語句
show creat table 表名;
-- 表中匯入資料,可以用insert語句,也可以批量匯入
-- 首先要有pet這個表
create database test;
use test;
CREATE TABLE pet (name VARCHAR(20),owner VARCHAR(20),species VARCHAR(20),sex CHAR(1),birth DATE,death DATE);
-- 建立一個pet.txt檔案放在/usr/local/mysql下,寫入資料,每個欄位中用tab鍵隔開,欄位沒有值的記錄用\N代替;
LOAD DATA LOCAL INFILE '/usr/local/mysql/pet.txt' INTO TABLE pet;
-- 查詢表中的所有資料
SELECT * FROM pet;
-- 刪除表中的所有資料
DELETE FROM pet;
-- 更新表中名字為Bowser的生日
UPDATE pet SET birth='1989-08-31' WHERE name='Bowser';
-- Mysql預設的字串比較也是不分大小寫的,所以Bowser和bowsER是一樣的結果
-- 查詢生日在1998以後的
SELECT * FROM pet WHERE birth>='1998-01-01';
-- 檢索種類是狗並且性別是m的
SELECT * FROM pet WHERE species='dog' AND sex='m';
-- 查詢種類是snake或者bird的
SELECT * FROM pet WHERE species='snake' OR species='bird';
-- 查詢所有dog的姓名和性別
SELECT name,sex FROM pet WHERE species='dog';
--查詢所有寵物的種類,不重複用關鍵字DISTINCT
SELECT DISTINCT species FROM pet;
-- 根據生日降序查詢所有的列
SELECT * FROM pet ORDER BY birth DESC; --升序用關鍵字ASC,但是一般不用因為這是預設的
-- 根據species欄位升序排列,根據birth欄位降序排列
SELECT * FROM pet ORDER BY species ASC,birth DESC; --優先用species排序,species相同的再根據birth排序
-- 查詢當前日期
SELECT CURDATE();
-- 查詢所有寵物出生的年份,去除重複,YEAR()函式是對對應的日期取年,MONTH()是月,DAY()是日;
SELECT DISTINCT YEAR(birth) AS year FROM pet;
--查詢所有birth不是null的寵物的年齡,AS是取別名,TIMESTAMPDIFF()函式是求時間差,IS NOT NULL表示不為null,IS NULL表示是null!
SELECT *,TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age FROM pet WHERE birth IS NOT NULL; 
-- 查詢年齡最小的寵物的出生日期,年齡最小即是生日最大,MAX()函式用來取某列的最大值,MIN()用來取最小值,求某列資料之和用SUM(),查詢記錄數用COUNT(),查詢平均數用AVG()
SELECT MAX(birth) FROM pet;
-- 查詢前3條記錄,如果只有一個引數,那麼就表示從第一條記錄開始查詢幾條記錄
SELECT * FROM pet LIMIT 3;
-- 查第二條到第四條記錄,第一個引數表示從第幾條記錄開始查詢,第一條記錄是0,第二個引數表示查詢幾條記錄
SELECT * FROM pet LIMIT 1,2;
-- 查詢所有寵物的種類,分組查詢
SELECT species FROM pet GROUP BY species;
-- 求一共有多少條記錄
SELECT COUNT(*) AS count FROM pet;

3.2 SQL語言的分類

1、DDL(資料定義語言)

用來定義資料庫的物件,如資料表、檢視、索引等

2、DML(資料操縱語言庫)

在資料庫表中更新,增加和刪除記錄 如 update, insert, delete

3、DCL(資料控制語言)

用於設定使用者許可權和控制事務語句,如grant,revoke,if…else,while,begintransaction

4、DQL(資料查詢語言)

用於查詢資料的語句, select

4、資料庫的備份與恢復

4.1 備份命令

在mysql的安裝目錄的bin目錄下有mysqldump命令,可以完成對資料庫的備份。

語法:mysqldump -u 使用者名稱 -p密碼 資料庫名> 磁碟SQL檔案路徑

由於mysqldump命令不是sql命令,需要在dos視窗下使用。 注意:在備份資料的時候,資料庫不會被刪除。可以手動刪除資料庫。同時在恢復資料的時候,不會 自動的給我們建立資料庫,僅僅只會恢復資料庫中的表和表中的資料 !

如:

mysqldump ‐uroot ‐p123456 test >/root/data/test.sql

4.2 恢復命令

恢復資料庫,需要手動的先建立資料庫: create database heima2;

語法:mysql -u 使用者名稱-p 匯入庫名< 硬碟SQL檔案絕對路徑

如:

# 首先要建立一個test1的資料庫
# 恢復命令
mysql ‐uroot ‐p123456 test1</root/data/pet.sql

5、多表查詢

5.1 笛卡爾積介紹

笛卡爾乘積是指在數學中,兩個集合X和Y的笛卡尓積(Cartesian product),又稱直積,表示為X * Y,第一個物件是X的成員而第二個物件是Y的所有可能有序對的其中一個成員 !

作用:笛卡爾積的資料對程式是沒有意義的,我們需要將笛卡爾積的資料再次進行過濾!

對於多表查詢操作,需要過濾出滿足條件的資料,需要把多個表進行連線,連線之後需要加上過濾的條條件!

5.2 內聯結

內連線:

語法一: select 列名,列名 … from 表名1,表名2 where 表名1.列名 = 表名2.列名;

語法二: select * from 表名1 inner join 表名2 on 條件

5.3 左外聯結

外聯結:左外聯結、右外聯結、全聯結、自聯結。

左外聯結:用左邊表去右邊表中查詢對應記錄,不管是否找到,都將顯示左邊表中全部記錄。 即:雖然右表沒有左表某條記錄對應的資料,也要把他查詢出來。

語法:select * from 表1 left outer join 表2 on 條件

5.4 右外聯結

用右邊表去左邊表查詢對應記錄,不管是否找到,右邊表全部記錄都將顯示。 即:雖然左表沒有右表某條記錄對應的資料,也要把他查詢出來

語法:select * from 表1 right outer join 表2 on 條件;

5.5 全外聯結

左外連線和右外連線的結果合併,但是會去掉重複的記錄。

select * from 表1 full outer join 表2 on 條件

但是mysql資料庫不支援此語法,但是也可以通過其他方法實現該效果(union關鍵字)。

5.6 關聯子查詢

5.6.1 in和exists關鍵詞的用法

關聯子查詢其他的關鍵字使用:

回憶:age=23 or age=24 等價於 age in (23,24)

in 表示條件應該是在多個列值中。

in:使用在where後面,經常表示是一個列表中的資料,只要被查詢的資料在這個列表中存在即可。

not in:表示被查詢的資料不在該列表中即可!

exists表示存在,當子查詢的結果存在就會顯示主查詢中的所有資料!用在where關鍵字後面,當然也有not exits

5.6.2 union和union all的用法

UNION 語句:用於將不同表中相同列中查詢的資料展示出來;(不包括重複資料)

UNION ALL 語句:用於將不同表中相同列中查詢的資料展示出來;(包括重複資料)

5.6.3 case when語句

case when語句結構

CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END

--比如:
SELECT *,CASE
WHEN salary < 5000 THEN "低等收入"
WHEN salary>= 5000 AND salary < 10000 THEN "中等收入"
WHEN salary > 10000 THEN "高等收入"
END AS level,CASE sex
WHEN "female" THEN 1
WHEN "male" THEN 0
END AS flag
FROM employee;

6、MySQL的資料型別

6.1 MySQL支援的資料型別

(1)MySQL支援所有標準SQL數值資料型別。 這些型別包括嚴格數值資料型別(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似數值資料型別 (FLOAT、REAL和DOUBLE PRECISION)。

關鍵字INT是INTEGER的同義詞,關鍵字DEC是DECIMAL的同義詞。

BIT資料型別儲存位欄位值,並且支援MyISAM、MEMORY、InnoDB和BDB表。

作為SQL標準的擴充套件,MySQL也支援整數型別TINYINT、MEDIUMINT和BIGINT。

(2)表示時間值的日期和時間型別為DATETIME、DATE、TIMESTAMP、TIME和YEAR。 每個時間型別有一個有效值範圍和一個"零"值,當指定不合法的MySQL不能表示的值時使用"零"值。

(3)字串型別指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。

CHAR 和 VARCHAR 型別類似,但它們儲存和檢索的方式不同。它們的最大長度和是否尾部空格被保留等 方面也不同。在儲存或檢索過程中不進行大小寫轉換。

BINARY 和 VARBINARY 類似於 CHAR 和 VARCHAR,不同的是它們包含二進位制字串而不要非二進位制字 符串。也就是說,它們包含位元組字串而不是字元字串。這說明它們沒有字符集,並且排序和比較基於 列值位元組的數值值。

BLOB 是一個二進位制大物件,可以容納可變數量的資料。有 4 種 BLOB 型別:TINYBLOB、BLOB、 MEDIUMBLOB 和 LONGBLOB。它們區別在於可容納儲存範圍不同。

有 4 種 TEXT 型別:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。對應的這 4 種 BLOB 型別,可存 儲的最大長度不同,可根據實際情況選擇。

6.2 MySQL 5.0 以上的版本:

1、一個漢字佔多少長度與編碼有關: UTF-8:一個漢字=3個位元組 GBK:一個漢字=2個位元組

2、varchar(n) 表示 n 個字元,無論漢字和英文,Mysql 都能存入 n 個字元,僅是實際位元組長度有所區別 3、MySQL 檢查長度,可用 SQL 語言來檢視:

SELECT LENGTH(fieldname) FROM tablename

7、分組語句

GROUP BY 語句根據一個或多個列對結果集進行分組。 在分組的列上我們可以使用 COUNT,SUM,AVG,等函式。

注意:

​ 1、group by 可以實現一個最簡單的去重查詢 ;

2、分組後的條件使用 HAVING 來限定,WHERE 是對原始資料進行條件限制。幾個關鍵字的使用順序為 where 、group by 、having、order by ,例如: 
SELECT name,sum(*) FROM employee_tbl WHERE id<>1 GROUP BY name HAVING sum(*)>5 ORDER
BY sum(*) DESC;

8、模糊查詢

LIKE 子句中使用百分號 %字元來表示任意字元,類似於UNIX或正則表示式中的星號 *。 如果沒有使用百分號 %,LIKE 子句與等號 = 的效果是一樣的

你可以在 WHERE 子句中指定任何條件。

你可以在 WHERE 子句中使用LIKE子句。

你可以使用LIKE子句代替等號 。

LIKE 通常與 % 一同使用,類似於一個元字元的搜尋。

你可以使用 AND 或者 OR 指定一個或多個條件。

你可以在 DELETE 或 UPDATE 命令中使用 WHERE…LIKE 子句來指定條件

注意:"%“表示任意個字元(0個或者n個),”_"示有且只有一個字元!

SELECT * FROM pet WHERE species LIKE '%d%';  --表示搜尋pet表中species欄位中含有d的行的所有資訊

9、NULL 值處理

當提供的查詢條 件欄位為 NULL 時, 為了處理這種情況,MySQL提供了三大運算子:

​ IS NULL: 當列的值是 NULL,此運算子返回 true。

​ IS NOT NULL: 當列的值不為 NULL,運算子返回 true。

​ <=>: 比較操作符(不同於=運算子),當比較的的兩個值為 NULL 時返回 true。

關於 NULL 的條件比較運算是比較特殊的。你不能使用 = NULL 或 != NULL 在列中查詢 NULL 值 。 在 MySQL 中,NULL 值與任何其它值的比較(即使是 NULL)永遠返回 false,即 NULL = NULL 返回 false 。

MySQL 中處理 NULL 使用 IS NULL 和 IS NOT NULL 運算子

10、 獲取伺服器元資料

命令 描述

SELECT VERSION( ) 伺服器版本資訊

SELECT DATABASE( ) 當前資料庫名 (或者返回空)

SELECT USER( ) 當前使用者名稱

SHOW STATUS 伺服器狀態

SHOW VARIABLES 伺服器配置變數

11、 ALTER命令

11.1 刪除、新增或修改表字段

如下命令使用了 ALTER 命令及 DROP 子句來刪除以上建立表的 i 欄位:

ALTER TABLE testalter_tbl DROP i;

如果資料表中只剩餘一個欄位則無法使用DROP來刪除欄位。

MySQL 中使用 ADD 子句來向資料表中新增列,如下例項在表 testalter_tbl 中新增 i 欄位,並定義資料型別:

ALTER TABLE testalter_tbl ADD i INT;

執行以上命令後,i 欄位會自動新增到資料表字段的末尾 !

11.2 修改欄位型別及名稱

如果需要修改欄位型別及名稱,你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。

例如,把欄位 c 的型別從 CHAR(1) 改為 CHAR(10),可以執行以下命令:

ALTER TABLE testalter_tbl MODIFY c CHAR(10);

11.3 修改表名

如果需要修改資料表的名稱,可以在 ALTER TABLE 語句中使用 RENAME 子句來實現。

嘗試以下例項將資料表 testalter_tbl 重新命名為 alter_tbl:

ALTER TABLE testalter_tbl RENAME TO alter_tbl;

12、MySQL內建函式

12.1 關於字串的內建函式

CONCAT(“str1”,“str2”,…) 把所有的字串連線起來組成一個新的字串;

LTRIM(“str”) 去掉字串左邊的所有空格,RTRIM()則是去掉右邊的空格,TRIM()是去掉左右兩邊的空格!

FORMAT(x,n) 將x保留到小數點後n位,四捨五入!

LOWER(“str”) 將字串所有字元轉換為小寫的格式!

REVERSE(“str”) 將字串的順序反過來!

SPACE(n) 返回n個空格!

SUBSTRING(“str”,i,j) 擷取字串,從下標為i的字元開始,擷取j個!

UPPER(“str”) 將字串的所有字元變為大寫的

12.2 關於數字的函式

PI() 得到圓周率

RAND() 返回0到1的隨機數

ROUND(x) 返回離x最近的整數

12.3 日期型別的函式

CURDATE() 返回當前日期,等同於CURRENT_DATE();

CURRENT_TIME() 返回當前時間

DATEDIFF(d1,d2) 計算日期d1,d2相隔天數

12.4 高階函式

DATABASE() 返回當前資料庫名

LAST_INSERT_ID() 返回最近生成的AUTO_INCREMENT值

13、MySQL索引

MySQL索引的建立對於MySQL的高效執行是很重要的,索引可以大大提高MySQL的檢索速度。

索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不 是組合索引。組合索引,即一個索引包含多個列。

建立索引時,你需要確保該索引是應用在 SQL 查詢語句的條件(一般作為 WHERE 子句的條件)。

實際上,索引也是一張表,該表儲存了主鍵與索引欄位,並指向實體表的記錄。

上面都在說使用索引的好處,但過多的使用索引將會造成濫用。因此索引也會有它的缺點:雖然索引大大 提高了查詢速度,同時卻會降低更新表的速度,如對錶進行INSERT、UPDATE和DELETE。因為更新表 時,MySQL不僅要儲存資料,還要儲存一下索引檔案。 建立索引會佔用磁碟空間的索引檔案。

13.1 普通索引

13.1.1 建立索引

這是最基本的索引,它沒有任何限制。它有以下幾種建立方式 :

CREATE INDEX indexName ON mytable(username(length));

如果是CHAR,VARCHAR型別,length可以小於欄位實際長度;如果是BLOB和TEXT型別,必須指定 length;

13.1.2 修改表結構,新增索引
ALTER table tableName ADD INDEX indexName(columnName)
13.1.3 建立表的時候直接指定
CREATE TABLE mytable(
ID INT NOT NULL,username VARCHAR(16) NOT NULL,INDEX [indexName] (username(length))
);
13.1.4 刪除索引的語法
DROP INDEX [indexName] ON mytable;

13.2 唯一索引

它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值 的組合必須唯一。它有以下幾種建立方式:

13.2.1 建立索引
CREATE UNIQUE INDEX indexName ON mytable(username(length))
13.2.2 修改表結構
ALTER table mytable ADD UNIQUE [indexName] (username(length))
13.2.3 建立表的時候直接指定
CREATE TABLE mytable(
ID INT NOT NULL,UNIQUE [indexName] (username(length))
);

13.3 使用ALTER 命令新增和刪除索引

有四種方式來新增資料表的索引:

ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 該語句新增一個主鍵,這意味著索引 值必須是唯一的,且不能為NULL。

ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 這條語句建立索引的值必須 是唯一的(除了NULL外,NULL可能會出現多次)。

ALTER TABLE tbl_name ADD INDEX index_name (column_list): 新增普通索引,索引值可出現 多次。 ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list): 該語句指定了索引為 FULLTEXT ,用於全文索引

以下例項為在表中新增索引:

ALTER TABLE testalter_tbl ADD INDEX (c);

你還可以在 ALTER 命令中使用 DROP 子句來刪除索引。嘗試以下例項刪除索引:

ALTER TABLE testalter_tbl DROP INDEX c;

13.4 使用 ALTER 命令新增和刪除主鍵

主鍵只能作用於一個列上,新增主鍵索引時,你需要確保該主鍵預設不為空(NOT NULL)。例項如下:

ALTER TABLE testalter_tbl MODIFY itcast INT NOT NULL;
ALTER TABLE testalter_tbl ADD PRIMARY KEY (itcast);

你也可以使用 ALTER 命令刪除主鍵:

ALTER TABLE testalter_tbl DROP PRIMARY KEY;

刪除主鍵時只需指定PRIMARY KEY,但在刪除索引時,你必須知道索引名。

13.5 顯示索引資訊

你可以使用 SHOW INDEX 命令來列出表中的相關的索引資訊。可以通過新增 \G 來格式化輸出資訊。

SHOW INDEX FROM table_name; \G

14、MySQL事務

​ MySQL 事務主要用於處理操作量大,複雜度高的資料。比如說,在人員管理系統中,你刪除一個人 員,你即需要刪除人員的基本資料,也要刪除和該人員相關的資訊,如信箱,文章等等,這樣,這些資料庫操作語句就構成一個事務!

​ 在 MySQL 中只有使用了Innodb 資料庫引擎的資料庫或表才支援事務。

​ 事務處理可以用來維護資料庫的完整性,保證成批的 SQL 語句要麼全部執行,要麼全部不執行。

​ 事務用來管理 insert,update,delete 語句 一般來說,事務是必須滿足4個條件(ACID):原子性(Atomicity,或稱不可分割性)、一致性 (Consistency)、隔離性(Isolation,又稱獨立性)、永續性(Durability)。

​ 原子性:一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,在中間某個環節 不會結束。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務 從來沒有執行過一樣。

​ 一致性:在事務開始之前和事務結束以後,資料庫的完整性沒有被破壞。這表示寫入的資料必須完全 符合所有的預設規則,這包含資料的精確度、串聯性以及後續資料庫可以自發性地完成預定的工作。

​ 隔離性:資料庫允許多個併發事務同時對其資料進行讀寫和修改的能力,隔離性可以防止多個事務並 發執行時由於交叉執行而導致資料的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和序列化 (Serializable)。

​ 永續性:事務處理結束後,對資料的修改就是永久的,即便系統故障也不會丟失。

14.1 事務控制語句

BEGIN或START TRANSACTION:顯式地開啟一個事務;

COMMIT:也可以使用COMMIT WORK,不過二者是等價的。COMMIT會提交事務,並使已對資料庫 進行的所有修改成為永久性的;

ROLLBACK:有可以使用ROLLBACK WORK,不過二者是等價的。回滾會結束使用者的事務,並撤銷正 在進行的所有未提交的修改;

SAVEPOINT identifier:SAVEPOINT允許在事務中建立一個儲存點,一個事務中可以有多個 SAVEPOINT;

RELEASE SAVEPOINT identifier:刪除一個事務的儲存點,當沒有指定的儲存點時,執行該語句會拋 出一個異常;

ROLLBACK TO identifier:把事務回滾到標記點;

SET TRANSACTION:用來設定事務的隔離級別。InnoDB儲存引擎提供事務的隔離級別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。

14.2 MySQL 事務處理主要有兩種方法

1、用 BEGIN,ROLLBACK,COMMIT來實現

​ BEGIN 開始一個事務

​ ROLLBACK 事務回滾

​ COMMIT 事務確認

2、直接用 SET 來改變 MySQL 的自動提交模式:

​ SET AUTOCOMMIT=0 禁止自動提交

​ SET AUTOCOMMIT=1 開啟自動提交