📌 MySQL 语句大全(完整实用教程)
📌 1. 数据库操作
✅ 创建数据库
CREATE DATABASE mydb; -- 创建名为 mydb 的数据库
✅ 使用数据库
USE mydb; -- 选择数据库
✅ 删除数据库
DROP DATABASE mydb; -- 删除数据库(谨慎使用)
⚠️ 注意点:
- 删除数据库会 丢失所有数据,操作前需备份!
📌 2. 表操作
✅ 创建表
CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT, -- 自增主键name VARCHAR(50) NOT NULL, -- 不能为空age INT DEFAULT 18, -- 默认值 18email VARCHAR(100) UNIQUE -- 唯一约束
);
✅ 查看表结构
DESC users; -- 查看表的字段信息
SHOW CREATE TABLE users; -- 查看完整建表语句
✅ 修改表
ALTER TABLE users ADD phone VARCHAR(20); -- 添加新列
ALTER TABLE users MODIFY name VARCHAR(100); -- 修改字段类型
ALTER TABLE users DROP COLUMN phone; -- 删除列
✅ 删除表
DROP TABLE users; -- 删除表(谨慎使用)
⚠️ 注意点:
DROP TABLE
不可恢复,需谨慎。ALTER TABLE
可能 影响性能,大表操作前需测试。
📌 3. 数据操作(CRUD)
✅ 插入数据
INSERT INTO users (name, age, email) VALUES ('Alice', 25, 'alice@example.com');
✅ 批量插入数据
INSERT INTO users (name, age, email) VALUES('Bob', 30, 'bob@example.com'),('Charlie', 22, 'charlie@example.com');
✅ 查询数据
SELECT * FROM users; -- 查询所有字段
SELECT name, age FROM users; -- 查询指定字段
SELECT * FROM users WHERE age > 25; -- 条件查询
SELECT * FROM users ORDER BY age DESC; -- 按年龄降序排列
SELECT * FROM users LIMIT 5; -- 取前 5 条记录
✅ 更新数据
UPDATE users SET age = 26 WHERE name = 'Alice'; -- 更新 Alice 的年龄
✅ 删除数据
DELETE FROM users WHERE name = 'Bob'; -- 删除 Bob
⚠️ 注意点:
DELETE
语句如果没有WHERE
,会删除整个表的数据。- 可使用
LIMIT
限制删除的条数。
📌 4. 约束(Constraints)
✅ 主键约束
CREATE TABLE orders (id INT PRIMARY KEY AUTO_INCREMENT,order_number VARCHAR(20) NOT NULL UNIQUE
);
✅ 外键约束
CREATE TABLE orders (id INT PRIMARY KEY AUTO_INCREMENT,user_id INT,FOREIGN KEY (user_id) REFERENCES users(id)
);
⚠️ 注意点:
FOREIGN KEY
约束确保数据一致性,删除或更新数据时需注意级联操作。
📌 5. 高级查询
✅ 聚合函数
SELECT COUNT(*) FROM users; -- 统计总人数
SELECT AVG(age) FROM users; -- 计算平均年龄
SELECT MAX(age), MIN(age) FROM users; -- 查找最大、最小年龄
✅ 分组查询(GROUP BY)
SELECT age, COUNT(*) FROM users GROUP BY age; -- 按年龄分组统计人数
✅ 连接查询(JOIN)
SELECT users.name, orders.order_number
FROM users
JOIN orders ON users.id = orders.user_id;
⚠️ 注意点:
JOIN
操作会影响性能,大数据量时需优化索引。
📌 6. 事务控制(Transactions)
✅ 开启事务
START TRANSACTION;
✅ 执行事务
UPDATE users SET age = 40 WHERE name = 'Alice';
COMMIT; -- 提交事务
✅ 回滚事务
ROLLBACK; -- 回滚到事务开始前
⚠️ 注意点:
- 事务适用于 银行转账、订单处理等操作,确保数据一致性。
📌 7. 索引(Indexes)
✅ 创建索引
CREATE INDEX idx_name ON users(name); -- 创建索引
✅ 查看索引
SHOW INDEX FROM users; -- 查看索引
✅ 删除索引
DROP INDEX idx_name ON users;
⚠️ 注意点:
- 索引加速查询,但会降低写入速度,需平衡。
📌 8. 备份 & 恢复
✅ 备份数据库
mysqldump -u root -p mydb > mydb_backup.sql # 备份数据库
✅ 恢复数据库
mysql -u root -p mydb < mydb_backup.sql # 还原数据库
⚠️ 注意点:
- 定期备份数据,避免数据丢失。
📌 9. 常见问题 & 解决方案
⚠️ 端口占用(3306 被占用)
netstat -tulnp | grep 3306 # 查看占用进程
kill -9 <PID> # 终止进程
⚠️ root 用户无权限
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourpassword';
FLUSH PRIVILEGES;
📌 触发器(Triggers)
🔹 什么是触发器?
触发器(Trigger)是一种特殊的存储过程,在对数据库表执行 INSERT
、UPDATE
或 DELETE
操作时自动触发执行。用于 数据验证、日志记录、自动更新等。
✅ 创建触发器(案例)
CREATE TRIGGER before_insert_users
BEFORE INSERT ON users
FOR EACH ROW
SET NEW.name = UPPER(NEW.name);
📌 说明:
- 该触发器在
users
表执行INSERT
语句之前触发, - 将新插入的
name
字段转换为大写。
✅ 删除触发器
DROP TRIGGER IF EXISTS before_insert_users;
⚠️ 注意点:
- 触发器不能被
ALTER
修改,如需修改,需先DROP
再CREATE
。 - 触发器执行过程中不能直接修改同一个表的数据,否则会引发递归调用。
📌 存储过程(Stored Procedures)
🔹 什么是存储过程?
存储过程(Stored Procedure)是一组预编译的 SQL 语句集合,封装一系列数据库操作,提高执行效率并减少代码重复。
✅ 创建存储过程(案例)
DELIMITER $$
CREATE PROCEDURE GetUserCount()
BEGINSELECT COUNT(*) FROM users;
END $$
DELIMITER ;
📌 说明:
DELIMITER $$
用于改变默认的;
结束符,防止CREATE PROCEDURE
语句因;
过早终止。GetUserCount
存储过程用于统计users
表的总记录数。
✅ 调用存储过程
CALL GetUserCount();
✅ 删除存储过程
DROP PROCEDURE IF EXISTS GetUserCount;
⚠️ 注意点:
- 存储过程适用于 重复执行的复杂 SQL 操作,如报表查询、数据批量更新等。
- 存储过程可接收 输入参数 并返回 输出参数。
📌 游标(Cursors)
🔹 什么是游标?
游标(Cursor)用于 遍历查询结果集,通常用于存储过程中的批量数据处理。
✅ 声明游标
DECLARE cur CURSOR FOR SELECT name FROM users;
✅ 使用游标(案例)
DELIMITER $$
CREATE PROCEDURE PrintAllUserNames()
BEGINDECLARE done INT DEFAULT 0;DECLARE username VARCHAR(255);DECLARE cur CURSOR FOR SELECT name FROM users;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;OPEN cur;FETCH cur INTO username;WHILE done = 0 DO-- 这里可以对 username 进行进一步处理SELECT username;FETCH cur INTO username;END WHILE;CLOSE cur;
END $$
DELIMITER ;
📌 说明:
DECLARE cur CURSOR FOR
声明游标,指定查询语句。OPEN cur;
打开游标。FETCH cur INTO username;
获取一行数据。CLOSE cur;
关闭游标。
✅ 调用游标
CALL PrintAllUserNames();
⚠️ 注意点:
- 使用
DECLARE CONTINUE HANDLER
捕获游标遍历结束时的NOT FOUND
事件。 WHILE done = 0 DO
循环执行FETCH
语句,直到数据全部遍历完毕。