MySQL语句是与关系型数据库交互的基础工具,按照功能可以划分为数据定义语言、数据操纵语言和数据查询语言三大部分。理解每一类语句的作用与写法,是后续做业务开发和数据管理的第一步。很多看似复杂的报表查询,拆解开来也就是几类基础语句的组合。

一、数据定义语言:建表与改表
数据定义语言(DDL)用来创建和修改数据库结构,最典型的就是CREATE TABLE、ALTER TABLE和DROP TABLE。在新建一张用户表时,需要明确每个字段的类型与约束,这直接决定了后续能存什么数据、怎么存。
比如下面这段建表语句,我们限制了用户名为变长字符串且不能为空,年龄使用无符号整数,并指定主键为id。类型选错会导致空间浪费或写入失败,例如用CHAR存长度不定的名字就会补空格。
CREATE TABLE user (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
age TINYINT UNSIGNED DEFAULT 0,
created_at DATETIME
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
如果后期要新增一列邮箱,可以用ALTER TABLE完成,而不必删表重建。这种结构变更操作在线上环境要谨慎,大表加字段可能锁表影响访问。
ALTER TABLE user ADD COLUMN email VARCHAR(100) NOT NULL DEFAULT '';
二、数据操纵语言:增删改
数据操纵语言(DML)负责表中具体数据的写入、更新和删除,对应INSERT、UPDATE和DELETE。插入数据时建议显式写出列名,这样即使表结构顺序调整,语句也不会出错。
以下示例向user表插入一条记录。若省略列名,则需严格按照建表顺序提供所有值,维护成本高。更新和删除操作必须带WHERE条件,否则会波及全表,这是新手最常见的事故来源。
INSERT INTO user (username, age, created_at) VALUES ('张三', 28, NOW());
UPDATE user SET age = 29 WHERE username = '张三';
DELETE FROM user WHERE id = 1;
在执行DELETE前,可以先用SELECT对照确认目标行,或者开启事务以便回滚。生产环境中直接裸删是非常危险的动作。
三、数据查询语言:SELECT基础
SELECT是使用频率最高的语句,基本结构包含SELECT、FROM、WHERE、ORDER BY等子句。它按照_FROM先定位表,WHERE过滤行,SELECT挑选列,最后排序_的顺序逻辑执行,而非书写顺序。
下面查询年龄大于十八岁的用户,按创建时间倒序取前十条。WHERE里可以用比较符和LIKE做模糊匹配,但前置百分号会导致索引失效,应尽量避免。
SELECT id, username, age FROM user WHERE age > 18 ORDER BY created_at DESC LIMIT 10;
当需要做统计时,可用GROUP BY分组并结合聚合函数。注意分组后过滤要用HAVING而不是WHERE,因为WHERE在分组前生效,无法识别聚合结果。
SELECT age, COUNT(*) AS cnt FROM user GROUP BY age HAVING cnt > 5;
四、常见入门误区与建议
初学者常把CHAR和VARCHAR混用,前者定长补空格,后者按实际长度存。还有人以为写SELECT * 方便,但在宽表上会多读无用列,增加IO。另外,在WHERE中对字段使用函数也会让索引失效。
建议从单表语句练起,先熟练INSERT与SELECT的各种条件,再过渡到JOIN多表查询。配合EXPLAIN观察执行计划,能直观看到语句是否走了索引,从而写出更稳更快的MySQL语句。