關鍵字大小寫不敏感
查看表結構中的 desc = describe 描述
降序中的 desc = descend
1. 數據庫的操作
1. 創建數據庫
create database 數據庫名;
為防止創建的數據庫重復
CREATE DATABASE IF NOT EXISTS 數據庫名;
手動設置數據庫采用的字符集
character set 字符集名;charset 字符集名;
char : unicode
String : utf8mb4(推薦使用 utf8mb4,完整支持 Unicode,包括表情符號)
? ? ? ? ? ? utf8(殘本,不支持emoji表情符號)
指定數據庫字符集的校驗規則
collate 排序規則;
2. 查看數據庫
show databases ;
3. 選中要使用的數據庫
use 數據庫名;
4. 刪除數據庫
drop database 數據庫名;
1. 常用數據類型
一、數值類型
1. 整數類型
類型 | 字節 | 有符號范圍 | 無符號范圍 |
---|---|---|---|
TINYINT | 1 | -128 ~ 127 | 0 ~ 255 |
SMALLINT | 2 | -32,768 ~ 32,767 | 0 ~ 65,535 |
MEDIUMINT | 3 | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 |
INT/INTEGER | 4 | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 |
BIGINT | 8 | -2^63 ~ 2^63-1 | 0 ~ 2^64-1 |
2. 浮點數類型
類型 | 字節 | 說明 |
---|---|---|
FLOAT | 4 | 單精度浮點數,約7位精度 |
DOUBLE | 8 | 雙精度浮點數,約15位精度 |
3. 定點數類型
類型 | 說明 |
---|---|
DECIMAL(M,D) | 精確小數,M是總位數,D是小數位數 |
精度高,運算速度慢,占的空間大
二、字符串類型
1. 短文本
類型 | 最大長度 | 特點 |
---|---|---|
CHAR(n) | 255字符 | 固定長度,效率高 |
VARCHAR(n) | 65,535字節 | 可變長度,節省空間 |
n 表示該類型最多存儲多少個字符(不是字節),一個漢字算一個字符
2. 長文本
類型 | 最大長度 | 特點 |
---|---|---|
TINYTEXT | 255字節 | |
TEXT | 65,535字節 | |
MEDIUMTEXT | 16,777,215字節 | |
LONGTEXT | 4GB |
3. 二進制數據
類型 | 說明 |
---|---|
BINARY(n) | 固定長度二進制字符串 |
VARBINARY(n) | 可變長度二進制字符串 |
BLOB | 二進制大對象 |
文本數據存儲的都是字符,這些字符都可以在對應的碼表上查到
二進制數據:在碼表上查不到的如音樂,圖片,視頻
三、日期時間類型
數據類型 | 存儲大小 | 格式 | 范圍(最小值 ~ 最大值) |
---|---|---|---|
YEAR | 1字節 | YYYY | 1901 ~ 2155 |
DATE | 3字節 | YYYY-MM-DD | 1000-01-01 ~ 9999-12-31 |
TIME | 3字節 | HH:MM:SS | -838:59:59 ~ 838:59:59 |
DATETIME | 5字節 | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 |
TIMESTAMP | 4字節 | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC |
2. 表操作
1. 創建表
create table 表名(
列名 數據類型[約束條件],
列名 數據類型[約束條件],
...
);
2. 查看表結構
desc 表名;
int(11) 是四個字節,此處(11)表示顯示寬度,即顯示這個int類型時,最多占據11個字符的寬度(和存儲時的容量無關)。
3. 刪除表
drop table 表名;
刪除表的同時,表中的數據也一并刪除。
3. 表數據操作
1. 新增數據
值的個數和類型要和表結構匹配
? ?1.?單行數據 + 全列插入(即在表中插入一行數據)
insert into 表名 values (值1,值2,值3...);
insert into 表名 values (值1,值2,值3...),(值1,值2,值3...),(值1,值2,值3...),...;
insert into 表名 (列1,列2,...) values (值1,值2,...);
insert into 表名 (列1,列2,...) values (值1,值2,...),(值1,值2,...),...;
2. 查詢數據
mysql是一個“客戶端 - 服務器”結構的程序
客戶端在這里進行的操作,都會通過請求發送給服務器,服務器查詢的結果也會通過響應返回給客戶端(以臨時表的形式)
SQL 查詢的邏輯執行順序:
FROM 子句?- 確定數據來源
JOIN 子句?- 連接相關表
WHERE?- 行級過濾(此時不能使用SELECT中定義的別名)
GROUP BY?- 數據分組
HAVING?- 分組后過濾
SELECT?- 計算列表達式并選擇列
DISTINCT?關鍵字- 去重
ORDER BY?- 排序(可以使用SELECT中定義的別名)
LIMIT?/OFFSET- 結果集限制
SELECT [DISTINCT] 列1 [as 別名] , 列2 [as 別名], ...
FROM 表名
[WHERE 條件]
[GROUP BY 分組列]
[HAVING 分組條件]
[ORDER BY 排序列 [ASC|DESC]]
[LIMIT [偏移量,] 行數];
1. 全列查詢
select * from 表名;
如果數據庫當前這個表中的數據特別多,就可能會產生問題:
1. 讀取硬盤,把硬盤的IO給跑滿了,此時程序的其他部分想訪問硬盤,就會非常慢。
2. 操作網絡,也可能把網卡的帶寬跑滿,此時其他客戶端想通過網絡訪問服務器,也會非常慢
這樣的擁堵,就可能導致客戶端無法順利訪問到數據庫,進一步也就對整個服務器造成影響(相當于數據庫服務器掛了)
2. 指定列查詢
select 列1,列2,... from 表名;
3. 表達式查詢
是列與列之間的運算
select 表達式1,表達式2,... from 表名;
?4.?去重:DISTINCT
select distinct 列1,列2... from 表名;
5. 別名
列的別名不能在ORDER BY
中直接使用(在某些MySQL版本中)
SELECT [DISTINCT] 列1 [[as] 別名] , 列2 [[as] 別名], ... FROM 表名;
6. 排序:order by
select 列1,列2... from 表名order by 列名 [asc/desc],列名 [asc/desc]...;
3.?可以對多個字段進行排序,排序優先級隨書寫順序
7. 條件查詢:where
select 列名 from 表名 where 約束條件;
運算符 | 描述 |
---|---|
= | 等于, NULL 不安全,例如 NULL = NULL 的結果是 NULL |
<=> | 等于, NULL ?安全,例如 NULL <=> NULL 的結果是 TRUE(1) |
<> 或 != | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
BETWEEN a0 AND a1 | 范圍匹配, [a0, a1] ,如果 a0 <= value <= a1 ,返回 TRUE(1) |
IN(option,...) | 在指定值列表中,如果是 option 中的任意一個,返回 TRUE(1) |
LIKE | 模糊匹配,% 表示任意多個(包括 0 個)任意字符;_ 表示任意一個字符 |
IS NULL | 是空值 |
IS NOT NULL | 不是空值 |
SELECT * FROM 表名 WHERE 列名 LIKE '模式';
% 表示任意多個(包括 0 個)任意字符;
_ 表示任意一個字符

