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

相关推荐
一只鲲6 分钟前
56 C++ 现代C++编程艺术5-万能引用
开发语言·c++
何中应19 分钟前
如何用Redis作为消息队列
数据库·redis·缓存
liulilittle1 小时前
.NET反射与IL反编译核心技术
开发语言·数据库·c#·.net·反射·反编译·il
老纪的技术唠嗑局1 小时前
向量数据库在 UGC 社区个性化推荐的落地指南
数据库
张鱼小丸子1 小时前
MySQL企业级部署与高可用实战
运维·数据库·mysql·云原生·高可用·mha·组从复制
GalaxyPokemon1 小时前
MYSQL的默认隔离级别都有什么
数据库·mysql
扛麻袋的少年1 小时前
6.Kotlin的Duration类
android·开发语言·kotlin
DONG9131 小时前
《三驾马车:MySQL、MongoDB、Redis对比与融合实战》
数据库·redis·sql·mysql·mongodb·database
程序边界2 小时前
从 Oracle 到 KingbaseES:企业信创改造的“抄作业”模板,直接套用!
数据库·oracle
funfan05172 小时前
奇怪的“bug”--数据库的“隐式转换”行为
数据库·bug