上一篇
"这查询怎么要跑10分钟?" 午休时听到隔壁工位传来崩溃的嘀咕,新来的开发小张正对着满屏的SELECT * FROM million_data_table
发愁,作为过来人,我递过一杯咖啡:"试试加个索引?或者用EXPLAIN
看看执行计划?"
数据库就像公司的仓库,SQL是搬运数据的叉车,会用的人事半功倍,不会用的可能直接把货架撞翻,下面这份实战指南,帮你从手忙脚乱到游刃有余。
登录MySQL
mysql -u 用户名 -p # 会提示输入密码
查看所有数据库
SHOW DATABASES; -- 注意别拼错成"SHOW DATABASE"
切换数据库
USE 数据库名; -- 相当于进入不同仓库
查看当前库所有表
SHOW TABLES; -- 重要!误操作前先确认表名
紧急退出
\q -- 或者Ctrl+D,比慢慢找exit按钮快多了
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键', username VARCHAR(50) NOT NULL COMMENT '用户名', age TINYINT UNSIGNED DEFAULT 18 COMMENT '年龄', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
-- 增加字段 ALTER TABLE users ADD COLUMN gender ENUM('M','F') AFTER age; -- 修改字段类型(小心数据丢失!) ALTER TABLE users MODIFY COLUMN username VARCHAR(100); -- 删除字段 ALTER TABLE users DROP COLUMN gender;
-- 结构+数据全备份 CREATE TABLE users_backup AS SELECT * FROM users; -- 仅备份结构 CREATE TABLE users_empty LIKE users;
-- 明确指定字段(防止表结构变更导致问题) INSERT INTO users (username, age) VALUES ('老王', 28), ('小李', DEFAULT); -- 使用DEFAULT值
-- 批量更新(避免逐条提交) UPDATE products SET price = price * 0.9 WHERE category = '电子产品'; -- 使用CASE条件更新 UPDATE employees SET salary = CASE WHEN performance > 90 THEN salary * 1.2 ELSE salary * 1.05 END;
-- 先SELECT确认再DELETE(重要!) SELECT * FROM logs WHERE create_time < '2020-01-01'; DELETE FROM logs WHERE create_time < '2020-01-01' LIMIT 1000; -- 分批删除
-- 避免SELECT * SELECT id, username FROM users WHERE status=1; -- 分页查询标准写法 SELECT * FROM articles ORDER BY id DESC LIMIT 20 OFFSET 40; -- 第3页
-- 统计不同年龄段人数 SELECT CASE WHEN age<20 THEN '青少年' WHEN age<40 THEN '青年' ELSE '中老年' END AS age_group, COUNT(*) AS count FROM users GROUP BY age_group; -- 查找重复数据 SELECT email, COUNT(*) FROM customers GROUP BY email HAVING COUNT(*) > 1;
-- 内连接(只返回匹配记录) SELECT o.order_id, u.username FROM orders o JOIN users u ON o.user_id = u.id; -- 左连接(保留左表所有记录) SELECT d.name, COUNT(e.id) AS emp_count FROM departments d LEFT JOIN employees e ON d.id = e.dept_id GROUP BY d.id;
EXPLAIN SELECT * FROM orders WHERE user_id = 100; -- 重点看type列:ALL全表扫描→ref索引查询
-- 添加索引 ALTER TABLE users ADD INDEX idx_username (username); -- 查看表索引 SHOW INDEX FROM users; -- 删除冗余索引 DROP INDEX idx_redundant ON some_table;
-- 查看表大小(MB单位) SELECT table_name AS '表名', ROUND(data_length/1024/1024, 2) AS '数据大小(MB)', ROUND(index_length/1024/1024, 2) AS '索引大小(MB)' FROM information_schema.TABLES WHERE table_schema = '你的数据库名'; -- 定期优化表(碎片整理) OPTIMIZE TABLE large_table;
生产环境慎用
DROP TABLE/DATABASE; -- 删库跑路警告 UPDATE/DELETE 不带WHERE条件; -- 全表覆写惨案
日期处理陷阱
-- 错误写法(2025年失效) SELECT * FROM orders WHERE create_time > '2025-08-01'; -- 正确写法(动态日期) SELECT * FROM orders WHERE create_time > DATE_SUB(NOW(), INTERVAL 30 DAY);
编码问题预防
-- 建表时强制UTF8MB4(支持emoji) CREATE TABLE chats ( content TEXT ) DEFAULT CHARSET=utf8mb4;
记住这些指令就像记住厨房里的调味料位置——刚开始总要翻柜子,用多了自然信手拈来,建议保存这份清单,下次写SQL前快速扫一眼,哪天当你脱口而出"这个JOIN需要加索引覆盖"时,说明已经从小白晋级为真正的数据管家了。
(完)
本文基于2025年8月MySQL 8.2版本常用功能整理,部分语法可能随版本变化,执行关键操作前建议先在测试环境验证。
本文由 宓冰心 于2025-08-04发表在【云服务器提供商】,文中图片由(宓冰心)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/537380.html
发表评论