MySQL 基础 SQL 语句就那么几类,真正日常够用的不到 20 个关键词,但新手常卡在
WHERE条件写错、
GROUP BY和
SELECT字段不匹配、或者忘记加
;导致命令不执行——这些不是语法难,是习惯和边界没理清。
增删改查(CRUD)四条主线必须写对
所有操作都围绕这四个动作展开,每条语句都有不可省略的语法锚点:
INSERT INTO table_name (col1, col2) VALUES ('a', 123); —— 列名括号和值括号必须一一对应,字符串用单引号,数字不用;漏掉括号或引号会报 ERROR 1064
SELECT id, name FROM users WHERE status = 1 ORDER BY id DESC LIMIT 5;——
WHERE必须在
ORDER BY和
LIMIT之前,且不能用别名(如
SELECT name AS n FROM t WHERE n = 'x'是错的)
UPDATE products SET price = price * 0.9 WHERE sale_flag = 1;—— 永远不要省略
WHERE,否则整表数据全被改掉;执行前先用
SELECT确认范围
DELETE FROM logs WHERE created_at —— 同样不能漏 <code>WHERE;想清空表用
TRUNCATE TABLE logs;(更快,且不可回滚)
WHERE 条件里容易踩的坑
WHERE看似简单,但类型隐式转换、NULL 判断、运算符优先级经常导致查不到数据:
name = 'admin '和
name = 'admin'可能不等价(取决于字段是否为
CHAR类型,有尾部空格填充)
status != 1不会命中
status IS NULL的行,必须显式写成
status != 1 OR status IS NULL
age > 18 AND type = 'vip' OR level = 5实际执行是
(age > 18 AND type = 'vip') OR level = 5,想改成“VIP 或等级 5 且年龄超 18”,得加括号:
age > 18 AND (type = 'vip' OR level = 5)日期比较别直接拼字符串:
created_at > '2024-03-15 10:00:00'安全;而
created_at > '2024-03-15'在
DATETIME字段上会变成
'2024-03-15 00:00:00',可能漏掉当天早些时间的数据
GROUP BY 和聚合函数配合要点
只要用了
COUNT()、
SUM()、
AVG()这类函数,
SELECT中所有非聚合字段都必须出现在
GROUP BY中:
SELECT dept, COUNT(*) FROM employees GROUP BY dept;
下面这句会报错(MySQL 5.7+ 默认严格模式):
SELECT dept, name, COUNT(*) FROM employees GROUP BY dept;
因为
name没参与分组,数据库不知道该取哪一行的
name。解决方式只有三个: 把
name加进
GROUP BY(变成按部门+姓名分组) 用聚合函数包裹,如
MAX(name)或
GROUP_CONCAT(name)确认 MySQL 版本是否关闭了
ONLY_FULL_GROUP_BY(不推荐,掩盖逻辑问题)
建表和索引的最小实用组合
新手建表常只写
CREATE TABLE,但少了三样就容易后期卡死: 主键必加:
id INT PRIMARY KEY AUTO_INCREMENT,不加的话 InnoDB 会悄悄建隐藏聚簇索引,排查困难 常用查询字段及时加索引:
CREATE INDEX idx_user_status ON users(status);,但别在低区分度字段(如
gender只有男/女)上建单列索引 字符集明确指定:
CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci,避免存 emoji 或生僻字时报
ERROR 1366字段尽量
NOT NULL,除非业务真需要表达“未知”;
NULL会让索引失效、计算变复杂(比如
COUNT(col)不统计 NULL 行)
真正卡住人的从来不是语法记不住,而是
GROUP BY没配平、
WHERE漏条件、索引建在错误字段上——这些地方一错,SQL 看似跑通,结果却不对,调试成本远高于写的时候多看两眼。
