MySQL 语句教程博客 MySQL 是目前广泛应用的关系型数据库管理系统,本文将详细介绍 MySQL 中常用的 SQL 语句及其应用,内容主要涵盖以下部分:
DDL(数据定义语言)
DML(数据操作语言)
DQL(数据查询语言)
多表设计与关系建模
通过本教程,你将对 MySQL 的基本操作有全面深入的了解,从表的创建、修改,到数据的插入、更新,再到复杂查询和多表设计的最佳实践。
一、数据定义语言(DDL)
DDL 主要用于定义数据库对象(如数据库、表、索引、视图等)的结构。主要命令包括 CREATE、ALTER、DROP、TRUNCATE 等。
1.1 CREATE 命令
创建数据库:
CREATE DATABASE my_database;
创建数据表:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
hire_date DATE,
salary DECIMAL(10,2)
);
说明:
AUTO_INCREMENT 用于生成自动递增的主键值。
NOT NULL 表示该字段不能为空。
UNIQUE 限制确保数据唯一性。
1.2 ALTER 命令
添加字段:
ALTER TABLE employees ADD COLUMN phone VARCHAR(20);
修改字段数据类型或属性:
ALTER TABLE employees MODIFY COLUMN salary DECIMAL(12,2);
删除字段:
ALTER TABLE employees DROP COLUMN phone;
1.3 DROP 命令
删除表:
DROP TABLE employees;
删除数据库:
DROP DATABASE my_database;
1.4 TRUNCATE 命令
清空表数据,但保留表结构:
TRUNCATE TABLE employees;
注意:
使用 TRUNCATE 命令时,表结构不会被删除,且操作通常比 DELETE 快,但不能回滚(取决于事务支持)。
二、数据操作语言(DML)
DML 主要用于操作表中的数据,常用命令包括 INSERT、UPDATE 和 DELETE。
2.1 INSERT 命令
插入单条记录:
INSERT INTO employees (first_name, last_name, email, hire_date, salary)
VALUES ('John', 'Doe', 'john.doe@example.com', '2025-03-01', 5000.00);
插入多条记录:
INSERT INTO employees (first_name, last_name, email, hire_date, salary)
VALUES
('Jane', 'Smith', 'jane.smith@example.com', '2025-02-15', 5500.00),
('Mike', 'Johnson', 'mike.johnson@example.com', '2025-01-20', 4800.00);
2.2 UPDATE 命令
更新单个字段:
UPDATE employees
SET salary = 6000.00
WHERE id = 1;
更新多个字段:
UPDATE employees
SET salary = 6200.00, email = 'john.new@example.com'
WHERE id = 1;
2.3 DELETE 命令
删除符合条件的记录:
DELETE FROM employees
WHERE id = 1;
删除所有记录(不删除表结构):
DELETE FROM employees;
注意:
使用 DELETE 时一定要加 WHERE 条件,避免误删所有数据。
三、数据查询语言(DQL)
DQL 用于查询数据库中的数据,主要通过 SELECT 语句来实现,支持复杂查询、聚合计算、排序、分组、分页等功能。
3.1 基本查询
查询所有字段:
SELECT * FROM employees;
查询指定字段:
SELECT first_name, last_name, email FROM employees;
3.2 条件查询
使用 WHERE 子句:
SELECT * FROM employees
WHERE salary > 5000;
使用逻辑操作符:
SELECT * FROM employees
WHERE salary > 5000 AND hire_date >= '2025-01-01';
3.3 排序查询
ORDER BY 子句:
SELECT * FROM employees
ORDER BY hire_date DESC;
3.4 分组查询与聚合函数
GROUP BY 与聚合函数:
SELECT department, COUNT(*) AS num_employees, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;
3.5 分页查询
LIMIT 子句(MySQL 常用):
SELECT * FROM employees
ORDER BY id
LIMIT 10 OFFSET 20;
说明:
OFFSET 用于跳过前面的记录。
MySQL 也可以直接使用
LIMIT 20, 10
表示跳过 20 行,取 10 行数据
四、多表设计与关系建模
在实际应用中,一个数据库往往包含多个表,合理设计多表结构不仅能保证数据的完整性和一致性,还能提高查询效率。
4.1 数据库范式与规范化
第一范式(1NF):
表中的字段应为原子值,即不能包含多个值。第二范式(2NF):
在满足 1NF 的基础上,非主属性必须完全依赖于主键。第三范式(3NF):
在满足 2NF 的基础上,消除传递依赖,使非主属性不依赖于其他非主属性。
通过规范化设计,可以降低数据冗余和异常更新的风险。
4.2 表与表之间的关系
4.2.1 一对一关系
描述:
每个表中的记录在另一表中有且只有一条对应记录。实现方式:
通常在其中一个表中设置唯一外键约束。CREATE TABLE user_profiles ( user_id INT PRIMARY KEY, bio TEXT, avatar VARCHAR(255), FOREIGN KEY (user_id) REFERENCES users(id) );
4.2.2 一对多关系
描述:
一个主表记录对应多条从表记录。实现方式:
在从表中设置外键引用主表的主键。CREATE TABLE orders ( order_id INT AUTO_INCREMENT PRIMARY KEY, user_id INT, order_date DATE, total DECIMAL(10,2), FOREIGN KEY (user_id) REFERENCES users(id) );
4.2.3 多对多关系
描述:
两个表之间的记录可以相互关联多次。实现方式:
通过创建关联表(中间表)来实现。CREATE TABLE students ( student_id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) ); CREATE TABLE courses ( course_id INT AUTO_INCREMENT PRIMARY KEY, course_name VARCHAR(100) ); CREATE TABLE student_courses ( student_id INT, course_id INT, PRIMARY KEY (student_id, course_id), FOREIGN KEY (student_id) REFERENCES students(student_id), FOREIGN KEY (course_id) REFERENCES courses(course_id) );
说明:
中间表
student_courses
的复合主键确保了学生和课程的组合唯一性。利用 JOIN 语句可以在查询时联结多个表的数据。
4.3 索引设计
合理使用索引可以大幅提升查询效率,但也会增加写操作的成本。常见的索引类型包括:
普通索引: 提高查询速度,但不限制唯一性。
唯一索引: 除了加快查询速度,还保证数据的唯一性。
全文索引: 针对文本数据的快速搜索。
示例:
CREATE INDEX idx_lastname ON employees(last_name); CREATE UNIQUE INDEX idx_email ON employees(email);
4.4 外键约束
外键用于保证数据的一致性和完整性,防止孤立数据的产生。外键约束的使用需要注意:
需要确保被引用的字段为主键或具有唯一约束。
更新或删除数据时,需考虑级联操作(CASCADE、SET NULL、RESTRICT 等)。
CREATE TABLE orders ( order_id INT AUTO_INCREMENT PRIMARY KEY, user_id INT, order_date DATE, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ON UPDATE CASCADE );
五、总结
本教程从基础到进阶,全面介绍了 MySQL 的 SQL 语句及多表设计的各个方面:
DDL 提供了创建、修改、删除数据库对象的能力。
DML 让我们能够灵活操作数据记录。
DQL 通过强大的查询功能帮助我们高效获取数据。
多表设计 则为复杂应用的数据组织提供了结构支持,确保数据完整性与高效查询。