MYSQL(基本篇)——一篇文章帶你走進MYSQL的奇妙世界

MYSQL(基本篇)——一篇文章帶你走進MYSQL的奇妙世界

MYSQL算是我們程序員必不可少的一份求職工具了

無論在什麼崗位,我們都可以看到應聘要求上所書寫的」精通MYSQL等數據庫及優化「

那麼我們今天就先來了解一下MYSQL的整體布局並且帶你掌握MYSQL的基本內容,希望能為你帶來幫助!

MYSQL基本布局

基礎篇

  • MYSQL概述
  • SQL語法
  • 函數
  • 約束
  • 多表查詢
  • 事務

進階篇

  • 存儲引擎
  • 索引
  • SQL優化
  • 視圖/存儲過程/觸發器
  • InnoDB核心
  • MYSQL管理

運維篇

  • 日誌
  • 主從複製
  • 分庫分表
  • 讀寫分離
# 即使看到這麼多內容,也不要太過害怕
# 我們這篇文章只為大家介紹到基礎篇的內容,而我們如果不深入的話,學習到進階篇已經是足夠工作使用的了

MYSQL概述

我們先來整體了解一下MYSQL

數據庫相關概念

數據庫整體而言,分為三個部分:

名稱 全稱 簡稱
數據庫 存儲數據的倉庫,數據是有組織的進行存儲 DB
數據庫管理系統 操縱和管理數據庫的大型軟件 DBMS
SQL 操作關係型數據庫的編程語言,定義了一套操作關係型數據庫統一標準 SQL

目前主流關係型數據庫

目前主流關係型數據庫有四種:

  • ORACLE
  • MYSQL
  • SQL Server
  • PostgreSQL
# 注意:我們所學習的SQL語句是針對所有關係型數據庫,所以不存在你學習了MYSQL卻在工作中遇到ORACLE卻無法使用的情況

數據庫的啟動和連接

數據庫的正常啟動一般在cmd命令行中:

# 啟動:
net start mysql80
# 關閉:
net stop mysql80
#客戶端連接:
在電腦中找到客戶端命令行,並輸入密碼即可

但我們的日常使用中,使用cmd命令行是極其不美觀且不實用的,我們一般使用軟件代替:

  • 這裡我們推薦使用DataGrip軟件
  • 但下載只有30天試用,需要收費,可以到其他網站找到破解版,這裡暫不做內容講解

關係型數據庫

關係型數據庫概念:

  • 建立在關係模型基礎上,由多張相互連接的二維表組成的數據庫

特點:

  • 使用表存儲數據,格式統一,便於維護
  • 使用SQL語言操作,標誌統一,使用方便

數據模型

數據模型示意圖:

  • 客戶端 -> DBMS -> 數據庫 -> 表

注意:

  • DBMS可以操作多個數據庫
  • 單個數據庫可以存在多個表

SQL數據類型

我們在講解SQL語法之前需要先來了解一下SQL中的數據類型:

數值類型

分類 類型 大小 有符號(SIGNED)範圍 無符號(UNSIGNED)範圍 描述
數值類型 TINYINT 1 byte (-128,127) (0,255) 小整數值
SMALLINT 2 bytes (-32768,32767) (0,65535) 大整數值 大整數值
MEDIUMINT 3 bytes (-8388608,8388607) (0,16777215) 大整數值 大整數值
INT或INTEGER 4 bytes (-2147483648,2147483647) (0,4294967295) 大整數值 大整數值
BIGINT 8 bytes (-263,263-1) (0,2^64-1) 極大整數值 極大整數值
FLOAT 4 bytes (-3.402823466 E+38,3.402823466351 E+38) 0 和 (1.175494351 E-38,3.402823466 E+38) 單精度浮點數值 單精度浮點數值
DOUBLE 8 bytes (-1.7976931348623157 E+308,1.7976931348623157 E+308) 0 和 (2.2250738585072014 E-308,1.7976931348623157 E+308) 雙精度浮點數值 雙精度浮點數值
DECIMAL 依賴於M(精度)和D(標度)的值 依賴於M(精度)和D(標度)的值 小數值(精確定點數) 小數值(精確定點數)
注意:
TINYINT 可以用於一些非常小的數值中,因為只佔用1byte,可以減少內存使用
SIGNED  可以用於非負數的情況下,增大數值

