MySQL數據庫開發教學(二) 核心概念、重要指令

書接上回: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 外鍵約束類型)

三、索引(Index)

[3.1 索引類型](#3.1 索引類型)

[3.2 索引的優缺點](#3.2 索引的優缺點)

優點:

缺點:

四、特殊欄位屬性

五、SQL結構化查詢語言

[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 分頁查詢)

六、MySQL表關係

[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 主鍵約束的特性

  1. 唯一性:主鍵列的每一個值都必須是唯一的,不能有重複值。

  2. 非空性:主鍵列不能包含NULL值,必須始終有值。

  3. 不可變性:主鍵值一旦設定,不應該隨時間改變。

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 外鍵的作用

  1. 保持數據一致性:確保外鍵值必須存在於被參考表的主鍵中

  2. 維護引用完整性:防止意外刪除或修改被參考的數據

  3. 建立表關係:明確表與表之間的關聯方式

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 索引類型

  1. 普通索引(INDEX):最基本的索引類型,允許重複值和NULL值

  2. 唯一索引(UNIQUE):不允許重複值,但允許NULL值

  3. 主索引(PRIMARY KEY):特殊的唯一索引,不允許NULL值

  4. 全文索引(FULLTEXT):用於全文搜尋

3.2 索引的優缺點

優點:
  • 大幅提高查詢速度

  • 加速表與表之間的連接

缺點:
  • 佔用額外儲存空間

  • 降低數據新增、修改、刪除的速度

sql 复制代码
-- 創建索引
CREATE INDEX idx_name ON users(name);
-- 創建唯一索引
CREATE UNIQUE INDEX idx_email ON users(email);

=> 不是很重要,大家知道就好了

四、特殊欄位屬性

  1. AUTO_INCREMENT:自動遞增,常用於主鍵欄位

  2. NULL/NOT NULL:控制欄位是否允許空值

  3. 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 四大分類

  1. 數據定義語言(DDL)

    • 用於創建和修改資料庫對象結構

    • 主要指令:CREATE、ALTER、DROP

  2. 數據操縱語言(DML)

    • 用於對資料庫中的數據進行新增、修改、刪除

    • 主要指令:INSERT、UPDATE、DELETE

  3. 數據查詢語言(DQL)

    • 用於查詢數據庫中的數據

    • 主要指令:SELECT

  4. 數據控制語言(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中,要使用外鍵需要確保++:

  1. 儲存引擎使用InnoDB

  2. 字符集排序規則一致(如utf8_general_ci)

  3. 相關欄位數據類型匹配

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操作開始練習,逐步掌握更複雜的表關係設計和查詢技巧。隨著經驗的積累,可以進一步學習事務處理、存儲過程、觸發器等進階功能,以應對更複雜的業務場景。

相关推荐
破茧蝴蝶12 小时前
Python分布式爬虫完整教程
开发语言·python
数据库小学妹12 小时前
国产数据库怎么选?兼容、迁移、核心案例与融合架构四道关
数据库·架构·国产数据库·数据库迁移·融合数据库
狗凯之家源码网12 小时前
全新 PHP 轻量客服聊天室源码深度评测
开发语言·php·聊天室系统
远离UE413 小时前
UE5 Substrate Thin Film 源码拆析
开发语言·javascript·ue5
keyipatience13 小时前
JavaScript学习(1)书写位置,变量、数据类型、运算符
开发语言·前端·javascript·css·学习
IvorySQL13 小时前
PostgreSQL 日报| PgBouncer 修复三个 CVE 漏洞(10 月 15 日)
数据库·postgresql·区块链
饺子大魔王的男人13 小时前
后台表格、查询、流程总在重复写?我用ToolJet把PostgreSQL直接做成可远程访问的业务系统
数据库·postgresql
Gauss松鼠会13 小时前
高斯数据库(openGauss)的物理存储结构
运维·服务器·数据库·sql·opengauss·经验总结
栈帧之外14 小时前
【C++】STL之set
开发语言·c++