1. 資料庫基礎知識
1.1 關係型資料庫與非關係型資料庫
1.2 關係型資料庫的結構
庫 Database
庫,也稱資料庫,用於組織、儲存和管理資料
類比於資料夾
表 Table
表,是資料庫中基本的資料儲存單位,由行(Row)和列(Column)組成
類比於excel檔案
記錄 Record
記錄,是表中的一行的所有資料
例如:在一個訂單表中,每一條記錄可能代表一個訂單所有資訊,包含訂單號、訂單日期、訂單金額等。
表頭 Header
表頭,是表格中列的名稱
可以看作是資料的結構化資訊,幫助使用者理解和運算元據
表單 Form
嚴格來說不直接屬於資料庫結構的一部分,但表單是一種常用的介面元素,用於收集並展示資料。
表單可以用於輸入、修改或查詢資料庫中的資料。
表單通常包含多個欄位,每個欄位對應資料庫表中的一個列。使用者透過填寫表單並提交,可以將資料填寫到資料庫中或更新現有資料。
2. SQL語句基礎概念
2.1 SQL語句規範
SQL語句不區分大小寫,為了提高程式碼的可讀性,建議採用統一的書寫規範。
關鍵字大寫:SELECT, FROM, WHERE, JOIN。
表名、列名小寫,用雙引號括起來以確保大小寫的敏感性。
字串與日期:字串與日期型別的資料應使用單引號' '括起來,單詞之間用英文半形空格隔開。
SQL語句可單行或多行書寫,預設以英文半形分號 ; 結尾,關鍵詞不能跨多行
單行註釋:--或#
多行註釋:
/*
註釋內容
*/
2.2 SQL語句型別
根據用途,SQL語句可以分為幾種主要型別:
1. 資料查詢語言 (DQL Data Query Language)
用於從一個或多個表中檢索資料。
主要命令是 SELECT。
2. 資料定義語言 (DDL Data Definition Language)
用於定義或改變資料庫結構。
常用命令包括:
CREATE:建立資料庫、表、檢視等。
ALTER:修改現有資料庫物件的結構。
DROP:刪除資料庫物件。
TRUNCATE:清除表中的所有資料但保留表結構。
RENAME:重新命名資料庫物件(某些資料庫系統可能使用不同的語法)。
3. 資料操縱語言 (DML Data Manipulation Language)
用於新增、更新和刪除資料庫中的資料。
常用命令包括:
INSERT:向表中插入新記錄。
UPDATE:更新表中的現有記錄。
DELETE:從表中刪除記錄。
MERGE:在某些資料庫中,用於基於條件更新或插入資料。
4. 事務控制語言 (TCL Transaction Control Language)
用於管理事務,確保資料的一致性和完整性。
常用命令包括:
COMMIT:提交當前事務,使更改永久化。
ROLLBACK:撤銷當前事務,恢復到事務開始前的狀態。
SAVEPOINT:設定儲存點,允許部分回滾事務。
SET TRANSACTION:設定事務的特性(如只讀、隔離級別等)。
5. 資料控制語言 (DCL Data Control Language)
用於控制資料庫訪問許可權。
常用命令包括:
GRANT:授予使用者特定許可權。
REVOKE:撤銷使用者的特定許可權。
6. 其他命令
還有一些其他的命令不屬於上述分類,例如:
EXPLAIN:顯示查詢計劃,幫助最佳化查詢效能。
SHOW:顯示資料庫資訊,如表結構、索引等。
USE:選擇當前工作的資料庫。
BEGIN 或 START TRANSACTION:開始一個新的事務。
2.3 常用命令
3. SQL語句操作庫、表、資料
3.1 運算元據庫(資料夾級別)---對庫的增刪改查
[1]建立資料庫
方法一:create database 資料庫名稱;
方法二:create database if not exists 資料庫名稱;
--資料庫不存在則建立,存在則忽略
方法三:create database if not exists 資料庫名稱 charset 字元編碼名稱;
--latin1:西歐語言字符集
--utf8mb4(當前中文預設):完整的utf-8編碼,支援所有Unicode字元,包括表情符號,一個字元最多佔4個位元組
--gbk:簡體中文字符集
[2]檢視資料庫
系統自帶的資料庫:
檢視所有資料庫:
show databases;
模糊查詢,檢視名稱中包含指定字元的資料庫:
show databases like "%obj%";
檢視資料庫的建庫SQL語句:
show create database 資料庫名稱;
示例:
show create database test01;
show create database test02;
show create database test03;
[3]修改資料庫
修改資料庫預設的編碼集:
alter database 資料庫名稱 charset "utf8mb4";
舉例:將test03的字符集由gbk改為utf8mb4
[4]刪除資料庫
以下MySQL自帶的資料庫不能刪除
drop database [if exists] 資料庫名稱; --中括號裡的內容表示可選
3.2 運算元據庫中的表(檔案級別)---對錶的增刪改查
[1]操作表之前的操作:進入到指定庫、檢視所在的庫
use 庫名稱; --進入到指定庫
注意:進入到指定資料庫後無法退回到之前剛登入的狀態,但可以透過use進行切換
select database(); --檢視所在的庫
[2] 建立表
語法:
create table 表名(
列名1 資料型別[(最多字元個數)] [約束條件],
列名2 資料型別[(最多字元個數)] [約束條件],
...
列名n 資料型別[(最多字元個數)] [約束條件]
);
列名和資料型別必填,中括號裡的內容選填。
列名不可重複。
常見資料型別:
int:整數 括號內的引數預設為11,是顯示寬度,不影響儲存大小,不推薦使用
有符號 INT
位數: 32 位 4個位元組
最小值: -2,147,483,648 (-2^31)
最大值: 2,147,483,647 (2^31 - 1)
無符號 INT
位數: 32 位 4個位元組
最小值: 0
最大值: 4,294,967,295 (2^32 - 1)
varchar(n):變長字串,n是字串的最大長度 1~255,預設寬度為1,只能存1個字元
text:長文字
date:日期
datetime:日期和時間
decimal(m, n):小數,m是總位數,n是小數點後的位數
常見約束條件:
not null:不能為空值
primary key:主鍵,列(或列組合的)唯一標識,每個表可以有一個主鍵
unique:列的值必須唯一
default value:列的預設值
auto_increment:自增,通常用於主鍵,自動生成唯一的數字;一般與主鍵配合使用
check:檢查約束,確保列中的值滿足特定條件;MySQL 8.0.16之前的版本要使用觸發器才能實現check的約束功能
foreign key:外來鍵,用於在兩個表之間建立連線,確保參照完整性
主鍵寫法一:
create table product1(
id int auto_increment primary key,
name varchar(10) not null,
unique(name),
price decimal(10, 2),
stock int default 20
);
主鍵寫法二:
create table product2(
id int auto_increment,
name varchar(10) not null,
unique(name),
price decimal(10, 2),
stock int default 20,
primary key(id)
);
id是主鍵,且自增
name不允許為空,且必須唯一
price為小數
stock庫存為整型,預設值是20
[3]檢視錶
show tables; --檢視庫下所有的表
show create table 表名; --檢視建立表的SQL語句
檢視錶結構的兩種方法:
describe 表名;
desc 表名;
[4] 修改表
修改表中的列:
alter table 表名 modify 列名 資料型別;
--modify只能修改列的資料型別,不能修改列名
alter table 表名 change 原列名 新列名 資料型別;
--change既可以修改列的資料型別,又可以修改列名
修改表名:
alter table 原表名 rename 新表名;
新增列:
alter table 表名 add 列名 資料型別; --預設在表的結尾新增列
alter table 表名 add 列名 資料型別 after 指定列名; --在指定列的後面新增列
alter table 表名 add 列名 資料型別 first; --在列的最前面新增列
刪除表中的列:
alter table 表名 drop 列名;
[5] 刪除表
drop table 表名;
--執行該命令MySQL不會給出任何提示確認的資訊,一旦刪除無法恢復,建議先備份後刪除,或者重新命名錶代替刪除操作
[6] 以絕對路徑的形式操作不同的庫
create table test02.teacher(id int); --在test01庫中操作test02庫新建一個表
[7] 重置表資訊
TRUNCATE table 表名;
保留表的結構,將表的記錄以及表的狀態回滾
3.3 操作表中的資料---對資料的增刪改查
[1] 增加資料
增加一行資料:
insert into 表名 (列1, 列2, 列3, ...) values (值1, 值2, 值3, ...);
以上可以不向所有的列中都傳入資料,如果向所有列中傳入資料,可以簡寫為:insert into 表名 values (值1, 值2, 值3, ...);
增加多行資料:
insert into 表名 (列1, 列2, 列3, ...) values (值1, 值2, 值3, ...), (值1, 值2, 值3, ...), (值1, 值2, 值3, ...);
[2] 查詢資料
查詢表中全部資料:
select * from 表名;
檢視指定列的資料:
select 列1,列2,... from 表名;
[3] 修改資料
update 表名 set 列名=新值 where 篩選條件;
舉例:將name為toy的stock改為21
[4] 刪除資料
delete from 表名 where 篩選條件; ---會刪除所有符合條件的資料
刪除stock為60的一行資料(記錄):
delete from t1 where stock=60;
刪除id大於1的記錄:
delete from t1 where id>1;
4. 儲存引擎
4.1 概念
儲存引擎是用於處理不同表型別的資料儲存、索引、資料檢索的技術,不同的儲存引擎提供了不同的儲存機制、索引型別、鎖定級別和事務支援。
資料庫使用儲存引擎進行建立、查詢、更新和刪除資料等操作。
4.2 MySQL中常見的儲存引擎
[1]InnoDB
是MySQL5.5及以後版本的預設儲存引擎
支援事務處理、行級鎖定、外來鍵約束以及崩潰恢復等高階功能。
[2]MyISAM
是MySQL5.5以前版本的預設儲存引擎
不支援事務處理
插入資料速度較快
[3]MEMORY
MEMORY儲存引擎將資料儲存在記憶體中
訪問速度極快
資料在資料庫重啟後會丟失
[4]Blackhole
黑洞引擎,接受所有資料寫入請求,但不實際儲存任何資料
用於測試或主從複製配置中的日誌記錄
4.3 檢視所有引擎
show engines;
4.4 檢視不同儲存引擎儲存資料的異同
[1] 使用不同的儲存引擎建表
[2] 表的檔案
[3] 表檔案的作用
InnoDB:
.frm:儲存了表的定義資訊,包括列名、型別等。
.ibd:儲存表的資料和索引
MyISAM:
.frm:儲存了表的定義資訊,包括列名、型別等。
.MYD:儲存表的資料
.MYI:儲存表的索引
MEMORY:
.frm:儲存了表的定義資訊,包括列名、型別等。
沒有資料檔案,資料儲存在記憶體中,重啟資料庫後資料會丟失。
Blackhole :
.frm:儲存了表的定義資訊,包括列名、型別等。
[4] 表中依次存入資料
[5] 檢視資料
Blackhole儲存引擎建立的表中沒有存入資料
memory儲存引擎建立的表在資料庫重啟後資料丟失