字符串類型

分類 類型 大小 描述
字符串類型 CHAR 0-255 bytes 定長字符串
VARCHAR 0-65535 bytes 變長字符串 變長字符串
TINYBLOB 0-255 bytes 不超過255個字符的二進制數據 不超過255個字符的二進制數據
TINYTEXT 0-255 bytes 短文本字符串 短文本字符串
BLOB 0-65 535 bytes 二進制形式的長文本數據 二進制形式的長文本數據
TEXT 0-65 535 bytes 長文本數據 長文本數據
MEDIUMBLOB 0-16 777 215 bytes 二進制形式的中等長度文本數據 二進制形式的中等長度文本數據
MEDIUMTEXT 0-16 777 215 bytes 中等長度文本數據 中等長度文本數據
LONGBLOB 0-4 294 967 295 bytes 二進制形式的極大文本數據 二進制形式的極大文本數據
LONGTEXT 0-4 294 967 295 bytes 極大文本數據 極大文本數據
注意:
CHAR 屬於定長字符串,長度不可改變,未書寫長度用空格代替,但性能好
VARCHAR 屬於變長字符串,長度可變,但性能較差

日期類型

分類 類型 大小 範圍 格式 描述
日期類型 DATE 3 1000-01-01 至 9999-12-31 YYYY-MM-DD 日期值
TIME 3 -838:59:59 至 838:59:59 HH:MM:SS 時間值或持續時間 時間值或持續時間
YEAR 1 1901 至 2155 YYYY 年份值 年份值
DATETIME 8 1000-01-01 00:00:00 至 9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和時間值 混合日期和時間值
TIMESTAMP 4 1970-01-01 00:00:01 至 2038-01-19 03:14:07 YYYY-MM-DD HH:MM:SS 混合日期和時間值,時間戳 混合日期和時間值,時間戳

SQL語法

SQL語法分為多個部分,讓我們來逐步了解:

SQL通用語法

SQL通用語法適用於所有SQL語句中:

  • SQL語句可以單行或多行書寫,以分號結尾
  • SQL語句可以使用空格/縮進來增強語句的可讀性
  • MYSQL數據庫的SQL語句不區分大小寫,但關鍵字建議大寫
  • 注釋:#單行注釋,/**/多行注釋

SQL語句分類

SQL語句主要分為四種:

分類 全稱 說明
DDL Data Definition Language 數據定義語言,用來定義數據庫對象(數據庫,表,字段)
DML Data Manipulation Language 數據操作語言,用來對數據庫表中的數據進行增刪改
DQL Data Query Language 數據查詢語言,用來查詢數據庫中表的記錄
DCL Data Control Language 數據控制語言,用來創建數據庫用戶,控制數據庫的訪問權限

DDL講解

Data Definition Language:數據定義語言,用來定義數據庫對象(數據庫,表,字段) 。

  1. 庫操作:

查詢:

# 查詢所有數據庫
SHOW DATABASES;
# 查詢當前數據庫
SELECT DATABASE();

創建:

# 創建數據庫
CREATE DATABASE [IF NOT EXISTS] 數據庫名 [DEFAULT CHARSET 字符集] [COLLATE 排序規則];
/*
注意:
[IF NOT EXISTS]:當數據庫不存在時創建數據庫(防止重複創建)
*/

刪除:

# 刪除數據庫
DROP DATABASE [IF EXISTS] 數據庫名;
注意:
[IF EXISTS]:當數據庫存在時刪除數據庫(防止出錯)
*/

使用:

# 使用/轉換數據庫
USE 數據庫名;
  1. 表操作:

創建:

# 創建表
CREATE TABLE 表名(
	字段1 字段1類型[COMMENT 字段1注釋],
    字段2 字段2類型[COMMENT 字段2注釋],
    字段3 字段3類型[COMMENT 字段3注釋],
    字段4 字段4類型[COMMENT 字段4注釋]
)[COMMENT 表注釋];
/*
注意:
數據之間用「,」隔開,最後一個沒有「,」
*/

