書接上回:MySQL數據庫開發教學(一) 基本架構-CSDN博客
建議工具:
Navicat Premium (收費 / 需破解):Navicat Premium | 管理和開發你的數據庫
phpstudy 2018 (免費):phpStudy - Windows 一鍵部署 PHP 開發環境 · 小皮出品
前言
? ? ? ? 大家好,我是小楓。上期跟大家說完MySQL數據庫的基本架構,那麼這期小編就會帶大家了解一下MySQL中有哪些重要指令和一些重要概念,以及其作用吧。廢話不多說,我們開始吧。
註:以下所說的命令無論在cmd黑窗口或navicat premium上都是一樣的,請大家一定要看過前一篇(數據類型)後再往下看,不然可能會看不懂。
目錄
前言
一、主鍵(Primary Key)
? ? ? ? 1.1 主鍵約束的特性
? ? ? ? 1.2 實際應用
二、外鍵(Foreign Key)
? ? ? ? 2.1 外鍵的作用
? ? ? ? 2.2 外鍵約束類型
三、索引(Index)
? ? ? ? 3.1 索引類型
? ? ? ? 3.2 索引的優缺點
????????優點:
????????缺點:
四、特殊欄位屬性
五、SQL結構化查詢語言
5.1 四大分類
????????5.2 必背基礎命令
? ? ? ? 5.3?DDL(數據定義語言)
? ? ? ? 5.3.1 數據庫操作
? ? ? ? 5.3.2 表格操作
? ? ? ? 5.4 DML(數據操縱語言)
? ? ? ? 5.4.1?INSERT - 插入數據
? ? ? ? 5.4.2?UPDATE - 更改數據
? ? ? ? 5.4.3?DELETE - 刪除數據
? ? ? ? 5.5 DQL(數據查詢語言)
? ? ? ? 5.5.1?基礎查詢
? ? ? ? 5.5.2 條件查詢
? ? ? ? 5.5.3?模糊查詢
? ? ? ? 5.5.4??聚合查詢
? ? ? ? 5.5.5?排序查詢
? ? ? ? 5.5.6?分組查詢
? ? ? ? 5.5.7? 分頁查詢
六、MySQL表關係
? ? ? ? 6.1 一對一關係
? ? ? ? 6.2 一對多關係
? ? ? ? 6.3 多對多關係
? ? ? ? 6.3.1 外鍵設置實務
七、進階查詢技巧
? ? ? ? 7.1 UNION合併查詢
? ? ? ? 7.2?GROUP_CONCAT函數
? ? ? ? 7.3 字符集處理
八、小結
一、主鍵(Primary Key)
主鍵是資料庫表中用來唯一識別每一筆記錄的一列或多列組合。主鍵的作用是確保表中的每一筆記錄都有一個獨特的識別標誌,類似於身分證號碼的概念。主鍵的設置是資料庫設計中的基本要求,通常作為記錄的第一列出現。
? ? ? ? 1.1 主鍵約束的特性
-
唯一性:主鍵列的每一個值都必須是唯一的,不能有重複值。
-
非空性:主鍵列不能包含NULL值,必須始終有值。
-
不可變性:主鍵值一旦設定,不應該隨時間改變。
? ? ? ? 1.2 實際應用
在實際資料庫設計中,主鍵通常採用以下幾種形式:
單一欄位主鍵:使用一個欄位作為主鍵,最常見的是ID欄位
複合主鍵:使用多個欄位組合作為主鍵,當單一欄位無法確保唯一性時使用
-- 創建帶有主鍵的表格
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:不採取任何動作
-- 創建帶有外鍵的表格
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 索引的優缺點
????????優點:
大幅提高查詢速度
加速表與表之間的連接
????????缺點:
佔用額外儲存空間
降低數據新增、修改、刪除的速度
-- 創建索引
CREATE INDEX idx_name ON users(name);
-- 創建唯一索引
CREATE UNIQUE INDEX idx_email ON users(email);
=> 不是很重要,大家知道就好了
四、特殊欄位屬性
AUTO_INCREMENT:自動遞增,常用於主鍵欄位
NULL/NOT NULL:控制欄位是否允許空值
DEFAULT:設定欄位預設值
-- 使用特殊屬性的範例
CREATE TABLE products (id INT PRIMARY KEY AUTO_INCREMENT, #自動遞增,即1234567...name VARCHAR(100) NOT NULL, #不可為空,為空則報錯price DECIMAL(10,2) DEFAULT 0.00, #若沒有數據則默認為0.00created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP #同上,上一篇講了格式大家可以稍微去看一下
);
五、SQL結構化查詢語言
????????以下指令將以此表為例作說明,途中數據會更改,不用太較真哈
5.1 四大分類
-
數據定義語言(DDL)
-
用於創建和修改資料庫對象結構
-
主要指令:CREATE、ALTER、DROP
-
-
數據操縱語言(DML)
-
用於對資料庫中的數據進行新增、修改、刪除
-
主要指令:INSERT、UPDATE、DELETE
-
-
數據查詢語言(DQL)
-
用於查詢數據庫中的數據
-
主要指令:SELECT
-
-
數據控制語言(DCL)
-
用於控制用戶對數據的訪問權限
-
主要指令:GRANT、REVOKE
-
????????5.2 必背基礎命令
-- 查看所有資料庫
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 數據庫操作
-- 創建資料庫
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 表格操作
-- 創建表格
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 - 插入數據
-- 完整寫法
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 - 更改數據
-- 更改特定條件的數據
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 - 刪除數據
-- 刪除特定條件的數據
DELETE FROM <table_name> WHERE <condition(條件)>;-- 範例:刪除id為5的產品
DELETE FROM products WHERE id = 5;
重要:UPDATE和DELETE操作必須加上WHERE條件,否則會影響所有數據記錄。
? ? ? ? 5.5 DQL(數據查詢語言)
? ? ? ? 5.5.1?基礎查詢
-- 查詢特定欄位
SELECT <column1(字段名)>, <column2> FROM <table_name(表名)>;-- 查詢所有欄位
SELECT * FROM <table_name>;-- 使用別名
SELECT <column_name> AS <alias_name(別名)> FROM <table_name>; #但where 條件還是要寫全名
? ? ? ? 5.5.2 條件查詢
-- 基礎條件查詢
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?模糊查詢
-- % 匹配0個或多個字符
SELECT * FROM products WHERE name LIKE '小米%'; -- _ 匹配單個字符
SELECT * FROM products WHERE name LIKE '小米_機';
? ? ? ? 5.5.4??聚合查詢
-- 計算記錄數量
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?排序查詢
-- 單一欄位排序
SELECT * FROM products ORDER BY price DESC; # 降序排列(大到小),不寫的話默認為升序-- 多欄位排序
SELECT * FROM products ORDER BY price DESC, id DESC;
# 先降序排列price,若有price相同的,則降序排列id
? ? ? ? 5.5.6?分組查詢
-- 按品牌分組計算總庫存價值
SELECT brand, SUM(price * stock) as total_value
FROM products
GROUP BY brand; #以品牌分組,相同品牌的price就相加
? ? ? ? 5.5.7? 分頁查詢
-- 限制顯示筆數
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)
相關欄位數據類型匹配
-- 創建帶外鍵的表格
CREATE TABLE orders (order_id INT PRIMARY KEY,user_id INT,order_date DATE,FOREIGN KEY (user_id) REFERENCES users(id)ON DELETE CASCADEON UPDATE CASCADE
);
七、進階查詢技巧
? ? ? ? 7.1 UNION合併查詢
? ? ? ? 同時查詢2或以上張表的數據,並把數據豎向合并成1個表格的數據。2張表查詢的字段數必須相同。
-- 合併兩個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函數
? ? ? ? 把輸出結果全部寫進同一行
-- 將分組結果合併為一個字符串
SELECT 1,GROUP_CONCAT(schema_name)
FROM information_schema.SCHEMATA;
? ? ? ? 7.3 字符集處理
用cmd窗口操作時,如果遇到亂碼問題(utf8不支持中文),可以設置字符集為gbk
CHARSET gbk; -- 根據需要設置合適的字符集
八、小結
????????MySQL是一個功能強大的關聯式資料庫管理系統,掌握主鍵、外鍵、索引等核心概念以及SQL語言的基本操作是使用MySQL的基礎。正確設計表結構和關係對於確保數據完整性和查詢效率至關重要。在實際應用中,應該根據具體業務需求合理設計數據庫結構,並適當使用索引優化查詢性能。
????????對於初學者來說,建議從基礎的DDL、DML、DQL操作開始練習,逐步掌握更複雜的表關係設計和查詢技巧。隨著經驗的積累,可以進一步學習事務處理、存儲過程、觸發器等進階功能,以應對更複雜的業務場景。