本指南旨在为初学者提供一个结构化的 MySQL 学习框架。内容涵盖了从环境连接、数据库与表结构管理(DDL)、数据操作(DML),到高级查询与核心概念(如索引和事务)的完整知识体系。
如果觉得本文对凝有帮助,请点个赞和关注吧,你的支持就是我持续更新的最大动力,谢谢!!!!
文章目录
第一部分:基础管理与连接1.1 连接 MySQL 服务器1.2 数据库(Database)核心操作
第二部分:DDL - 数据定义语言2.1 表(Table)核心操作
第三部分:DML - 数据操纵语言3.1 插入数据 (INSERT)3.2 查询数据 (SELECT)3.3 更新数据 (UPDATE)3.4 删除数据 (DELETE)
第四部分:高级查询技术4.1 聚合函数 (Aggregate Functions)4.2 分组查询 (`GROUP BY`)4.3 分组过滤 (`HAVING`)4.4 连接查询 (`JOIN`)
第五部分:核心进阶概念5.1 索引 (Index)5.2 事务 (Transaction)
第六部分:深入查询与数据组合6.1 子查询 (Subquery)6.2 组合查询 (`UNION`)
第七部分:关系完整性与外键7.1 外键 (Foreign Key)7.2 级联操作 (`ON DELETE` / `ON UPDATE`)
第八部分:视图与常用函数8.1 视图 (View)8.2 常用内置函数
第九部分:用户管理与权限控制9.1 用户管理9.2 权限控制
总结与展望
第一部分:基础管理与连接
在与数据交互之前,必须首先建立与数据库服务器的连接,并掌握对数据库(Database)本身的管理。
1.1 连接 MySQL 服务器
连接 MySQL 服务器是与数据库进行交互的首要步骤。
语法格式
mysql -h 主机地址 -u 用户名 -p
参数详解
mysql: MySQL 客户端应用程序的可执行命令。-h (host): 指定目标 MySQL 服务器的主机名或 IP 地址。若连接本机服务器,此参数可省略。-u (user): 指定用于登录的用户名。-p (password): 此参数会提示用户在下一行安全地输入密码,以避免密码在命令行历史中暴露。
示例
# 使用 root 用户连接本地 MySQL 服务器
mysql -u root -p
# 系统将提示输入密码
Enter password:
成功连接后,命令提示符将变为 mysql>,表示已进入 MySQL 交互环境。
1.2 数据库(Database)核心操作
数据库是表的逻辑集合,是数据管理的最高层级容器。
1. 查看所有数据库
SHOW DATABASES;
说明:该命令用于列出当前 MySQL 服务器上存在的所有数据库。SQL 语句以分号 ; 结尾。
2. 创建新数据库
CREATE DATABASE 数据库名;
示例:创建一个用于存储电子商务数据的数据库 e_commerce。
CREATE DATABASE e_commerce;
3. 选择(进入)数据库
USE 数据库名;
说明:在执行任何针对表的操作前,必须通过此命令指定当前会话的默认数据库。 示例:选择 e_commerce 数据库作为当前操作环境。
USE e_commerce;
4. 删除数据库
DROP DATABASE 数据库名;
警告:此操作将永久性删除数据库及其所有内容(包括表、数据、索引等),且无法恢复。执行前请务必确认。 示例:删除一个名为 temp_db 的测试数据库。
DROP DATABASE temp_db;
第二部分:DDL - 数据定义语言
DDL (Data Definition Language) 用于定义和管理数据库对象的结构,核心是表(Table)的创建与维护。
2.1 表(Table)核心操作
表是结构化数据的基本单位,由行(记录)和列(字段)组成。
1. 查看当前数据库的所有表
SHOW TABLES;
说明:此命令必须在已通过 USE 命令选定数据库后执行。
2. 创建新表 CREATE TABLE 是定义数据结构的关键命令。
语法格式
CREATE TABLE 表名 (
列名1 数据类型 [约束条件],
列名2 数据类型 [约束条件],
...,
PRIMARY KEY (主键列)
);
关键组件详解
常用数据类型
INT: 整数类型。VARCHAR(n): 可变长度字符串,n 为最大字符数。TEXT: 用于存储长文本数据。DECIMAL(p, s): 高精度定点数,p 为总位数,s 为小数位数。适用于金融计算。DATETIME: 存储日期和时间,格式为 YYYY-MM-DD HH:MM:SS。TIMESTAMP: 时间戳,通常用于自动记录行创建或更新的时间。 常用约束 (Constraints)
NOT NULL: 强制列值不能为空。AUTO_INCREMENT: 自动递增,常用于整数类型的主键列。PRIMARY KEY: 主键约束,唯一标识表中的每一行。UNIQUE: 唯一约束,确保列中所有值均不重复。DEFAULT value: 为列设置默认值。
示例 在 e_commerce 数据库中创建 products 表。
CREATE TABLE products (
id INT NOT NULL AUTO_INCREMENT,
product_name VARCHAR(255) NOT NULL,
category VARCHAR(100),
price DECIMAL(10, 2) NOT NULL,
stock_quantity INT NOT NULL DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
);
结构分析:
id: 主键,整数,非空,自增。product_name: 商品名称,字符串,非空。category: 商品分类,字符串。price: 价格,精确到两位小数,非空。stock_quantity: 库存数量,整数,默认为0。created_at: 记录创建时间,默认为当前时间戳。
3. 查看表结构
DESCRIBE 表名; -- 可简写为 DESC 表名;
示例:查看 products 表的详细定义。
DESC products;
4. 修改表结构 (ALTER TABLE) 用于在表创建后调整其结构。
添加新列
ALTER TABLE 表名 ADD COLUMN 新列名 数据类型 [约束];
示例:为 products 表添加 supplier (供应商) 列。
ALTER TABLE products ADD COLUMN supplier VARCHAR(150);
修改列定义
ALTER TABLE 表名 MODIFY COLUMN 列名 新数据类型 [新约束];
示例:将 supplier 列的类型长度扩展至 VARCHAR(200)。
ALTER TABLE products MODIFY COLUMN supplier VARCHAR(200);
删除列
ALTER TABLE 表名 DROP COLUMN 列名;
示例:从 products 表中移除 supplier 列。
ALTER TABLE products DROP COLUMN supplier;
5. 删除表
DROP TABLE 表名;
警告:此操作将永久性删除表结构及其所有数据,请谨慎操作。 示例:删除名为 old_products 的表。
DROP TABLE old_products;
第三部分:DML - 数据操纵语言
DML (Data Manipulation Language) 负责对表中的数据进行增、删、改、查(CRUD)操作,是日常使用频率最高的命令集。
3.1 插入数据 (INSERT)
向表中添加新的记录。
语法格式
-- 插入单条记录
INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...);
-- 插入多条记录
INSERT INTO 表名 (列1, 列2, ...) VALUES
(值A1, 值A2, ...),
(值B1, 值B2, ...);
示例
-- 向 products 表插入一条记录
INSERT INTO products (product_name, category, price, stock_quantity)
VALUES ('Laptop Model X', 'Electronics', 8500.00, 50);
-- 向 products 表插入多条记录
INSERT INTO products (product_name, category, price, stock_quantity) VALUES
('Wireless Mouse', 'Accessories', 250.00, 300),
('Mechanical Keyboard', 'Accessories', 750.00, 150);
3.2 查询数据 (SELECT)
从表中检索数据,是功能最强大且最复杂的 DML 命令。
1. 查询所有列
SELECT * FROM 表名;
说明:* 通配符代表所有列。在生产环境中,为提升性能和代码可读性,推荐显式指定列名。 示例:
SELECT * FROM products;
2. 查询指定列
SELECT 列1, 列2 FROM 表名;
示例: 仅查询商品名称和价格。
SELECT product_name, price FROM products;
3. 条件过滤 (WHERE) WHERE 子句用于筛选满足特定条件的记录。
常用操作符: =, <>, !=, >, <, >=, <=, BETWEEN ... AND ..., LIKE, IN (...)
示例
-- 查询价格高于 1000 的电子产品
SELECT product_name, price FROM products WHERE category = 'Electronics' AND price > 1000;
-- 查询产品名称中包含 'Keyboard' 的产品 (模糊查询)
SELECT * FROM products WHERE product_name LIKE '%Keyboard%';
-- 查询价格在 500 到 1000 区间的产品
SELECT * FROM products WHERE price BETWEEN 500 AND 1000;
4. 结果排序 (ORDER BY)
SELECT * FROM 表名 ORDER BY 列名 [ASC|DESC];
说明:ASC 为升序 (默认),DESC 为降序。 示例: 按价格降序排列所有商品。
SELECT product_name, price FROM products ORDER BY price DESC;
5. 限制返回数量 (LIMIT) 用于数据分页或获取 Top-N 结果。
语法格式
-- 返回前 N 条记录
LIMIT N;
-- 从偏移量 M 处开始,返回 N 条记录 (偏移量从 0 开始)
LIMIT M, N;
示例
-- 查询价格最高的 3 款产品
SELECT product_name, price FROM products ORDER BY price DESC LIMIT 3;
-- 分页查询:获取第 2 页数据,每页 10 条 (记录 10 到 19)
SELECT * FROM products LIMIT 10, 10;
3.3 更新数据 (UPDATE)
修改表中已存在的记录。
语法格式
UPDATE 表名 SET 列1 = 新值1, 列2 = 新值2, ... WHERE 条件;
警告:WHERE 子句是 UPDATE 的安全阀。若省略,将更新表中的所有行。务必在执行前确认 WHERE 条件的准确性。
示例
-- 将 'Laptop Model X' 的价格更新为 8200.00
UPDATE products SET price = 8200.00 WHERE product_name = 'Laptop Model X';
-- 将所有 'Accessories' 分类的商品库存增加 20
UPDATE products SET stock_quantity = stock_quantity + 20 WHERE category = 'Accessories';
3.4 删除数据 (DELETE)
从表中移除记录。
语法格式
DELETE FROM 表名 WHERE 条件;
警告:与 UPDATE 类似,WHERE 子句至关重要。若省略,将删除表中的所有行。
示例
-- 删除 ID 为 3 的产品记录
DELETE FROM products WHERE id = 3;
注意: TRUNCATE TABLE 表名; 可用于快速清空表内所有数据。其效率高于 DELETE,但它不触发删除触发器,且通常无法回滚。
第四部分:高级查询技术
掌握高级查询技术是数据分析和复杂应用开发的基础。
4.1 聚合函数 (Aggregate Functions)
聚合函数对一组行的值进行计算,并返回单个结果。
COUNT(列名|*): 计算行数。COUNT(*) 计算所有行,COUNT(列名) 计算指定列非 NULL 值的行数。SUM(列名): 计算数值列的总和。AVG(列名): 计算数值列的平均值。MAX(列名): 返回列中的最大值。MIN(列名): 返回列中的最小值。
示例
-- 计算产品总数
SELECT COUNT(*) AS total_products FROM products;
-- 计算所有 'Electronics' 类产品的总库存
SELECT SUM(stock_quantity) AS total_electronics_stock FROM products WHERE category = 'Electronics';
-- 查询最昂贵产品的价格
SELECT MAX(price) FROM products;
说明:AS 关键字用于为结果列指定别名,提高可读性。
4.2 分组查询 (GROUP BY)
GROUP BY 子句将具有相同值的行聚合到摘要行中,常与聚合函数联用。
语法格式
SELECT 列, 聚合函数() FROM 表名 GROUP BY 列;
示例
-- 统计每个分类下的产品数量
SELECT category, COUNT(*) AS product_count FROM products GROUP BY category;
-- 计算每个分类的平均价格
SELECT category, AVG(price) AS average_price FROM products GROUP BY category;
4.3 分组过滤 (HAVING)
HAVING 子句用于在 GROUP BY 分组后对结果集进行过滤。
语法格式
SELECT ... FROM ... GROUP BY ... HAVING 分组条件;
WHERE 与 HAVING 的区别:
WHERE 在分组前对原始行进行过滤。HAVING 在分组后对聚合结果进行过滤。
示例
-- 查找产品数量超过 10 个的分类
SELECT category, COUNT(*) AS product_count
FROM products
GROUP BY category
HAVING COUNT(*) > 10;
4.4 连接查询 (JOIN)
JOIN 用于根据相关列将多个表中的行组合起来。
场景: 假设存在 orders (订单) 表,包含 order_id, product_id, quantity 等列。
1. INNER JOIN (内连接) 返回两个表中连接列匹配的行。
示例: 查询订单及其对应的产品名称。
SELECT
o.order_id,
p.product_name,
o.quantity
FROM orders AS o
INNER JOIN products AS p ON o.product_id = p.id;
说明: ON 子句定义了表之间的连接条件。使用表别名(如 o 和 p)可以简化查询语句。
2. LEFT JOIN (左连接) 返回左表的所有行,以及右表中匹配的行。若右表无匹配,则结果为 NULL。
示例: 列出所有产品及其订单信息,即使某些产品从未被订购。
SELECT
p.product_name,
o.order_id,
o.quantity
FROM products AS p
LEFT JOIN orders AS o ON p.id = o.product_id;
第五部分:核心进阶概念
理解索引和事务是保证数据库性能和数据一致性的关键。
5.1 索引 (Index)
索引是数据库中一种特殊的数据结构,旨在大幅提高数据检索的速度。
创建索引
CREATE INDEX 索引名 ON 表名 (列名1, 列名2, ...);
适用场景: 频繁用于 WHERE 查询条件、JOIN 连接条件或 ORDER BY 排序的列是创建索引的主要候选对象。主键列会自动创建唯一的聚集索引。
示例 为 products 表的 product_name 列创建索引以加速按名称搜索。
CREATE INDEX idx_product_name ON products (product_name);
查看与删除索引
-- 查看表的索引信息
SHOW INDEX FROM 表名;
-- 删除索引
DROP INDEX 索引名 ON 表名;
5.2 事务 (Transaction)
事务是一个原子性的操作序列,这些操作要么全部执行成功,要么全部回滚失败,以维护数据库的完整性和一致性。
事务控制命令
START TRANSACTION; 或 BEGIN;: 标志着一个新事务的开始。COMMIT;: 提交事务,将事务期间的所有修改永久性地写入数据库。ROLLBACK;: 回滚事务,撤销自事务开始以来的所有修改。
示例: 模拟一个安全的库存扣减和订单创建过程。
START TRANSACTION;
-- 步骤 1: 扣减产品库存
UPDATE products SET stock_quantity = stock_quantity - 1
WHERE id = 1 AND stock_quantity > 0;
-- 步骤 2: 创建订单记录
-- (假设上一步操作影响的行数为 1,表示库存足够)
INSERT INTO orders (product_id, quantity) VALUES (1, 1);
-- 如果所有步骤均成功,则提交事务
COMMIT;
-- 如果任何步骤失败 (例如,库存不足导致 UPDATE 未执行),则回滚
-- ROLLBACK;
说明:在应用程序逻辑中,通常会检查每一步操作的执行结果,然后决定是 COMMIT 还是 ROLLBACK。
第六部分:深入查询与数据组合
当单个表的查询无法满足需求时,就需要掌握更高级的查询技巧,如子查询、组合查询以及更复杂的连接。
6.1 子查询 (Subquery)
子查询是嵌套在另一个 SQL 查询(如 SELECT, INSERT, UPDATE, DELETE)中的查询。它允许我们基于一个查询的结果来执行另一个查询。
1. 在 WHERE 子句中使用 这是最常见的用法,用于根据动态条件进行过滤。
示例:查询价格高于平均价格的所有产品。
-- 步骤 1: 找出平均价格 (这将是子查询)
-- SELECT AVG(price) FROM products;
-- 步骤 2: 将子查询嵌入主查询
SELECT product_name, price
FROM products
WHERE price > (SELECT AVG(price) FROM products);
2. 在 FROM 子句中使用 子查询的结果可以作为一个临时的、派生的表,在主查询中被引用。
示例:查询每个分类中价格最高的产品信息。
-- 子查询: 找出每个分类的最高价格
-- SELECT category, MAX(price) AS max_price FROM products GROUP BY category;
-- 主查询: 将产品表与上述派生表连接
SELECT p.product_name, p.category, p.price
FROM products AS p
INNER JOIN (
SELECT category, MAX(price) AS max_price
FROM products
GROUP BY category
) AS max_prices_by_cat
ON p.category = max_prices_by_cat.category AND p.price = max_prices_by_cat.max_price;
6.2 组合查询 (UNION)
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
语法规则
所有 SELECT 语句必须拥有相同数量的列。相应列的数据类型必须兼容。列的顺序必须相同。
UNION vs UNION ALL
UNION: 自动去除结果集中的重复行。UNION ALL: 保留所有行,包括重复行,因此执行效率更高。
示例:假设我们有一个 archived_products (已归档产品) 表,结构与 products 相同。现在需要查询所有在售和已归档的电子产品。
-- 从在售产品表中查询
SELECT product_name, category, price FROM products WHERE category = 'Electronics'
UNION ALL
-- 从已归档产品表中查询
SELECT product_name, category, price FROM archived_products WHERE category = 'Electronics';
第七部分:关系完整性与外键
在关系型数据库中,表与表之间的关系至关重要。外键是维护这种关系和数据完整性的核心机制。
7.1 外键 (Foreign Key)
外键是一个(或一组)列,其值引用另一张表的主键。它确保了引用数据的有效性,防止产生“孤儿记录”。
场景: 我们需要一个 orders (订单) 表来记录哪个产品被购买了。orders 表中的 product_id 就应该是一个外键,指向 products 表的 id。
创建带有外键的表
-- 先创建 customers 表
CREATE TABLE customers (
id INT NOT NULL AUTO_INCREMENT,
customer_name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE,
PRIMARY KEY (id)
);
-- 创建 orders 表,并设置外键
CREATE TABLE orders (
order_id INT NOT NULL AUTO_INCREMENT,
customer_id INT,
order_date DATE,
total_amount DECIMAL(12, 2),
PRIMARY KEY (order_id),
FOREIGN KEY (customer_id) REFERENCES customers(id)
);
外键约束分析: FOREIGN KEY (customer_id) REFERENCES customers(id)
FOREIGN KEY (customer_id): 指定 orders 表中的 customer_id 为外键列。REFERENCES customers(id): 指明此外键引用 customers 表的 id 列。这个约束意味着,插入到 orders 表的 customer_id 必须是 customers 表中已经存在的 id。
7.2 级联操作 (ON DELETE / ON UPDATE)
外键可以定义当被引用的主键记录被删除或更新时,应采取的相应动作。
CASCADE: 如果父表中的记录被删除/更新,则子表中所有相关的记录也自动被删除/更新。SET NULL: 如果父表中的记录被删除/更新,则子表中相关记录的外键列被设置为 NULL (前提是该列允许为 NULL)。RESTRICT / NO ACTION (默认): 如果子表中存在相关记录,则阻止对父表记录的删除/更新操作。
示例:创建订单详情表 order_items,当订单被删除时,相关的订单项也自动删除。
CREATE TABLE order_items (
item_id INT NOT NULL AUTO_INCREMENT,
order_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT,
price_per_unit DECIMAL(10, 2),
PRIMARY KEY (item_id),
FOREIGN KEY (order_id) REFERENCES orders(order_id) ON DELETE CASCADE,
FOREIGN KEY (product_id) REFERENCES products(id)
);
第八部分:视图与常用函数
8.1 视图 (View)
视图是一个虚拟表,其内容由查询定义。它就像一个“已保存的查询”,可以简化复杂查询、提供数据安全性并保持逻辑一致性。
创建视图
CREATE VIEW 视图名 AS SELECT_语句;
示例: 创建一个只显示高价值电子产品信息的视图。
CREATE VIEW high_value_electronics AS
SELECT product_name, price, stock_quantity
FROM products
WHERE category = 'Electronics' AND price > 5000;
使用视图 视图创建后,可以像查询普通表一样查询它。
SELECT * FROM high_value_electronics WHERE stock_quantity < 20;
优点
简化操作: 将复杂的 JOIN 和过滤逻辑封装起来。安全性: 可以只向用户暴露视图,隐藏底层表的敏感列或行。逻辑独立性: 即使底层表的结构发生变化(如添加列),只要视图的定义不受影响,依赖于视图的应用程序就无需修改。
8.2 常用内置函数
MySQL 提供了大量内置函数,用于数据处理和计算。
1. 字符串函数
CONCAT(str1, str2, ...): 连接字符串。LENGTH(str): 返回字符串的字节长度。UPPER(str) / LOWER(str): 转换为大/小写。SUBSTRING(str, pos, len): 提取子字符串。
示例:
SELECT CONCAT(product_name, ' (Category: ', category, ')') AS full_description FROM products;
2. 数值函数
ROUND(num, d): 四舍五入到指定小数位数 d。CEIL(num): 向上取整。FLOOR(num): 向下取整。
示例:
SELECT price, ROUND(price) AS rounded_price FROM products;
3. 日期与时间函数
NOW(): 返回当前日期和时间。CURDATE(): 返回当前日期。CURTIME(): 返回当前时间。DATE_FORMAT(date, format): 按指定格式格式化日期。
示例:
-- 以 '2023-10-27' 格式显示订单日期
SELECT order_id, DATE_FORMAT(order_date, '%Y-%m-%d') AS formatted_date FROM orders;
4. 控制流函数
IF(expr1, expr2, expr3): 如果 expr1 为真,返回 expr2,否则返回 expr3。CASE ... WHEN ... THEN ... ELSE ... END: 复杂的条件逻辑判断。
示例: 根据价格给产品打上标签。
SELECT
product_name,
price,
CASE
WHEN price > 5000 THEN 'Premium'
WHEN price > 1000 AND price <= 5000 THEN 'Mid-Range'
ELSE 'Affordable'
END AS price_tier
FROM products;
第九部分:用户管理与权限控制
在多用户环境中,为不同用户分配适当的权限是数据库安全的核心。
9.1 用户管理
1. 创建用户
CREATE USER '用户名'@'主机' IDENTIFIED BY '密码';
主机: 指定用户可以从哪个主机连接。localhost 表示仅本机,% 表示任意主机。
示例: 创建一个只能从本地连接的只读用户 readonly_user。
CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'secure_password';
2. 删除用户
DROP USER '用户名'@'主机';
9.2 权限控制
1. 授予权限 (GRANT)
GRANT 权限列表 ON 数据库.表 TO '用户名'@'主机';
权限列表: 如 SELECT, INSERT, UPDATE, DELETE, ALL PRIVILEGES 等。数据库.表: 可以是 db_name.* (整个数据库), db_name.table_name (特定表), 或 *.* (所有数据库)。
示例:
-- 为 readonly_user 授予对 e_commerce 数据库所有表的 SELECT 权限
GRANT SELECT ON e_commerce.* TO 'readonly_user'@'localhost';
-- 创建一个可以对 products 表进行增删改查的 app_user
CREATE USER 'app_user'@'%' IDENTIFIED BY 'app_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON e_commerce.products TO 'app_user'@'%';
2. 撤销权限 (REVOKE)
REVOKE 权限列表 ON 数据库.表 FROM '用户名'@'主机';
示例: 撤销 app_user 的 DELETE 权限。
REVOKE DELETE ON e_commerce.products FROM 'app_user'@'%';
3. 查看权限
SHOW GRANTS FOR '用户名'@'主机';
最佳实践: 遵循 最小权限原则 (Principle of Least Privilege),即只授予用户完成其工作所必需的最小权限。
总结与展望
您已完成了一次从基础到进阶的 MySQL 旅程,掌握了从数据操作(DML)、结构定义(DDL),到高级查询、关系设计、安全管理的核心知识体系。精通之路在于持续实践与深入探索,将理论知识应用于真实场景。
建议后续学习方向:
查询优化:学习使用 EXPLAIN 分析性能,精通索引的应用。数据库设计:掌握范式(Normalization)与外键,设计健壮、高效的数据模型。高级功能:探索存储过程、触发器与视图,实现业务逻辑自动化。管理与安全:熟练配置用户权限,并掌握备份与恢复策略。