查詢:

# 查詢表
SHOW TABLES;

查詢表結構:

# 查詢表結構
DESC 表名;

查詢指定表的創表語句:

# 查詢指定表的創表語句
SHOW CREATE TABLE 表名;

添加字段:

# 添加字段
ALTER TABLE 表名 ADD 字段名 類型(長度) [COMMENT 注釋][約束];

修改數據類型:

# 修改數據類型
ALTER TABLE 表名 MODIFY 字段名 新數據類型(長度);

修改字段名和字段類型:

# 修改字段名和字段類型
ALTER TABLE 表名 CHANGE 舊字段名 新字段名 類型(長度) [COMMENT 注釋][約束];

刪除字段:

# 刪除字段
ALTER TABLE 表名 DROP 字段名;

修改表名:

# 修改表名
ALTER TABLE 表名 RENAME TO 新表名;

刪除表:

# 刪除表
DROP TABLE[IF EXISTS] 表名;
# 刪除表並重建該表
TRUNCATE TABLE 表名;
/*
注意:
無論哪種方法,裏面數據都會被全部刪除
*/
  1. 案例展示:

設計一張員工信息表,要求如下:

  • 編號(純數字)
  • 員工工號(字符串,長度不超過10)
  • 員工姓名(字符串,長度不超過10)
  • 性別(男/女,存放一個字)
  • 年齡(正常人年齡,沒有負數)
  • 身份證號(二代身份證均為18位,且包含X)
  • 入職時間(年月日即可)

代碼展示:

create table emp(
    id int comment "編號",
    empid varchar(10) comment "員工工號",
    empname varchar(10) comment "員工姓名",
    sex char(1) comment "性別",
    age tinyint unsigned comment "年齡",
    identify char(18) comment "身份證號",
    dateenter data comment "入職時間"
) comment "員工表";

DML講解

Data Manipulation Language:數據操作語言,用來對數據庫中表的數據記錄進行增、刪、改操作。

  • 增加數據(INSERT)
  • 修改數據(UPDATE)
  • 刪除數據(DELETE)
  1. 增加數據:
# 給指定字段增加數據
INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);
# 給全部字段增加數據
INSERT INTO 表名 VALUES (值1, 值2, ...);
# 批量增加數據
INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...),(值1, 值2, ...);
INSERT INTO 表名 VALUES (值1, 值2, ...),(值1, 值2, ...);

注意:

  • 插入數據時,指定的字段順序需要和值的順序一一對應
  • 字符串和日期數據應包含在引號中
  • 插入的數據大小,應該在字段的規定範圍內
  1. 修改數據:
# 修改數據
UPDATE 表名 SET 字段1 = 值1,字段2 = 值2,....[WHERE 條件];
/*
條件例如: id=1,sex='女'
*/

注意:

  • 修改語句的條件可以有可以沒有,若沒有條件,修改整張表
  1. 刪除數據:
# 刪除數據
DELETE FROM 表名 [WHERER 條件];
/*
條件例如: id=1,sex='女'
*/

注意:

  • 刪除語句的條件可以有可以沒有,若沒有條件,刪除整張表
  • DELETE不能特定刪除某一個字段,如有需要採用UPDATE使該值為NULL

DQL講解

Data Query Language:數據查詢語言,用來查詢數據庫中表的記錄。

  • 查詢關鍵字: SELECT

首先我們給出DQL的整體語法:

SELECT
字段列表
FROM
表名列表
WHERE
條件列表
GROUP BY
分組字段列表
HAVING
分組後條件列表
ORDER BY
排序字段列表
LIMIT
分頁參數

接下來我們將一一講解上述語法

  1. 基本查詢:
# 查詢多個字段
SELECT 字段1,字段2,字段3,... FROM 表名;

# 查詢所有字段
SELECT * FROM 表名;

# 查詢時設置別名(在查詢結果中的最上方類別會變成別名),AS可省略
SELECT 字段1 AS '別名'...FROM 表名;

# 去除重複記錄(去除相同元素)
SELECT DISTINCT 字段列表 FROM 列表;
  1. 條件查詢:
# 條件查詢語法:
SELECT 字段列表 FROM 表名 WHERE 列表條件;

