書接上回:MySQL數據庫開發教學(一) 基本架構-CSDN博客
建議工具:
Navicat Premium (收費 / 需破解):Navicat Premium | 管理和开发你的数据库
phpstudy 2018 (免費):phpStudy - Windows 一键部署 PHP 开发环境 · 小皮出品
前言
大家好,我是小楓。上期跟大家說完MySQL數據庫的基本架構,那麼這期小編就會帶大家了解一下MySQL中有哪些重要指令和一些重要概念,以及其作用吧。廢話不多說,我們開始吧。
註:以下所說的命令無論在cmd黑窗口或navicat premium上都是一樣的,請大家一定要看過前一篇(數據類型)後再往下看,不然可能會看不懂。

目录
[一、主鍵(Primary Key)](#一、主鍵(Primary Key))
[1.1 主鍵約束的特性](#1.1 主鍵約束的特性)
[1.2 實際應用](#1.2 實際應用)
[二、外鍵(Foreign Key)](#二、外鍵(Foreign Key))
[2.1 外鍵的作用](#2.1 外鍵的作用)
[2.2 外鍵約束類型](#2.2 外鍵約束類型)
[3.1 索引類型](#3.1 索引類型)
[3.2 索引的優缺點](#3.2 索引的優缺點)
[5.1 四大分類](#5.1 四大分類)
[5.2 必背基礎命令](#5.2 必背基礎命令)
[5.3 DDL(數據定義語言)](#5.3 DDL(數據定義語言))
[5.3.1 數據庫操作](#5.3.1 數據庫操作)
[5.3.2 表格操作](#5.3.2 表格操作)
[5.4 DML(數據操縱語言)](#5.4 DML(數據操縱語言))
[5.4.1 INSERT - 插入數據](#5.4.1 INSERT - 插入數據)
[5.4.2 UPDATE - 更改數據](#5.4.2 UPDATE - 更改數據)
[5.4.3 DELETE - 刪除數據](#5.4.3 DELETE - 刪除數據)
[5.5 DQL(數據查詢語言)](#5.5 DQL(數據查詢語言))
[5.5.1 基礎查詢](#5.5.1 基礎查詢)
[5.5.2 條件查詢](#5.5.2 條件查詢)
[5.5.3 模糊查詢](#5.5.3 模糊查詢)
[5.5.4 聚合查詢](#5.5.4 聚合查詢)
[5.5.5 排序查詢](#5.5.5 排序查詢)
[5.5.6 分組查詢](#5.5.6 分組查詢)
[5.5.7 分頁查詢](#5.5.7 分頁查詢)
[6.1 一對一關係](#6.1 一對一關係)
[6.2 一對多關係](#6.2 一對多關係)
[6.3 多對多關係](#6.3 多對多關係)
[6.3.1 外鍵設置實務](#6.3.1 外鍵設置實務)
[7.1 UNION合併查詢](#7.1 UNION合併查詢)
[7.2 GROUP_CONCAT函數](#7.2 GROUP_CONCAT函數)
[7.3 字符集處理](#7.3 字符集處理)
一、主鍵(Primary Key)
主鍵是資料庫表中用來唯一識別每一筆記錄的一列或多列組合。主鍵的作用是確保表中的每一筆記錄都有一個獨特的識別標誌,類似於身分證號碼的概念。主鍵的設置是資料庫設計中的基本要求,通常作為記錄的第一列出現。
1.1 主鍵約束的特性
-
唯一性:主鍵列的每一個值都必須是唯一的,不能有重複值。
-
非空性:主鍵列不能包含NULL值,必須始終有值。
-
不可變性:主鍵值一旦設定,不應該隨時間改變。
1.2 實際應用
在實際資料庫設計中,主鍵通常採用以下幾種形式:
單一欄位主鍵:使用一個欄位作為主鍵,最常見的是ID欄位
複合主鍵:使用多個欄位組合作為主鍵,當單一欄位無法確保唯一性時使用
sql
-- 創建帶有主鍵的表格
CREATE TABLE users (
id INT PRIMARY KEY, #創建並設id為主鍵並規定數據類型為數字
name VARCHAR(50) NOT NULL, #創建字段name並規定數據類型為少於50個任意字符
email VARCHAR(100) #創建字段email並規定數據類型為少於100個任意字符
);
二、外鍵(Foreign Key)
外鍵是建立表與表之間關聯的機制,它指向另一張表的主鍵。外鍵約束用來維護資料庫表之間數據一致性和完整性,確保數據的關聯性不會被破壞。
2.1 外鍵的作用
-
保持數據一致性:確保外鍵值必須存在於被參考表的主鍵中
-
維護引用完整性:防止意外刪除或修改被參考的數據
-
建立表關係:明確表與表之間的關聯方式
2.2 外鍵約束類型
RESTRICT:拒絕刪除或更新主鍵
CASCADE:同步刪除或更新外鍵
SET NULL:將外鍵設為NULL
NO ACTION:不採取任何動作
sql
-- 創建帶有外鍵的表格
CREATE TABLE orders (
order_id INT PRIMARY KEY, #創建並設order_id為主鍵並規定數據類型為數字
user_id INT, #創建字段user_id並規定數據類型為數字
order_date DATE, #創建字段order_date並規定數據類型為日期
FOREIGN KEY (user_id) REFERENCES users(id) #設user_id為外鍵,數據引用自users表中的id列
);
三、索引(Index)
索引是資料庫中用來加速數據檢索的數據結構,類似於書籍的目錄。它能夠幫助資料庫系統快速定位到所需的數據,而不需要逐行掃描整個表格。
3.1 索引類型
-
普通索引(INDEX):最基本的索引類型,允許重複值和NULL值
-
唯一索引(UNIQUE):不允許重複值,但允許NULL值
-
主索引(PRIMARY KEY):特殊的唯一索引,不允許NULL值
-
全文索引(FULLTEXT):用於全文搜尋
3.2 索引的優缺點
優點:
大幅提高查詢速度
加速表與表之間的連接
缺點:
佔用額外儲存空間
降低數據新增、修改、刪除的速度
sql
-- 創建索引
CREATE INDEX idx_name ON users(name);
-- 創建唯一索引
CREATE UNIQUE INDEX idx_email ON users(email);
=> 不是很重要,大家知道就好了
四、特殊欄位屬性
AUTO_INCREMENT:自動遞增,常用於主鍵欄位
NULL/NOT NULL:控制欄位是否允許空值
DEFAULT:設定欄位預設值
sql
-- 使用特殊屬性的範例
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT, #自動遞增,即1234567...
name VARCHAR(100) NOT NULL, #不可為空,為空則報錯
price DECIMAL(10,2) DEFAULT 0.00, #若沒有數據則默認為0.00
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP #同上,上一篇講了格式大家可以稍微去看一下
);
五、SQL結構化查詢語言

以下指令將以此表為例作說明,途中數據會更改,不用太較真哈
5.1 四大分類
-
數據定義語言(DDL)
-
用於創建和修改資料庫對象結構
-
主要指令:CREATE、ALTER、DROP
-
-
數據操縱語言(DML)
-
用於對資料庫中的數據進行新增、修改、刪除
-
主要指令:INSERT、UPDATE、DELETE
-
-
數據查詢語言(DQL)
-
用於查詢數據庫中的數據
-
主要指令:SELECT
-
-
數據控制語言(DCL)
-
用於控制用戶對數據的訪問權限
-
主要指令:GRANT、REVOKE
-
5.2 必背基礎命令
sql
-- 查看所有資料庫
SHOW DATABASES;
-- 設置編碼
CHARSET gbk; -- 也可以是utf8或utf8mb4
-- 切換資料庫
USE <database_name>;
-- 查看當前所選資料庫
SELECT DATABASE();
-- 查看當前資料庫所有表格
SHOW TABLES;
-- 查看表格結構
DESC <table_name>;
-- 查看表格數據
SELECT * FROM <table_name>; # *=全部,select * = 展示全部
5.3 DDL(數據定義語言)
5.3.1 數據庫操作
sql
-- 創建資料庫
CREATE DATABASE <db_name>;
-- 判斷是否存在後創建
CREATE DATABASE IF NOT EXISTS <db_name>;
-- 指定字符集創建資料庫
CREATE DATABASE <db_name> CHARACTER SET utf8mb4; # 用gbk可顯示中文
-- 修改資料庫字符集
ALTER DATABASE <db_name> CHARACTER SET utf8mb4;
5.3.2 表格操作
sql
-- 創建表格
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
price DOUBLE,
brand VARCHAR(20),
stock INT,
insert_time DATE
);
-- 查看表格結構
DESC products;
5.4 DML(數據操縱語言)
5.4.1 INSERT - 插入數據
sql
-- 完整寫法
INSERT INTO <table_name(表名)> (column1, column2, column3, ...)(字段)
VALUES (value1, value2, value3, ...);(對應字段的值)
-- 省略欄位名寫法(需提供所有欄位值)
INSERT INTO <table_name> #column略寫=選擇全部column
VALUES (value1, value2, value3, ...);
-- 多筆數據插入
INSERT INTO <table_name> (column1, column2)
VALUES (value1, value2),
(value3, value4),
(value5, value6);
5.4.2 UPDATE - 更改數據
sql
-- 更改特定條件的數據
UPDATE <table_name>
SET <column1> = <value1>, <column2> = <value2>, ...
WHERE <condition(條件)>;
-- 範例:將id為1的產品價格改為1999
UPDATE products
SET price = 1999
WHERE id = 1; #當id=1時,price改成1999
5.4.3 DELETE - 刪除數據
sql
-- 刪除特定條件的數據
DELETE FROM <table_name> WHERE <condition(條件)>;
-- 範例:刪除id為5的產品
DELETE FROM products WHERE id = 5;
重要 :++UPDATE和DELETE操作必須加上WHERE條件,否則會影響所有數據記錄++。
5.5 DQL(數據查詢語言)
5.5.1 基礎查詢
sql
-- 查詢特定欄位
SELECT <column1(字段名)>, <column2> FROM <table_name(表名)>;
-- 查詢所有欄位
SELECT * FROM <table_name>;
-- 使用別名
SELECT <column_name> AS <alias_name(別名)> FROM <table_name>; #但where 條件還是要寫全名


5.5.2 條件查詢
sql
-- 基礎條件查詢
SELECT <column1>, <column2(字段名>
FROM <table_name(表名)>
WHERE <condition(條件)>;
-- 比較運算符
SELECT * FROM products WHERE price > 9000;
-- BETWEEN範圍查詢
SELECT * FROM products WHERE price BETWEEN 4999 AND 10000; #即4999<=price and 10000>=price
-- IN條件查詢
SELECT * FROM products WHERE stock IN (20, 59); #即or,查詢stock=20 或 stock=59的數據
-- NULL(為空)值檢查
SELECT * FROM products WHERE brand IS NULL;
SELECT * FROM products WHERE brand IS NOT NULL;
5.5.3 模糊查詢
sql
-- % 匹配0個或多個字符
SELECT * FROM products WHERE name LIKE '小米%';
-- _ 匹配單個字符
SELECT * FROM products WHERE name LIKE '小米_機';

5.5.4 聚合查詢
sql
-- 計算記錄數量
SELECT COUNT(*) FROM products; # 計算記錄的數量
SELECT COUNT(name) FROM products; #計算name字段中的數據數量 -- 不計算NULL值
-- 最大值、最小值
SELECT MAX(price), name FROM products; #max(price),name = 查看price的最大值及該產品名字
SELECT MIN(price) FROM products; #min(price),即最小,跟上面差不多
-- 求和、平均值
SELECT SUM(price) FROM products; # sum(price) = price的總和
SELECT AVG(price) FROM products; # avg(price) = price的平均值

5.5.5 排序查詢
sql
-- 單一欄位排序
SELECT * FROM products ORDER BY price DESC; # 降序排列(大到小),不寫的話默認為升序
-- 多欄位排序
SELECT * FROM products ORDER BY price DESC, id DESC;
# 先降序排列price,若有price相同的,則降序排列id

5.5.6 分組查詢
sql
-- 按品牌分組計算總庫存價值
SELECT brand, SUM(price * stock) as total_value
FROM products
GROUP BY brand; #以品牌分組,相同品牌的price就相加

5.5.7 分頁查詢
sql
-- 限制顯示筆數
SELECT * FROM products LIMIT 10; #即只列出前10條數據
-- 分頁查詢公式:LIMIT (頁碼-1)*每頁數量, 每頁數量
SELECT * FROM products LIMIT 0, 10; #由第1條數據開始,列10條數據
SELECT * FROM products LIMIT 10, 10; #由第11條數據開始,列10條數據
# 數據是由0開始算起的
六、MySQL表關係
6.1 一對一關係
一個表中的一條記錄與另一個表中的一條記錄有唯一對應關係
範例:員工資料表與員工卡號表
6.2 一對多關係
一個表中的一條記錄與另一個表中的多條記錄相關聯
範例:部門表與員工表(一個部門有多個員工)
實現方式:在"多"的一方設置外鍵指向"一"的一方的主鍵
6.3 多對多關係
一個表中的多條記錄與另一個表中的多條記錄相關聯
範例:學生表與課程表(一個學生可以選多門課,一門課可以有多個學生)
實現方式:需要中間關聯表,包含兩個外鍵分別指向兩個表的主鍵
6.3.1 外鍵設置實務
++在MySQL中,要使用外鍵需要確保++:
儲存引擎使用InnoDB
字符集排序規則一致(如utf8_general_ci)
相關欄位數據類型匹配
sql
-- 創建帶外鍵的表格
CREATE TABLE orders (
order_id INT PRIMARY KEY,
user_id INT,
order_date DATE,
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
七、進階查詢技巧
7.1 UNION合併查詢
同時查詢2或以上張表的數據,並把數據豎向合并成1個表格的數據。2張表查詢的字段數必須相同。
sql
-- 合併兩個SELECT結果(欄位數和數據類型必須相同)
SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2;

bumen表中有2個字段,emp表中有3個字段,必須限制只輸出emp中的name和age字段(2個字段)才能運行。
且并接後,emp表中的字段名不會顯示,僅bumen的字段名可見(豎向拼接)
7.2 GROUP_CONCAT函數
把輸出結果全部寫進同一行
sql
-- 將分組結果合併為一個字符串
SELECT 1,GROUP_CONCAT(schema_name)
FROM information_schema.SCHEMATA;

7.3 字符集處理
用cmd窗口操作時,如果遇到亂碼問題(utf8不支持中文),可以設置字符集為gbk
sql
CHARSET gbk; -- 根據需要設置合適的字符集
八、小結
MySQL是一個功能強大的關聯式資料庫管理系統,掌握主鍵、外鍵、索引等核心概念以及SQL語言的基本操作是使用MySQL的基礎。正確設計表結構和關係對於確保數據完整性和查詢效率至關重要。在實際應用中,應該根據具體業務需求合理設計數據庫結構,並適當使用索引優化查詢性能。
對於初學者來說,建議從基礎的DDL、DML、DQL操作開始練習,逐步掌握更複雜的表關係設計和查詢技巧。隨著經驗的積累,可以進一步學習事務處理、存儲過程、觸發器等進階功能,以應對更複雜的業務場景。