当前位置:首页 > 问答 > 正文

数据库管理|SQL操作|MySQL命令归纳与常用指令总结

SQL操作与MySQL常用指令速查手册

场景引入:当新同事接手了数据库...

"这查询怎么要跑10分钟?" 午休时听到隔壁工位传来崩溃的嘀咕,新来的开发小张正对着满屏的SELECT * FROM million_data_table发愁,作为过来人,我递过一杯咖啡:"试试加个索引?或者用EXPLAIN看看执行计划?"

数据库就像公司的仓库,SQL是搬运数据的叉车,会用的人事半功倍,不会用的可能直接把货架撞翻,下面这份实战指南,帮你从手忙脚乱到游刃有余。


基础生存指令(必背5条)

  1. 登录MySQL

    mysql -u 用户名 -p  # 会提示输入密码
  2. 查看所有数据库

    数据库管理|SQL操作|MySQL命令归纳与常用指令总结

    SHOW DATABASES;  -- 注意别拼错成"SHOW DATABASE"
  3. 切换数据库

    USE 数据库名;  -- 相当于进入不同仓库
  4. 查看当前库所有表

    SHOW TABLES;  -- 重要!误操作前先确认表名
  5. 紧急退出

    \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;

避坑指南

  1. 生产环境慎用

    数据库管理|SQL操作|MySQL命令归纳与常用指令总结

    DROP TABLE/DATABASE;  -- 删库跑路警告
    UPDATE/DELETE 不带WHERE条件; -- 全表覆写惨案
  2. 日期处理陷阱

    -- 错误写法(2025年失效)
    SELECT * FROM orders WHERE create_time > '2025-08-01';
    -- 正确写法(动态日期)
    SELECT * FROM orders WHERE create_time > DATE_SUB(NOW(), INTERVAL 30 DAY);
  3. 编码问题预防

    -- 建表时强制UTF8MB4(支持emoji)
    CREATE TABLE chats (
        content TEXT
    ) DEFAULT CHARSET=utf8mb4;

记住这些指令就像记住厨房里的调味料位置——刚开始总要翻柜子,用多了自然信手拈来,建议保存这份清单,下次写SQL前快速扫一眼,哪天当你脱口而出"这个JOIN需要加索引覆盖"时,说明已经从小白晋级为真正的数据管家了。

(完)

数据库管理|SQL操作|MySQL命令归纳与常用指令总结

本文基于2025年8月MySQL 8.2版本常用功能整理,部分语法可能随版本变化,执行关键操作前建议先在测试环境验证。

发表评论