1. MySQL基础语句入门指南
作为最流行的开源关系型数据库,MySQL在Web开发、数据分析等领域占据着重要地位。掌握MySQL基础语句是每位开发者必备的技能。本文将系统介绍MySQL的核心操作语句,从数据库创建到数据增删改查,帮助初学者快速上手。
1.1 数据库基本操作
创建数据库是使用MySQL的第一步,语法简单但有几个关键点需要注意:
sql复制CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
提示:强烈建议显式指定字符集为utf8mb4而非utf8,因为utf8mb4支持完整的Unicode字符(包括emoji),而MySQL中的utf8实际上是阉割版的UTF-8。
查看已有数据库列表:
sql复制SHOW DATABASES;
切换当前使用的数据库:
sql复制USE mydb;
删除数据库(谨慎操作):
sql复制DROP DATABASE mydb;
在实际项目中,我建议为每个应用创建独立的数据库,并通过不同用户账号控制访问权限,而不是所有应用共用一个数据库。
1.2 数据表操作
创建表时需要定义字段名、数据类型和约束条件:
sql复制CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL UNIQUE,
password_hash CHAR(60) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB;
几个关键点:
- 主键建议使用自增INT而非UUID,查询性能更好
- 密码存储应使用哈希值而非明文
- 时间戳字段自动维护创建和更新时间
- InnoDB引擎支持事务和外键,是大多数场景的最佳选择
查看表结构:
sql复制DESCRIBE users;
修改表结构(添加列):
sql复制ALTER TABLE users ADD COLUMN last_login TIMESTAMP NULL;
删除表:
sql复制DROP TABLE users;
2. 数据增删改查(CRUD)操作
2.1 插入数据
基本插入语句:
sql复制INSERT INTO users (username, email, password_hash)
VALUES ('john_doe', 'john@example.com', '$2y$10$N9qo8uLOickgx2ZMRZoMy...');
批量插入更高效:
sql复制INSERT INTO users (username, email, password_hash) VALUES
('user1', 'user1@example.com', 'hash1'),
('user2', 'user2@example.com', 'hash2'),
('user3', 'user3@example.com', 'hash3');
2.2 查询数据
基础查询:
sql复制SELECT * FROM users;
带条件的查询:
sql复制SELECT username, email FROM users WHERE created_at > '2023-01-01' ORDER BY username LIMIT 10;
模糊查询:
sql复制SELECT * FROM users WHERE email LIKE '%@gmail.com';
分页查询:
sql复制SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 20; -- 第3页,每页10条
2.3 更新数据
单条更新:
sql复制UPDATE users SET email = 'new_email@example.com' WHERE id = 1;
批量更新:
sql复制UPDATE users SET status = 'inactive' WHERE last_login < DATE_SUB(NOW(), INTERVAL 1 YEAR);
2.4 删除数据
删除特定记录:
sql复制DELETE FROM users WHERE id = 1;
清空表(不可恢复):
sql复制TRUNCATE TABLE users;
重要提示:生产环境执行DELETE前务必先备份数据或使用事务。我曾遇到过因为忘记加WHERE条件导致全表数据被误删的事故。
3. 高级查询技巧
3.1 连接查询
内连接(只返回匹配的行):
sql复制SELECT u.username, o.order_date, o.amount
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
左连接(返回左表所有行):
sql复制SELECT u.username, COUNT(o.id) AS order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id;
3.2 聚合函数
常用聚合函数:
sql复制SELECT
COUNT(*) AS total_users,
AVG(age) AS avg_age,
MAX(created_at) AS newest_user,
MIN(created_at) AS oldest_user
FROM users;
带分组的聚合:
sql复制SELECT
country,
COUNT(*) AS user_count,
AVG(age) AS avg_age
FROM users
GROUP BY country
HAVING COUNT(*) > 10;
3.3 子查询
WHERE子句中的子查询:
sql复制SELECT * FROM products
WHERE price > (SELECT AVG(price) FROM products);
FROM子句中的子查询:
sql复制SELECT dept.name, emp_count.count
FROM departments dept
JOIN (
SELECT department_id, COUNT(*) AS count
FROM employees
GROUP BY department_id
) emp_count ON dept.id = emp_count.department_id;
4. 事务与锁定
4.1 基本事务操作
sql复制START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
-- 或者出错时 ROLLBACK;
4.2 隔离级别
查看当前隔离级别:
sql复制SELECT @@transaction_isolation;
设置隔离级别:
sql复制SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
4.3 行锁与表锁
SELECT加锁:
sql复制SELECT * FROM orders WHERE id = 1 FOR UPDATE; -- 排他锁
SELECT * FROM products WHERE stock > 0 LOCK IN SHARE MODE; -- 共享锁
5. 索引优化
5.1 创建索引
单列索引:
sql复制CREATE INDEX idx_email ON users(email);
复合索引:
sql复制CREATE INDEX idx_name_country ON users(last_name, country);
唯一索引:
sql复制CREATE UNIQUE INDEX idx_username ON users(username);
5.2 查看索引
sql复制SHOW INDEX FROM users;
5.3 索引使用分析
使用EXPLAIN分析查询:
sql复制EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';
关键指标:
- type:最好达到ref或const级别
- possible_keys:可能使用的索引
- key:实际使用的索引
- rows:预估扫描行数
6. 常见问题与解决方案
6.1 连接数过多
查看当前连接:
sql复制SHOW STATUS LIKE 'Threads_connected';
解决方案:
- 优化应用代码,及时关闭数据库连接
- 增加连接池大小
- 设置wait_timeout参数自动关闭空闲连接
6.2 慢查询排查
开启慢查询日志:
sql复制SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1; -- 超过1秒的查询
分析慢查询日志:
bash复制mysqldumpslow -s t /var/log/mysql/mysql-slow.log
6.3 数据备份与恢复
使用mysqldump备份:
bash复制mysqldump -u root -p mydb > mydb_backup.sql
恢复备份:
bash复制mysql -u root -p mydb < mydb_backup.sql
对于大型数据库,建议使用物理备份工具如Percona XtraBackup。
7. 性能优化建议
- **避免SELECT ***:只查询需要的列
- 合理使用索引:为常用查询条件创建索引,但不要过度索引
- 批量操作:用批量INSERT替代单条INSERT
- 预处理语句:防止SQL注入同时提高重复查询性能
- 适当分表:大表考虑按时间或ID范围分表
- 定期维护:OPTIMIZE TABLE和ANALYZE TABLE
在最近的一个电商项目中,通过添加合适的复合索引和优化查询语句,我们将订单查询的响应时间从2秒降低到了200毫秒以下。关键是为WHERE、JOIN和ORDER BY子句中的列创建了覆盖索引。
MySQL的学习曲线相对平缓,但要真正掌握其精髓需要不断实践。建议初学者从这些基础语句开始,逐步深入到性能调优、高可用架构等高级主题。每个项目都要注意SQL注入防护,永远不要信任用户输入,使用预处理语句绑定参数。
