熟练掌握MySQL的关键字和数据类型是编写高效SQL、进行良好数据库设计的基础。本文将从这两大核心模块入手,为你提供一份清晰的实战参考。
一、MySQL关键字详解
MySQL关键字是具有特定功能的保留字,用于指挥数据库执行建表、查询、授权等操作。它们通常具有以下特点:
- 大小写不敏感,但行业惯例是将其大写以增加代码可读性。
- 不能直接用作表名或字段名。如果必须使用,需用反引号(`)包裹。
- 按照功能划分清晰,便于学习和使用。
下面,我们将系统梳理常用的MySQL关键字。
1. 数据定义类关键字(DDL)
这类关键字用于定义和修改数据库、表等对象的结构。
- CREATE:创建数据库、表、索引等对象。
CREATE DATABASE test_db; -- 创建数据库
CREATE TABLE user(id INT); -- 创建表
- ALTER:修改已有数据库对象的结构。
ALTER TABLE user ADD COLUMN age INT; -- 为表添加字段
- DROP:删除数据库、表、索引等对象,此操作不可逆。
DROP TABLE user; -- 删除表
- TRUNCATE:快速清空表内的所有数据,但保留表结构,且操作不可回滚。
TRUNCATE TABLE user; -- 清空表数据
- RENAME:为数据库或表重命名。
RENAME TABLE user TO t_user; -- 重命名表
2. 数据操作类关键字(DML)
负责对表中的数据进行增、删、改。
- INSERT:向表中插入新数据。
INSERT INTO user(id, name) VALUES(1, 'zhangsan');
- UPDATE:更新表中已存在的数据。务必注意使用WHERE子句限定范围,否则将更新全表。
UPDATE user SET age=25 WHERE id=1;
- DELETE:删除表中的数据。同样必须配合WHERE子句使用,以防误删全表数据。
DELETE FROM user WHERE id=1;
- REPLACE:插入数据时,若主键或唯一索引冲突,则替换原有行数据。
REPLACE INTO user(id, name) VALUES(1, 'lisi');
3. 数据查询类关键字(DQL)
用于查询数据,是使用频率最高的一组关键字。
- SELECT ... FROM:指定要查询的字段和来源表。
SELECT id, name FROM user; -- 查询指定字段
SELECT * FROM user; -- 查询所有字段(生产环境慎用)
- WHERE:用于过滤数据的条件。
SELECT * FROM user WHERE age>20; -- 查询年龄大于20的记录
- GROUP BY:根据指定字段对结果集进行分组,通常与聚合函数(如COUNT, SUM)一起使用。
SELECT age, COUNT(*)
FROM user
GROUP BY age; -- 按年龄分组统计人数
- HAVING:对
GROUP BY分组后的结果进行过滤。与WHERE的区别在于,WHERE在分组前过滤原始数据,HAVING在分组后过滤聚合结果。
SELECT age, COUNT(*)
FROM user
GROUP BY age
HAVING COUNT(*)>1; -- 仅保留人数大于1的分组
- ORDER BY:对结果集进行排序。
ASC为升序(默认),DESC为降序。
SELECT * FROM user ORDER BY age DESC; -- 按年龄降序排列
- LIMIT:限制返回的记录数量,常用于分页查询。
SELECT * FROM user LIMIT 10, 20; -- 从第11条记录开始,返回20条数据
- JOIN:用于关联多个表进行查询,包括
INNER JOIN(内连接)、LEFT JOIN(左连接)等。
SELECT u.name, o.order_no
FROM user u
INNER JOIN `order` o
ON u.id=o.user_id; -- 关联查询用户及其订单信息
4. 数据控制类关键字(DCL)
主要管理用户权限。
- GRANT:授予用户权限。
GRANT SELECT ON test_db.* TO 'test_user'@'%'; -- 授予查询权限
- REVOKE:撤销用户权限。
REVOKE SELECT ON test_db.* FROM 'test_user'@'%'; -- 撤销查询权限
- CREATE USER / DROP USER:创建和删除用户。
CREATE USER 'test_user'@'%' IDENTIFIED BY '123456';
DROP USER 'test_user'@'%';
- FLUSH PRIVILEGES:权限变更后,使其立即生效(通常在使用
GRANT、REVOKE语句后执行)。
FLUSH PRIVILEGES;
5. 事务控制类关键字
用于保证事务的ACID特性(仅InnoDB等支持事务的存储引擎有效)。
6. 其他常用关键字
- IF NOT EXISTS / IF EXISTS:在创建或删除对象时使用,避免因对象已存在或不存在而报错。
CREATE TABLE IF NOT EXISTS user(id INT);
- AS:为字段或表设置别名,增强可读性。
SELECT id AS user_id, name AS user_name FROM user u;
- DISTINCT:去除查询结果中的重复行。
SELECT DISTINCT age FROM user; -- 查询不重复的年龄
- IN / NOT IN:判断某个值是否在指定的集合中。
SELECT * FROM user WHERE id IN (1,2,3);
- BETWEEN AND:选取介于两个值之间的数据范围(包含边界)。
SELECT * FROM user WHERE age BETWEEN 20 AND 30;
注意:BETWEEN的范围必须前小后大。
使用关键字时的注意事项
- 避免用作标识符:不要直接使用关键字作为表名或字段名,例如创建名为
SELECT的表。如果必须使用,请用反引号包裹:CREATE TABLE \SELECT`(id INT);`。
- 注意数据库方言:部分关键字是MySQL特有的,例如
LIMIT。在进行跨数据库(如Oracle、SQL Server)开发时需留意语法差异。
二、MySQL数据类型选择实战
选择合适的数据类型是数据库设计的关键一环,它不仅直接影响存储空间的使用效率,更关乎查询性能。如何为不同场景选择最“合适”的类型?遵循“够用就好”的原则是关键。例如,存储年龄用TINYINT而非INT,存储手机号用CHAR(11)而非VARCHAR,这些细节能显著优化存储与性能。
下表汇总了MySQL中常用的数据类型及其核心应用场景,可作为日常开发的速查指南。

希望这份关于MySQL关键字与数据类型的梳理,能帮助你更扎实地掌握SQL基础,在云栈社区的日常交流与项目实践中更加游刃有余。
|