比較運算符列表條件:

比較運算符 功能
> 大於
>= 大於等於
< 小於
<= 小於等於
<> 或 != 等於
BETWEEN…AND… 不等於
IN(…) 在某個範圍之內(包含最大值和最小值)
LIKE 佔位符 在in之後的列表中,多選一
IS NULL 是NULL

邏輯運算符列表條件:

邏輯運算符 功能
AND 或 && 並且(多個條件同時成立)
OR 或 || 或者(多個條件單個成立)
NOT 或 ! 非,不是
  1. 分組查詢:

分組查詢常常和聚合函數一同使用,所以我們先來講解一下聚合函數

介紹:

  • 聚合函數是指將一列數據作為一個整體,進行縱向計算

語法:

SELECT 聚合函數(字段列表) FROM 表名;

常見聚合函數:

函數 功能
count 統計數量
max 最大值
min 最小值
avg 平均值
sum 總和

介紹完聚合函數,我們來講解分組查詢:

# 分組查詢
SELECT 字段列表 FROM 表名[WHERE 條件] GROUP BY 分組字段名[HAVING 分組後過濾條件];

這裡講解一下WHERE和HAVING的區別:

  • WHERE 和 HAVING 都是過濾條件,但過濾的時機不同
  • WHERE:在分組之前進行過濾,被過濾掉的數據不參與分組
  • HAVING:在分組之後對結果進行過濾,可以對聚合函數進行過濾

注意:

  • 執行順序:WHERE > 聚合函數 > HAVING
  • 分組之後,查詢的字段一般為聚合函數和分組字段,查詢其他字段沒有意義!
  1. 排序查詢:
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排列方式1,字段2 排列方式2 ...;

排列方式只有兩種:

  • ASC:升序(默認,可不寫)
  • DESC:降序

注意:

  • 若為多字段排序,僅當第一個字段相同時,才會根據第二個字段進行排序
  1. 分頁查詢:

我們在網頁中經常看到的翻頁操作中的當前頁面內容就是通過分頁查詢做到的:

SELECT 字段列表 FROM 表名 LIMIT 起始索引,查詢記錄數;

注意:

  • 起始索引從0開始,起始索引 = (查詢頁碼-1)*每頁顯示記錄數
  • 分頁查詢是數據庫的方言,不同的數據庫有不同的實現方法(MYSQL中是LIMIT)
  • 如果查詢的是第一頁數據,起始索引可以省略,直接寫查詢記錄數即可
  1. 執行順序:

在上面我們已經介紹了DQL的所有語法,下面我們將給出DQL的執行順序:

FROM
表名列表

WHERE
條件列表

GROUP BY
分組字段列表
HAVING
分組後條件列表

SELECT
字段列表

ORDER BY
排序字段列表

LIMIT
分頁參數

DCL講解

Data Control Language:數據控制語言,用來管理數據庫用戶、控制數據庫的訪問權限。

  1. 管理用戶:

管理用戶主要是針對用戶的操作,我們分為四小部分講解:

  • 查詢用戶:
# 我們在MYSQL中存在mysql數據庫,在庫中存在user表,我們的用戶都存儲在裏面
USE mysql;
SELECT * FROM user;
  • 創建用戶:
# 創建用戶
CREATE USER '用戶名'@'主機名' IDENTIFIED BY '密碼';
/*
用戶名可以隨機定義
主機名分為 localhost本機 和 %任意機型
*/
  • 修改用戶密碼:
ALTER USER '用戶名'@'主機名' IDENTIFIED WITH mysql_native_password BY '新密碼';
  • 刪除用戶:
DROP USER '用戶名'@'主機名';

注意:

  • 主機名可以使用%通配
  • 這類SQL開發人員操作較少,主要由DBA(數據庫管理員)使用
  1. 權限控制:

我們所創建的用戶在開始時只有連接數據庫的權限,所以其他權限都需要我們去控制

但是在了解如何控制權限之前,我們需要先來了解數據庫都具備什麼權限:

權限 說明
ALL 所有權限
SELECT 查詢數據權限
INSERT 插入數據權限
UPDATE 修改數據權限
DELETE 刪除數據權限
ALTER 修改表權限
DROP 刪除表權限
CREATE 創建數據庫/表

