主頁 > 資料庫 > MYSQL(基本篇)——一篇文章帶你走進MYSQL的奇妙世界

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

2022-07-31 07:43:17 資料庫

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

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/500662.html

標籤:MySQL

上一篇:解決資料庫報錯Error 1390: Prepared statement contains too many placeholders的問題

下一篇:解決資料庫報錯Error 1390: Prepared statement contains too many placeholders的問題

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more