AND的優先級高于OR,在同時使用時,需要使用小括號()包裹優先執行的部分
?8. 分頁查詢
始終結合?ORDER BY
?使用分頁,否則結果順序不確定
select 列名 from 表名 limit 每頁記錄數 offset 偏移量;select 列名 from 表名 limit 偏移量, 每頁記錄數;
當前頁碼(page)和每頁大小(pageSize)
偏移量(offset) = (page - 1) * pageSize
每頁記錄數 = pageSize
3. 修改數據
UPDATE 表名
SET 列名1 = 值1, 列名2 = 值2, ...
[WHERE 條件]
[ORDER BY 列名]
[LIMIT 行數];
將名字為null改為信陽毛尖
怎樣查看警告:
show warnings;
4. 刪除數據
DELETE FROM 表名?
[WHERE 條件]
[ORDER BY 列名]
[LIMIT 行數];
delete from 表名;
如果刪除數據時不加任何約束條件,則將整個表中的數據全部刪除,只留空表。
在修改和刪除數據中,limit 行數;?表示共刪除或修改幾行。
4. 數據庫約束
在創建表時使用
約束類型:NOT NULL - 指示某列不能存儲 NULL 值。UNIQUE - 保證某列的每行必須有唯一的值。DEFAULT - 規定沒有給列賦值時的默認值。PRIMARY KEY - NOT NULL 和 UNIQUE 的結合。確保某列(或兩個列多個列的結合)有唯一標識,有助于更容易更快速地找到表中的一個特定的記錄。FOREIGN KEY - 保證一個表中的數據匹配另一個表中的值的參照完整性。CHECK - 保證列中的值符合指定的條件。
1.?非空約束 (NOT NULL)
作用:確保列不能包含NULL值
特點:
-
強制字段必須有值
-
可以在ALTER TABLE時添加或刪除