好的,接下來讓我們來講解權限控制語句:

  • 查詢權限:
# 查詢該用戶的權限
SHOW GRANTS FOR '用戶名'@'主機名';
  • 授予權限:
# 授予該用戶權限
GRANT 權限列表 ON 數據庫名.表名 TO '用戶名'@'主機名';
  • 撤銷權限:
REVOKE 權限列表 ON 數據庫名.表名 FROM '用戶名'@'主機名';

注意:

  • 多個權限之間用逗號隔開
  • 授權時,數據庫名和表名可以採用*進行通配,代表所有

函數

函數:

  • 是指一段可以直接被另一段程序調用的程序或代碼。

函數大致被分為四種:

  • 字符串函數
  • 數值函數
  • 日期函數
  • 流程函數

函數的統一測試標準:

  • SELECT 函數(函數參數)

字符串函數

函數 功能
CONCAT(S1,S2,….Sn) 字符串拼接,將s1,s2,…sn拼接在一起
LOWER(str) 將字符串str全部轉化為小寫
UPPER(str) 將字符串str全部轉化為大寫
LPAD(str,n,pad) 左填充,用字符串pad將str填充為長度為n的字符串
RPAD(str,n,pad) 右填充,用字符串pad將str填充為長度為n的字符串
TRIM(str) 去除字符串頭部和尾部的空格
SUBSTRING(str,start,len) 返回從字符串str從start位置起的len個長度的字符串

數值函數

函數 功能
CELL(x) 對x向上取整
FLOOR(x) 對x向下取整
MOD(x,y) 返回x/y的余
RAND() 返回0~1之間的隨機數,可以採用乘法增大範圍
ROUND(x,y) 求參數x的四捨五入的值,保留y位小數

日期函數

函數 功能
CURDATE() 返回當前日期
CURTIME() 返回當前時間
NOW() 返回當前日期和時間
YEAR(date) 獲得指定date的年份
MONTH(date) 獲得指定date的月份
DAY(date) 獲得指定date的日期
DATE_ADD(date,INTEVAL expr type) 返回一個日期加上一個時間間隔expr後的時間值
DATEDIFF(date1,date2) 返回起始時間date1和結束時間date2之間的天數

流程函數

函數 功能
IF(value,t,f) 如果value為true,返回t,否則返回f
IFNULL(value1,value2) 如果value1不為空,返回value1,否則返回value2
CASE WHEN [val1] THEN [res1] … ELSE [dafault] END 如果val1為true,則返回res1,… 否則返回default默認值(可存在多個WHEN THEN)
CASE [expr] WHEN [val1] THEN [res1] … ELSE [default] END 如果expr的值等於val1,返回res1, … 否則返回default的默認值(可存在多個WHEN THEN)

約束

概念:

  • 約束是作用於表中字段上的規則,用來限制存儲在表中的數據

目的:

  • 保證數據庫中的數據的正確,有效性和完整性

約束類型

約束 描述 關鍵字
非空約束 限制該字段的數據不能為NULL NOT NULL
唯一約束 保證該字段的所有數據均為唯一 UNIQUE
主鍵約束 主鍵是一行數據的唯一標識,要求非空且唯一 PRIMARY KEY
默認約束 保存數據時,若未指定該字段的值,則採用默認值 DEFAULT
檢查約束 保證字段值滿足某一條件 CHECK
外鍵約束 讓兩張表建立連接,保證數據的一致性和完整性 FOREIGN KEY

注意:

  • 約束是作用於表中字段上的,可以在創建表/修改表的時候加上約束

外鍵綁定

定義:

  • 用來讓兩張表的數據之間建立連接,從而保證數據的一致性和完整性。

添加外鍵:

-- 創建表時添加外鍵
CREATE TABLE 表名(
	字段名 數據類型,
	...
	[CONSTRAINT] [外鍵名稱] FOREIGN (外鍵字段名) REFERENCES 主表(主表列名)
);

-- 外部修改時添加外鍵
ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵字段名) REFERENCES 主表(主表列名);

刪除外鍵:

ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱;

外鍵約束

