MySQL核心语法与关系型数据库操作指南
数据库基础与环境配置
数据库(DB)是用于有组织地存储数据的仓库。数据库管理系统(DBMS)则是操纵和管理这些数据库的大型软件,而SQL(结构化查询语言)是操作关系型数据库的标准编程语言。
MySQL服务管理
在Windows系统中,可以通过服务管理器(service.msc)找到MySQL服务进行启停,或者使用命令行工具:
-- 启动服务
net start mysql
-- 停止服务
net stop mysql
连接数据库可通过官方客户端工具,或在配置好系统环境变量后,通过终端执行:
mysql -u root -p
SQL语言规范与分类
SQL语句支持单行或多行编写,必须以分号(;)结尾。关键字建议大写以提高可读性,且MySQL默认不区分大小写。注释方式包括单行注释(-- 或 #)和多行注释(/* ... */)。
SQL语言主要分为四大类:
- DDL(数据定义语言):用于定义数据库对象(库、表、字段等)。
- DML(数据操作语言):用于对表中的数据进行增删改。
- DQL(数据查询语言):用于查询表中的记录。
- DCL(数据控制语言):用于管理用户及控制访问权限。
DDL:数据定义语言
数据库操作
-- 查看所有数据库
SHOW DATABASES;
-- 查看当前所在数据库
SELECT DATABASE();
-- 创建数据库(指定字符集)
CREATE DATABASE IF NOT EXISTS my_db DEFAULT CHARSET utf8mb4;
-- 删除数据库
DROP DATABASE IF EXISTS my_db;
-- 切换数据库
USE my_db;
表操作与数据类型
MySQL的数据类型主要分为数值、字符串和日期时间三大类。合理选择数据类型对存储效率和查询性能至关重要。
- 数值类型:包括
TINYINT,INT,BIGINT,FLOAT,DOUBLE,DECIMAL等。 - 字符串类型:
CHAR(定长),VARCHAR(变长),TEXT,BLOB等。注意,CHAR(n)中的n代表字符数而非字节数。 - 日期时间类型:
DATE,TIME,DATETIME,TIMESTAMP,YEAR。
-- 查看当前库所有表
SHOW TABLES;
-- 查看表结构
DESC staff;
-- 查看建表语句
SHOW CREATE TABLE staff;
-- 创建表
CREATE TABLE staff (
id INT COMMENT '员工编号',
full_name VARCHAR(50) COMMENT '姓名',
hire_date DATE COMMENT '入职日期'
) COMMENT '员工信息表';
-- 修改表结构
ALTER TABLE staff ADD nickname VARCHAR(20) COMMENT '昵称';
ALTER TABLE staff MODIFY full_name VARCHAR(100);
ALTER TABLE staff CHANGE nickname alias_name VARCHAR(30) COMMENT '别名';
ALTER TABLE staff DROP alias_name;
ALTER TABLE staff RENAME TO employee;
-- 清空表数据但保留结构
TRUNCATE TABLE employee;
DROP TABLE IF EXISTS employee;
DML:数据操作语言
DML用于对表中的数据进行插入、更新和删除操作。
-- 插入数据
INSERT INTO employee (id, full_name, hire_date) VALUES (1, 'Alice', '2023-01-15');
INSERT INTO employee VALUES (2, 'Bob', '2023-02-20');
-- 批量插入
INSERT INTO employee (id, full_name, hire_date) VALUES
(3, 'Charlie', '2023-03-10'),
(4, 'David', '2023-04-05');
-- 更新数据(务必注意WHERE条件,否则将更新全表)
UPDATE employee SET full_name = 'Alice Smith' WHERE id = 1;
-- 删除数据(同样需要注意WHERE条件)
DELETE FROM employee WHERE id = 4;
DQL:数据查询语言
SQL查询的逻辑执行顺序为:FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY -> LIMIT。理解此顺序有助于优化复杂查询。
基础与条件查询
-- 基础查询与别名
SELECT id, full_name AS name FROM employee;
-- 去重
SELECT DISTINCT hire_date FROM employee;
-- 条件查询
SELECT * FROM employee WHERE hire_date BETWEEN '2023-01-01' AND '2023-03-31';
SELECT * FROM employee WHERE full_name LIKE 'A%'; -- 模糊查询
SELECT * FROM employee WHERE id IN (1, 2, 3);
聚合函数与分组
聚合函数(COUNT, MAX, MIN, AVG, SUM)用于纵向计算,且会自动忽略NULL值。
-- 分组查询
SELECT hire_date, COUNT(*) AS emp_count
FROM employee
WHERE id > 0
GROUP BY hire_date
HAVING emp_count > 1;
-- 注意:WHERE在分组前过滤,HAVING在分组后过滤。
排序与分页
-- 排序(ASC升序,DESC降序)
SELECT * FROM employee ORDER BY hire_date DESC, id ASC;
-- 分页(LIMIT 偏移量, 条数)
SELECT * FROM employee LIMIT 0, 5; -- 查询前5条
多表查询与子查询
多表关系设计原则:一对多在"多"方建外键;多对多建立中间表包含双方外键;一对一在任意一方建外键并设置唯一约束,常用于单表拆分。查询时需通过连接条件消除无效的笛卡尔积。
-- 内连接(查询交集)
SELECT e.full_name, d.dept_name
FROM employee e
INNER JOIN department d ON e.dept_id = d.id;
-- 左外连接(保留左表所有数据)
SELECT e.full_name, d.dept_name
FROM employee e
LEFT JOIN department d ON e.dept_id = d.id;
-- 自连接(查询员工及其领导)
SELECT e1.full_name AS employee, e2.full_name AS manager
FROM employee e1
LEFT JOIN employee e2 ON e1.manager_id = e2.id;
-- 联合查询
SELECT id, full_name FROM employee WHERE id < 3
UNION
SELECT id, full_name FROM employee WHERE id > 2;
-- 子查询
SELECT * FROM employee WHERE dept_id = (SELECT id FROM department WHERE dept_name = 'IT');
DCL:数据控制语言
用于管理数据库用户和权限。
-- 创建用户
CREATE USER 'dev_user'@'localhost' IDENTIFIED BY 'SecurePass123!';
-- 授权
GRANT SELECT, INSERT ON my_db.* TO 'dev_user'@'localhost';
-- 撤销权限
REVOKE INSERT ON my_db.* FROM 'dev_user'@'localhost';
-- 删除用户
DROP USER 'dev_user'@'localhost';
内置函数与约束机制
常用内置函数
- 字符串:
CONCAT,LOWER,UPPER,LPAD,TRIM,SUBSTRING。 - 数值:
CEIL,FLOOR,MOD,RAND,ROUND。 - 日期:
CURDATE,NOW,DATE_ADD,DATEDIFF。 - 流程控制:
IF,IFNULL,CASE WHEN。
表约束
约束用于限制表中的数据,保证数据的完整性和一致性。常见约束包括:NOT NULL, UNIQUE, PRIMARY KEY, DEFAULT, CHECK, FOREIGN KEY。
CREATE TABLE project (
proj_id INT PRIMARY KEY AUTO_INCREMENT,
proj_name VARCHAR(50) NOT NULL UNIQUE,
budget DECIMAL(10, 2) CHECK (budget > 0),
status CHAR(1) DEFAULT 'A',
manager_id INT,
CONSTRAINT fk_manager FOREIGN KEY (manager_id) REFERENCES employee(id) ON UPDATE CASCADE ON DELETE SET NULL
);
事务管理与并发控制
事务是一组不可分割的操作单元,具有原子性(A)、一致性(C)、隔离性(I)和持久性(D)四大特性(ACID)。
事务操作
-- 手动开启事务
START TRANSACTION;
UPDATE account SET balance = balance - 500 WHERE user_name = 'Alice';
-- 模拟异常...
UPDATE account SET balance = balance + 500 WHERE user_name = 'Bob';
-- 提交事务
COMMIT;
-- 或回滚事务
-- ROLLBACK;
并发问题与隔离级别
并发事务可能引发脏读、不可重复读和幻读等问题。MySQL提供了四种隔离级别来解决这些问题:
- Read Uncommitted:最低级别,所有并发问题均可能发生。
- Read Committed:解决脏读。
- Repeatable Read:MySQL默认级别,解决脏读和不可重复读。
- Serializable:最高级别,解决所有并发问题,但性能最低。
-- 查看当前隔离级别
SELECT @@TRANSACTION_ISOLATION;
-- 设置隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;