2.??唯一約束 (UNIQUE)
作用:確保列中的值唯一
特點:
-
允許NULL值(但只能有一個NULL)
-
一個表可以有多個唯一約束
-
自動創建非聚集索引
3.? 默認約束 (DEFAULT)
作用:當插入數據未指定值時提供默認值,默認情況下為null.
特點:
-
可以是常量值或表達式
-
適用于INSERT和UPDATE操作
4. 主鍵約束 (PRIMARY KEY)
作用:唯一標識表中的每一行記錄,確保實體完整性
特點:
-
不允許NULL值
-
不允許重復值
-
一個表只能有一個主鍵
-
自動創建聚集索引
5. 外鍵約束 (FOREIGN KEY)
作用:維護表之間的引用完整性
特點:
-
確保一個表的值必須在另一個表中存在
-
可以定義級聯操作
-
引用列必須是主鍵或唯一鍵
父表:約束別人的表
子表:被別人約束的表
CREATE TABLE 子表名 (列定義...,[CONSTRAINT 約束名] FOREIGN KEY (外鍵列) REFERENCES 主表名(主表列)[ON DELETE 參照動作][ON UPDATE 參照動作]
);
外鍵約束動作
當主表數據被刪除或更新時,可以指定子表數據的處理方式:
動作 | 描述 |
---|---|
RESTRICT | (默認)拒絕主表的刪除或更新操作 |
CASCADE | 級聯操作,主表刪除/更新時,子表對應記錄也刪除/更新 |
SET NULL | 主表刪除/更新時,子表對應外鍵列設為NULL(需允許NULL) |
NO ACTION | 類似RESTRICT |
SET DEFAULT | 設為默認值(MySQL目前不支持) |
針對父表的 刪除/修改 操作,如果當前被 刪除/修改 的值,已經被子表引用了,則無法進行此操作
外鍵約束要始終保持,子表中的數據在對應的父表的列中要存在。
如果父表不存在,子表添加元素時無參考依據
指定外鍵約束,時,父表中被關聯的一列必須為主鍵或unique。
邏輯刪除:
如果要刪除與子表關聯的父表元素,我們可以多設置一列進行條件約束。
6. 檢查約束 (CHECK)
作用:確保列值滿足指定條件
特點:
-
MySQL 8.0.16+ 完全支持
-
可以引用多列
-
條件不滿足時拒絕操作
7. 自增約束 (AUTO_INCREMENT)
作用:自動為列生成唯一遞增整數值(會自動排序),必須作用與鍵
特點:
-
通常用于主鍵
-
每張表只能有一個自增列
-
默認從1開始,每次增加1
-
支持整數類型(INT, SMALLINT, BIGINT等)
-
自增列不保證連續:刪除記錄后,自增值不會重用