外鍵同樣也具有約束條件:

行為 說明
NO ACTION 當在父表中刪除/更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則不允許刪除/更新。 (與 RESTRICT 一致) 默認行為
RESTRICT 當在父表中刪除/更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則不允許刪除/更新。 (與 NO ACTION 一致) 默認行為
CASCADE 當在父表中刪除/更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有,則 也刪除/更新外鍵在子表中的記錄。
SET NULL 當在父表中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則設置子表 中該外鍵值為null(這就要求該外鍵允許取null)。
SET DEFAULT 父表有變更時,子表將外鍵列設置成一個默認的值 (Innodb不支持)

外鍵約束條件修改代碼:

ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵字段) REFERENCES 主表名(主表字段名)
	ON UPDATE 修改時行為 ON DELETE 刪除時行為

多表查詢

多表關係概述:

  • 在項目開發中,在進行數據庫表的結構設計時,會根據業務需求以及業務模塊之間的關係,分析並設計表結構,由於業務之間相互關聯,所有各個表之間也存在着各種聯繫

表與表的關係大致分為三種:

  • 一對多
    • 關係:一個部門對應多個員工,一個員工對應一個部門
    • 實現:在多的一方建立外鍵,指向一的一方的主鍵
  • 多對多
    • 關係:一個學生選擇多個課程,一個課程有多個學生選擇
    • 實現:建立第三張中間表,中間表至少包含兩個外鍵,分別關聯兩方主鍵
  • 一對一
    • 關係:一對一關係常用於單表內容過多,進行拆分使用
    • 實現:在任意一方加入外鍵,關聯另外一方的主鍵,並且設置外鍵為唯一的(UNIQUE)

多表查詢概述:

  • 指從多張表中查詢數據
  • 當我們同時查詢兩張表時,會出現笛卡爾積現象,我們的目的就是消除多餘的笛卡爾積

多表查詢分為以下幾種:

  • 內連接
  • 外連接
  • 自連接
  • 聯合查詢
  • 子查詢

內連接

內連接查詢的是兩張表交集的部分

-- 隱式內連接
SELECT 字段列表 FROM 表1,表2 WHERE 連接條件...;

-- 顯式內連接
SELECT 字段列表 FROM [INNER] JOIN 表2 ON 連接條件...;

外連接

外連接查詢一方的所有內容和所需要查詢的另一方內容

-- 左連接:包含左表A的所有內容和左表和右表的交集部分的數據
SELECT 字段列表 FROM 表A LEFT [OUTER] JOIN 表B ON 條件...;

-- 右連接:包含右表B的所有內容和左表和右表的交集部分的數據
SELECT 字段列表 FROM 表A RIGHT [OUTER] JOIN 表B ON 條件...;

自連接

自連接負責查詢自我內容

-- 只有一張表,但注意需要有不同的別名,負責進行比較和篩選
SELECT 字段列表 FROM 表A 別名A JOIN 表A 別名B ON 條件...;

聯合查詢

聯合查詢負責把兩個查詢內容結合起來

SELECT 字段列表 FROM 表A...
UNION [ALL]
SELECT 字段列表 FROM 表B...;

注意:

  • 對於聯合查詢的多張表的列數必須保持一致,字段類型也需要保持一致
  • UNION ALL會將所有內容都合併在一起,UNION會對合併的內容進行數據去重

子查詢

概念:

  • SQL語句中嵌套SELECT語句,稱為嵌套語句,也被稱為子查詢
SELECT * FROM T1 WHERE column1 = (SELECT column1 FROM T2)
  • T1,T2分別表示兩個表

  • column表示表中的元素,進行比較

  • 子查詢外部的語句可以是INSERT/DELETE/SELECT語句中的任意一個

子查詢可以大概分為四種:

  • 標準子查詢
  • 列子查詢
  • 行子查詢
  • 表子查詢

標準子查詢

概念:

  • 子查詢返回的結果是單個值(數字、字符串、日期等),最簡單的形式,這種子查詢稱為標量子查詢。

常用操作符:

  • = <> > >= < <=

列子查詢

概念:

  • 子查詢返回的結果是一列(可以是多行),這種子查詢稱為列子查詢。

