MySQL 数据库基础知识深度解析
引言:数据的重要性与数据库的角色
在当今信息爆炸的时代,数据已经成为最宝贵的资产之一。无论是个人信息、企业运营数据、科学研究成果,还是互联网上海量的用户行为记录,都需要被有效地存储、管理和利用。这时,数据库系统便应运而生,它是一个结构化、可持久存储、高效访问的数据集合,以及管理这些数据所需的软件。
数据库系统是各类应用程序的基石,从简单的个人博客到复杂的电子商务平台、金融交易系统,乃至大数据分析和人工智能应用,都离不开强大的数据库支持。选择一个合适的数据库管理系统(DBMS)对于项目的成功至关重要。
在众多数据库系统中,MySQL 无疑是最受欢迎、应用最广泛的开源关系型数据库管理系统之一。它以其高性能、高可靠性、易用性以及成本效益等优势,赢得了全球开发者和企业的青睐。本文将深入浅出地介绍 MySQL 数据库的基础知识,帮助读者构建坚实的数据库概念基础,为后续的学习和实践打下坚实的基础。
第一部分:初识 MySQL – 是什么以及为什么选择它
1.1 什么是数据库?
在理解 MySQL 之前,我们首先明确“数据库”的含义。广义上讲,数据库是按照某种数据模型组织起来并存放的相互关联的数据集合。狭义上,数据库是指存放数据的文件。
数据库管理系统(DBMS)是用于创建、管理和操作数据库的软件。它提供了一系列功能,如数据定义、数据操作、数据控制和数据安全等,使用户能够方便高效地处理数据。常见的 DBMS 类型包括关系型数据库(如 MySQL, PostgreSQL, Oracle, SQL Server)和非关系型数据库(NoSQL,如 MongoDB, Redis)。
1.2 什么是 MySQL?
MySQL 是一个开源的、免费的、关系型数据库管理系统(RDBMS)。它的名字来源于创始人 Monty Widenius 的女儿 My。MySQL 最初由瑞典公司 MySQL AB 开发,后被 Sun Microsystems 收购,再后来 Sun Microsystems 被 Oracle Corporation 收购,目前由 Oracle 公司维护和发展。
MySQL 遵循客户端-服务器(Client-Server)架构。数据库服务器运行在后台,负责处理所有数据库请求,而客户端应用程序则连接到服务器,发送请求(通常是 SQL 语句)并接收结果。这种架构使得多个客户端可以同时访问同一个数据库。
1.3 为什么选择 MySQL?
MySQL 广受欢迎的原因有很多,主要包括:
- 开源与免费: MySQL Community Server 是免费使用的,这大大降低了小型项目和个人开发的成本。商业版本提供更多高级功能和支持。
- 高性能: MySQL 以其速度快、效率高著称,尤其在处理大量数据时表现出色。
- 高可靠性与稳定性: MySQL 经过多年的发展和无数实际应用的考验,已经非常成熟和稳定,提供事务处理、崩溃恢复等机制保证数据安全。
- 易用性: MySQL 安装和配置相对简单,提供了丰富的客户端工具(如命令行客户端、MySQL Workbench)和图形化界面工具,便于管理和操作。
- 广泛的兼容性: MySQL 支持多种操作系统(Windows, Linux, macOS 等)和多种编程语言(Java, PHP, Python, Node.js, C++, .NET 等)的连接驱动。
- 强大的社区支持: 作为最流行的开源数据库,MySQL 拥有庞大的用户和开发者社区,遇到问题很容易找到解决方案和帮助。
- 丰富的功能: 支持标准的 SQL 语言,支持多种存储引擎(如 InnoDB, MyISAM),支持复制(Replication)用于高可用和读写分离,支持分区(Partitioning)用于管理大数据量等。
基于以上优势,MySQL 成为 Web 应用开发(LAMP/LEMP 栈的核心)、内容管理系统(如 WordPress, Joomla)、电子商务平台以及许多其他类型应用的首选数据库。
第二部分:关系型数据库核心概念
MySQL 是一个关系型数据库,这意味着它基于关系模型来组织数据。理解关系模型是学习 MySQL 的基础。
2.1 关系模型
关系模型由 E.F. Codd 在 1970 年提出。它使用二维表(Relation,通常称为表)来表示数据,表由行(Tuple,通常称为记录或行)和列(Attribute,通常称为字段或列)组成。表与表之间通过共同的列建立关联,这种关联称为“关系”。
2.2 表(Table)
表是关系型数据库中存储数据的基本单元。它可以被想象成一个电子表格,具有明确的结构。例如,一个存储用户信息的表可能包含“用户ID”、“用户名”、“电子邮箱”、“注册日期”等列。
2.3 列(Column)
列定义了表中存储的数据的类型和含义。表中的每一列都有一个唯一的名称(在同一张表中)和特定的数据类型(如整数、字符串、日期等)。列也被称为字段。
2.4 行(Row)
行代表表中的一条记录。每一行都包含该记录在所有列上的具体数据值。例如,在用户信息表中,一行就代表一个具体用户的所有信息。行也被称为记录或元组(Tuple)。
2.5 键(Keys)
键是关系模型中非常重要的概念,用于唯一标识记录以及建立表与表之间的关联。
-
主键 (Primary Key, PK): 主键是表中用于唯一标识每一行记录的一列或一组列。
- 主键值必须唯一,不能重复。
- 主键值不能为 NULL (空)。
- 一张表只能有一个主键。
- 主键的作用是确保数据的唯一性和完整性,同时也是建立表之间关系的基础。
- 通常选择一个与业务逻辑无关的、自动增长的整数列作为主键(如
id
)。
-
候选键 (Candidate Key): 表中能够唯一标识每一行记录的一列或一组列,且其任意真子集都不能唯一标识记录。主键是从一个或多个候选键中选定的。
-
超键 (Super Key): 表中能够唯一标识每一行记录的一列或一组列。超键包含候选键,主键是最小的超键。
-
外键 (Foreign Key, FK): 外键是一张表中的一列或一组列,它们引用(Reference)另一张表(称为被引用表或父表)中的主键或候选键。
- 外键用于建立两张表之间的关联。
- 外键值必须在被引用表的被引用列中存在,或者为 NULL(如果允许)。
- 外键保证了引用完整性(Referential Integrity),即不允许创建引用了不存在数据的记录。
- 例如,
Orders
表可能有一个customer_id
列作为外键,引用Customers
表的customer_id
主键,这表示每张订单都必须对应一个实际存在的客户。
-
唯一键 (Unique Key): 唯一键约束表中的一列或一组列的值必须是唯一的,但与主键不同的是,唯一键允许包含 NULL 值(但通常只允许一个 NULL 值,具体取决于数据库实现)。唯一键用于保证数据唯一性,但不用于建立表间关系。
2.6 索引(Index)
索引是一种特殊的数据结构,它可以大大加快数据库查询的速度。它类似于书的目录,记录了数据存储的位置,使得数据库系统无需扫描整个表就能快速找到所需的数据。然而,索引也会占用额外的存储空间,并在数据修改(插入、更新、删除)时需要额外维护,因此会降低写操作的速度。主键和唯一键通常会自动创建索引。合理地使用索引是优化数据库性能的关键。
2.7 关系(Relationships)
关系型数据库中的表通过外键相互关联,形成不同的关系类型:
- 一对一(One-to-One): 非常少见,通常可以通过合并表来实现。例如,一个用户有一个唯一的详细资料记录。
- 一对多(One-to-Many): 最常见的关系类型。一张表的记录可以对应另一张表的多条记录,反之则只能对应一条。例如,一个客户可以下多张订单,但每张订单只属于一个客户。通过在“多”的一方表中添加外键引用“一”的一方表的主键来实现。
- 多对多(Many-to-Many): 两张表之间的记录都是多对多的关系。例如,一个学生可以选修多门课程,一门课程可以有多个学生选修。多对多关系不能直接表示,需要通过引入一个中间表(也称为关联表、连接表或桥接表)来转换成两个一对多关系。例如,创建一个
Student_Courses
表,包含student_id
和course_id
作为复合主键(或者各自都是外键),分别引用Students
表和Courses
表的主键。
第三部分:SQL 语言基础
SQL (Structured Query Language) 是用于管理关系型数据库的标准语言。MySQL 支持标准的 SQL 语法,同时也提供了一些扩展。SQL 语句大致分为以下几类:
-
DDL (Data Definition Language) 数据定义语言: 用于定义数据库、表、列、索引等数据库对象的结构。
CREATE
:创建数据库、表、视图、索引等。ALTER
:修改数据库对象的结构,如添加、删除或修改列。DROP
:删除数据库对象。TRUNCATE
:删除表中的所有行,但保留表结构(通常比DELETE
更快,且无法回滚)。
-
DML (Data Manipulation Language) 数据操作语言: 用于对数据库中的数据进行增、删、改、查操作。
INSERT
:向表中插入新数据。SELECT
:从表中检索数据。UPDATE
:修改表中现有数据。DELETE
:从表中删除数据。
-
DCL (Data Control Language) 数据控制语言: 用于管理用户权限和数据库访问控制。
GRANT
:赋予用户权限。REVOKE
:撤销用户权限。
-
TCL (Transaction Control Language) 事务控制语言: 用于管理事务。
COMMIT
:提交事务,使更改永久生效。ROLLBACK
:回滚事务,撤销未提交的更改。SAVEPOINT
:设置事务中的保存点。
接下来,我们将重点介绍 DDL 和 DML 中最常用的基础命令。
3.1 DDL 基础操作
3.1.1 创建数据库
sql
CREATE DATABASE database_name;
例如:
sql
CREATE DATABASE my_database;
3.1.2 使用数据库
在执行数据库操作之前,需要先指定要使用的数据库。
sql
USE database_name;
例如:
sql
USE my_database;
3.1.3 创建表
创建表时,需要定义表的名称、列名、每列的数据类型以及可能的约束。
sql
CREATE TABLE table_name (
column1 datatype constraints,
column2 datatype constraints,
column3 datatype constraints,
...
PRIMARY KEY (one_or_more_columns),
FOREIGN KEY (column_in_this_table) REFERENCES parent_table(column_in_parent_table)
);
常见数据类型:
- 整数类型:
INT
,TINYINT
,SMALLINT
,MEDIUMINT
,BIGINT
(有符号和无符号) - 浮点数类型:
FLOAT
,DOUBLE
- 定点数类型:
DECIMAL(M, D)
(M 是总位数,D 是小数位数) - 字符串类型:
VARCHAR(size)
(变长字符串),CHAR(size)
(定长字符串),TEXT
(大文本) - 日期和时间类型:
DATE
,TIME
,DATETIME
,TIMESTAMP
- 布尔类型: MySQL 没有专门的布尔类型,通常使用
TINYINT(1)
来表示 (0 代表 false, 非 0 代表 true)
常见约束 (Constraints):
NOT NULL
: 列值不能为空。UNIQUE
: 列值必须唯一。PRIMARY KEY
: 主键约束 (非空且唯一)。FOREIGN KEY
: 外键约束,引用其他表的列。DEFAULT value
: 为列指定默认值。AUTO_INCREMENT
: 用于整数主键,使其自动增长(每插入一条记录,值自动加 1)。
创建 Customers
表示例:
sql
CREATE TABLE Customers (
customer_id INT AUTO_INCREMENT PRIMARY KEY,
customer_name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE,
registration_date DATE DEFAULT (CURDATE()), -- 默认值为当前日期
is_active TINYINT(1) DEFAULT 1
);
创建 Orders
表示例 (与 Customers
表建立一对多关系):
sql
CREATE TABLE Orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
customer_id INT,
order_date DATETIME DEFAULT CURRENT_TIMESTAMP, -- 默认值为当前时间戳
total_amount DECIMAL(10, 2) NOT NULL,
status VARCHAR(50),
FOREIGN KEY (customer_id) REFERENCES Customers(customer_id) -- 定义外键
);
3.1.4 修改表结构
使用 ALTER TABLE
语句可以修改已存在的表结构。
-
添加列:
sql
ALTER TABLE table_name
ADD column_name datatype constraints;例如:给
Customers
表添加phone
列sql
ALTER TABLE Customers
ADD phone VARCHAR(20); -
删除列:
sql
ALTER TABLE table_name
DROP COLUMN column_name;例如:删除
Customers
表的is_active
列sql
ALTER TABLE Customers
DROP COLUMN is_active; -
修改列定义 (类型、约束等):
sql
ALTER TABLE table_name
MODIFY column_name new_datatype new_constraints;例如:修改
Customers
表的phone
列为NOT NULL
sql
ALTER TABLE Customers
MODIFY phone VARCHAR(20) NOT NULL; -
修改列名:
sql
ALTER TABLE table_name
CHANGE old_column_name new_column_name datatype constraints;例如:修改
Customers
表的customer_name
为name
sql
ALTER TABLE Customers
CHANGE customer_name name VARCHAR(100) NOT NULL;
3.1.5 删除表
sql
DROP TABLE table_name;
例如:删除 Orders
表
sql
DROP TABLE Orders;
3.1.6 删除数据库
sql
DROP DATABASE database_name;
例如:删除 my_database
数据库
sql
DROP DATABASE my_database;
请谨慎使用 DROP
命令,因为它会永久删除数据和结构。
3.2 DML 基础操作
DML 是日常数据库操作中最常用的部分,用于处理数据。
3.2.1 插入数据
使用 INSERT INTO
语句向表中添加新行。
-
插入所有列的值 (值的顺序与列定义顺序一致):
sql
INSERT INTO table_name VALUES (value1, value2, value3, ...); -
插入指定列的值:
sql
INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);
例如:向 Customers
表插入数据
“`sql
— 插入所有列 (AUTO_INCREMENT 的列可以省略或指定 NULL)
INSERT INTO Customers VALUES (NULL, ‘张三’, ‘[email protected]’, ‘2023-01-15’, 1);
— 插入指定列
INSERT INTO Customers (customer_name, email) VALUES (‘李四’, ‘[email protected]’); — registration_date 会使用默认值,is_active 会使用默认值
“`
3.2.2 查询数据
SELECT
语句是 SQL 中最强大和最常用的语句,用于从表中检索数据。
-
选择所有列:
sql
SELECT * FROM table_name;例如:查询
Customers
表所有数据sql
SELECT * FROM Customers; -
选择指定列:
sql
SELECT column1, column2 FROM table_name;例如:查询
Customers
表的customer_name
和email
sql
SELECT customer_name, email FROM Customers; -
过滤数据 (WHERE 子句): 使用
WHERE
子句指定筛选条件,只返回符合条件的行。sql
SELECT columns FROM table_name WHERE condition;condition
可以包含比较运算符 (=
,!=
,>
,<
,>=
,<=
), 逻辑运算符 (AND
,OR
,NOT
), 以及其他操作符 (LIKE
,IN
,BETWEEN
,IS NULL
等)。例如:
* 查询customer_id
为 1 的客户:```sql SELECT * FROM Customers WHERE customer_id = 1; ```
-
查询注册日期在 2023 年的客户:
sql
SELECT * FROM Customers WHERE registration_date BETWEEN '2023-01-01' AND '2023-12-31'; -
查询名字以“张”开头的客户 (使用
LIKE
和%
通配符):sql
SELECT * FROM Customers WHERE customer_name LIKE '张%'; -
查询 email 为 NULL 的客户:
sql
SELECT * FROM Customers WHERE email IS NULL; -
查询活跃且名字不是“王五”的客户:
sql
SELECT * FROM Customers WHERE is_active = 1 AND customer_name != '王五';
-
-
排序结果 (ORDER BY 子句): 使用
ORDER BY
子句对结果集进行排序。默认升序 (ASC
),可指定降序 (DESC
)。sql
SELECT columns FROM table_name WHERE condition ORDER BY column1 [ASC|DESC], column2 [ASC|DESC];例如:按注册日期降序排列客户
sql
SELECT * FROM Customers ORDER BY registration_date DESC;例如:先按活跃状态降序,再按客户 ID 升序排列客户
sql
SELECT * FROM Customers ORDER BY is_active DESC, customer_id ASC; -
限制结果数量 (LIMIT 子句): 使用
LIMIT
子句限制返回的行数,常用于分页。sql
SELECT columns FROM table_name WHERE condition ORDER BY column LIMIT offset, count;offset
是起始行的偏移量 (第一行是 0),count
是要返回的最大行数。省略offset
表示从第一行开始 (LIMIT count
等价于LIMIT 0, count
)。例如:查询注册日期最新的 5 个客户
sql
SELECT * FROM Customers ORDER BY registration_date DESC LIMIT 5;例如:查询注册日期排在第 6 到第 10 的客户 (即跳过前 5 个,取接下来的 5 个)
sql
SELECT * FROM Customers ORDER BY registration_date DESC LIMIT 5, 5; -
聚合函数 (Aggregate Functions): 用于对一组值进行计算,返回单个值。
COUNT()
: 计算行数。SUM()
: 计算数值列的总和。AVG()
: 计算数值列的平均值。MIN()
: 计算数值列的最小值。MAX()
: 计算数值列的最大值。
例如:
* 计算客户总数:```sql SELECT COUNT(*) FROM Customers; ```
-
计算订单总金额的平均值:
sql
SELECT AVG(total_amount) FROM Orders;
-
分组数据 (GROUP BY 子句): 将具有相同值的行分组,常与聚合函数一起使用。
sql
SELECT column1, aggregate_function(column2)
FROM table_name
WHERE condition
GROUP BY column1
HAVING group_condition -- 用于筛选分组后的结果
ORDER BY column1;例如:按客户 ID 分组,计算每个客户的订单数量和总金额
sql
SELECT customer_id, COUNT(order_id) AS order_count, SUM(total_amount) AS total_spent
FROM Orders
GROUP BY customer_id;例如:找出总订单金额大于 1000 的客户及其总金额
sql
SELECT customer_id, SUM(total_amount) AS total_spent
FROM Orders
GROUP BY customer_id
HAVING SUM(total_amount) > 1000;
请注意WHERE
用于筛选原始行,而HAVING
用于筛选分组后的结果。 -
连接表 (JOIN 子句): 将来自两个或多个表的行基于相关列组合在一起。
-
INNER JOIN (内连接): 只返回在两个表中都存在匹配关系的行。
sql
SELECT columns
FROM table1
INNER JOIN table2 ON table1.column = table2.column;例如:查询所有订单及其对应的客户姓名
sql
SELECT o.order_id, c.customer_name, o.order_date, o.total_amount
FROM Orders o -- 使用别名 o
INNER JOIN Customers c ON o.customer_id = c.customer_id; -- 使用别名 c -
LEFT JOIN (左连接): 返回左表中的所有行,以及右表中匹配的行。如果右表中没有匹配,则右表列的结果为 NULL。
sql
SELECT columns
FROM table1 -- Left table
LEFT JOIN table2 -- Right table
ON table1.column = table2.column;例如:查询所有客户,以及他们可能拥有的订单信息 (即使客户没有订单也会列出,订单信息为 NULL)
sql
SELECT c.customer_name, o.order_id, o.total_amount
FROM Customers c
LEFT JOIN Orders o ON c.customer_id = o.customer_id; -
RIGHT JOIN (右连接): 返回右表中的所有行,以及左表中匹配的行。如果左表中没有匹配,则左表列的结果为 NULL。(与 LEFT JOIN 类似,但左右表角色互换)
-
FULL OUTER JOIN (全外连接): 返回左表和右表中的所有行。如果任一表中没有匹配,则另一表列的结果为 NULL。MySQL 不直接支持
FULL OUTER JOIN
,可以通过LEFT JOIN
和RIGHT JOIN
的UNION
来模拟实现。
-
3.2.3 更新数据
使用 UPDATE
语句修改表中现有记录。
sql
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
WHERE
子句是可选的,但强烈建议使用!如果省略 WHERE
子句,则会更新表中的所有行。
例如:
* 更新 customer_id
为 1 的客户的 email
```sql
UPDATE Customers
SET email = '[email protected]'
WHERE customer_id = 1;
```
-
将所有状态为“待付款”的订单状态改为“已取消”
sql
UPDATE Orders
SET status = '已取消'
WHERE status = '待付款';
3.2.4 删除数据
使用 DELETE FROM
语句删除表中现有记录。
sql
DELETE FROM table_name
WHERE condition;
WHERE
子句是可选的,但强烈建议使用!如果省略 WHERE
子句,则会删除表中的所有行。
例如:
* 删除 customer_id
为 2 的客户
```sql
DELETE FROM Customers
WHERE customer_id = 2;
```
-
删除所有状态为“已完成”且早于 2023 年的订单
sql
DELETE FROM Orders
WHERE status = '已完成' AND order_date < '2023-01-01';
请注意 DELETE
逐行删除数据,并记录事务日志,通常比 TRUNCATE
慢,但支持 WHERE
子句且可以回滚(在支持事务的存储引擎如 InnoDB 下)。
第四部分:更深入的基础概念介绍
4.1 存储引擎(Storage Engines)
MySQL 的一个重要特性是其可插拔的存储引擎架构。不同的存储引擎提供了不同的功能、性能和特性。最常用的两个存储引擎是:
- InnoDB: 这是 MySQL 5.5 及更高版本的默认存储引擎。它支持事务(ACID 属性)、行级锁定、外键约束和崩溃恢复等功能,是处理大量并发请求和需要数据完整性保证的应用的首选。
- MyISAM: 曾经是默认存储引擎。它不支持事务和外键,但提供了全文索引等功能。它使用表级锁定,在高并发写操作下性能不如 InnoDB。对于读操作为主的应用,有时表现优于 InnoDB,但现代应用通常倾向于使用 InnoDB。
可以使用 SHOW ENGINES;
命令查看所有可用的存储引擎。创建表时可以通过 ENGINE=
选项指定存储引擎,例如 CREATE TABLE MyTable (...) ENGINE=MyISAM;
。如果没有指定,则使用默认引擎。
4.2 事务(Transactions)
事务是一组数据库操作,这些操作要么全部成功提交,要么全部失败回滚。事务保证了数据库操作的原子性、一致性、隔离性和持久性(ACID 属性):
- 原子性 (Atomicity): 事务是最小的执行单位,所有操作要么全部执行,要么全部不执行。
- 一致性 (Consistency): 事务执行前后,数据库从一个一致状态变为另一个一致状态。
- 隔离性 (Isolation): 并发执行的事务之间互不影响,仿佛是串行执行的。
- 持久性 (Durability): 事务一旦提交,其结果就是永久性的,即使发生系统故障也不会丢失。
MySQL 的 InnoDB 存储引擎支持事务。默认情况下,每条 SQL 语句都被视为一个独立的事务并自动提交(称为自动提交模式)。可以通过 SET autocommit = 0;
关闭自动提交,然后使用 START TRANSACTION;
或 BEGIN;
开启一个事务,最后使用 COMMIT;
提交事务或 ROLLBACK;
回滚事务。
例如一个简单的转账事务:
“`sql
SET autocommit = 0; — 关闭自动提交
START TRANSACTION; — 开启事务
— 从账户 A 扣除金额
UPDATE Accounts SET balance = balance – 100 WHERE account_id = ‘A’;
— 向账户 B 增加金额
UPDATE Accounts SET balance = balance + 100 WHERE account_id = ‘B’;
— 假设这里发生了错误,或者决定取消转账
— ROLLBACK;
— 如果一切正常,提交事务
COMMIT;
SET autocommit = 1; — 重新开启自动提交 (可选,通常保持开启)
“`
如果在 UPDATE Accounts SET balance = balance + 100 WHERE account_id = 'B';
语句执行前或执行中发生错误,或者手动执行 ROLLBACK;
,那么之前对账户 A 的扣款操作也会被撤销,保证了数据的一致性。
4.3 索引(Index) – 补充
前面简单介绍了索引用于提高查询速度。除了主键索引和唯一索引会自动创建外,还可以为其他列创建普通索引。
-
创建索引:
sql
CREATE INDEX index_name ON table_name (column1, column2, ...);例如:为
Customers
表的registration_date
列创建索引sql
CREATE INDEX idx_registration_date ON Customers (registration_date); -
删除索引:
sql
DROP INDEX index_name ON table_name;例如:删除之前创建的索引
sql
DROP INDEX idx_registration_date ON Customers;
合理地选择和创建索引是数据库性能优化的重要手段。但要注意,过多的索引会增加写操作的负担和存储空间消耗。
4.4 用户与权限管理(Users and Privileges)
数据库安全至关重要。MySQL 提供了用户账户和权限管理机制,控制哪些用户可以连接到数据库以及他们可以执行哪些操作。
-
创建用户:
sql
CREATE USER 'username'@'host' IDENTIFIED BY 'password';host
指定用户可以从哪个主机连接。'localhost'
表示只能从本机连接,'%'
表示可以从任何主机连接。例如:创建一个可以在本机登录的用户
my_user
,密码为my_password
sql
CREATE USER 'my_user'@'localhost' IDENTIFIED BY 'my_password'; -
赋予权限:
sql
GRANT privilege_type ON database_name.table_name TO 'username'@'host';
-- 或者 GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'host'; -- 赋予数据库所有表的所有权限
-- 或者 GRANT ALL PRIVILEGES ON *.* TO 'username'@'host'; -- 赋予所有数据库所有表的所有权限
-- WITH GRANT OPTION; -- 允许用户将其拥有的权限授予其他用户privilege_type
可以是SELECT
,INSERT
,UPDATE
,DELETE
,CREATE
,DROP
,ALTER
等。例如:赋予用户
my_user
在my_database
数据库所有表上的SELECT
,INSERT
,UPDATE
,DELETE
权限sql
GRANT SELECT, INSERT, UPDATE, DELETE ON my_database.* TO 'my_user'@'localhost';赋予用户
my_user
在my_database
数据库的Customers
表上的所有权限sql
GRANT ALL PRIVILEGES ON my_database.Customers TO 'my_user'@'localhost';刷新权限,使更改生效:
sql
FLUSH PRIVILEGES; -
撤销权限:
sql
REVOKE privilege_type ON database_name.table_name FROM 'username'@'host';例如:撤销用户
my_user
在my_database
数据库所有表上的DELETE
权限sql
REVOKE DELETE ON my_database.* FROM 'my_user'@'localhost'; -
删除用户:
sql
DROP USER 'username'@'host';例如:删除用户
my_user
sql
DROP USER 'my_user'@'localhost';
第五部分:连接 MySQL
与 MySQL 数据库进行交互的方式有很多:
- 命令行客户端: MySQL 提供了官方的命令行客户端,通过输入命令来连接和执行 SQL 语句。这是学习和管理数据库的基本工具。
- 图形化界面工具: 例如 MySQL Workbench (官方), phpMyAdmin (基于 Web), DBeaver, Navicat 等。这些工具提供了友好的界面,方便进行数据库结构设计、数据浏览、SQL 语句执行等操作。
- 编程语言连接器: 几乎所有主流编程语言都提供了连接 MySQL 的库或驱动,例如 Python 的
mysql-connector-python
, Java 的 JDBC 驱动, PHP 的 MySQLi 或 PDO 扩展等。这使得应用程序可以通过代码与数据库进行交互。
结论:迈出数据库学习的第一步
本文详细介绍了 MySQL 数据库的基础知识,包括数据库和 MySQL 的定义、关系模型的核心概念(表、列、行、键、索引、关系)、SQL 语言基础(DDL 和 DML 的常用命令及其示例),以及存储引擎、事务、索引、用户权限等更深入的基础概念。
掌握这些基础知识是使用和管理 MySQL 数据库的起点。数据库的学习是一个持续的过程,后续您可以进一步学习:
- 更高级的 SQL 查询(如子查询、窗口函数)。
- 数据库设计原则(如范式)。
- 数据库性能优化技巧。
- 数据库备份与恢复。
- 数据库复制与高可用架构。
- 存储过程、函数和触发器。
MySQL 作为一款功能强大且普及度极高的数据库系统,其基础知识是许多 IT 岗位(如后端开发、数据分析、DBA 等)必备的技能。希望本文能为您打开 MySQL 世界的大门,祝您在数据库学习的旅程中取得成功!