mysql基础SQL语句包括哪些_mysql入门语法解析

来源:这里教程网 时间:2026-02-28 20:49:11 作者:

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 看似跑通,结果却不对,调试成本远高于写的时候多看两眼。

相关推荐