常用操作符:

  • IN 、NOT IN 、 ANY 、SOME 、 ALL

操作符解釋:

操作符 描述
IN 在指定的集合範圍之內,多選一
NOT IN 不在指定的集合範圍之內
ANY 子查詢返回列表中,有任意一個滿足即可
SOME 子查詢返回列表中,有任意一個滿足即可
ALL 子查詢返回列表的所有值都必須滿足

行子查詢

概念:

  • 子查詢返回的結果是一行(可以是多列),這種子查詢被稱為行子查詢

常用操作符:

  • = 、<> 、IN 、NOT IN

表子查詢

概念:

  • 子查詢返回的結果是多行多列,這種子查詢稱為表子查詢

常用操作符:

  • IN

事務

定義:

  • 事務是一組操作的集合,它是一個不可分割的工作單位,事務會把所有的操作都作為一個整體一起向系統提交或撤銷操作請求,即這些操作要麼同時成功,要麼同時失敗

注意:

  • 默認MYSQL的事務是自動提交的,也就是說每執行一條DML語句,MYSQL就會立即隱式的提交事務

事務操作

事務操作分為幾個部分:

  • 查看事務提交方法
-- 查看事務提交方法
SELECT @@autocommit
-- 自動:1
-- 手動:0
-- 系統設置為1自動提交
  • 設置事務提交方法
-- 設置事務提交方法
SET @@autocommit = 0/1;
-- 我們可以設置為0(因為默認為1)
-- 在設置為0後,後續操作不會影響數據,必須手動提交
  • 開啟事務
-- 開啟事務
START TRANSACTION 或 BEGIN
--效果和@@autocommit = 0一樣
  • 提交事務
-- 當數據無法自動提交或開啟事務後,我們需要手動提交,只有手動提交後,信息才會上傳
COMMIT
  • 回滾事務
-- 當事務中途出現錯誤(無法完全執行事務),我們常常採用回滾事務,讓全部回到事務進行前
ROLLBACK

事務四大特性

事務具有四大特性,被稱為ACID:

  • 原子性(Atomicity):事務是不可分割的最小操作單元,要麼全部成功,要麼全部失敗
  • 一致性(Consistency):事務完成時,必須使所有的數據都保持一致狀態
  • 隔離性(Isolation):數據庫系統提供的隔離機制,保證事務在不受外部並發操作影響的獨立環境下運行
  • 持久性(Durability):事務一旦提交或滾回,它對數據庫的改變就是永久的

並發事務問題

並發事務常常出現三種問題:

問題 描述
臟讀 一個事務讀到另外一個事務還沒有提交的數據
不可重複讀 一個事務先後讀取同一條記錄,但兩次讀取的數據不同,稱為不可重複讀
幻讀 一個事務按照條件查詢數據時,沒有對應的數據行,但在插入數據時,又發現該數據已經存在

事務隔離級別

事務隔離級別分為四種:

隔離級別 臟讀 不可重複讀 幻讀
Read uncommitted
Read committed ×
Repeatable Read(默認) × ×
Serializable × × ×

注意:

  • √:會發生

  • ×:不會發生

  • 性能:從上往下越來越差

  • 約束:從上往下越來越好

下面給出兩條代碼來查看和設置事務隔離級別:

-- 查看事務隔離級別
SELECT @@TRANSACTION_ISOLATION

-- 設置事務隔離級別
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL 
{Read uncommitted|Read committed|Repeatable Read|Serializable}
-- SESSION :僅針對當前事務
-- GLOBAL:針對所有事務

結束語

好的,關於MYSQL的基本內容就介紹到這裡,希望能為你帶來幫助!

附錄

我在之前學習過MYSQL,所以基礎篇基本沒有練習題和實例,

後面的進階篇我會詳細書寫每個例子包括練習,如果上面的內容有你不太明白的地方,這裡推薦跟着老師的課程學習

這篇文章是屬於學習筆記,主要是學習B站黑馬程序員鄧老師的MYSQL課程

下面為大家附上連接:黑馬程序員 MySQL數據庫入門到精通,從mysql安裝到mysql高級、mysql優化全囊括_嗶哩嗶哩_bilibili

Tags: