下面会按数据定义 (DDL)、数据操作 (DML)、数据查询 (DQL)、数据控制 (DCL) 四大类,梳理每类核心语句的标准语法,并补充示例和关键说明,帮你理解语法结构。
用于创建、修改、删除表、索引、视图等数据库对象,核心语句包括 CREATE/ALTER/DROP。
CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARACTER SET 字符集] [COLLATE 排序规则];
示例:
CREATE DATABASE IF NOT EXISTS my_db DEFAULT CHARACTER SET utf8;
CREATE TABLE [IF NOT EXISTS] 表名 ( 列名1 数据类型 [约束] [DEFAULT 默认值], 列名2 数据类型 [约束] [DEFAULT 默认值], ..., -- 表级约束 PRIMARY KEY (列名1, ...), FOREIGN KEY (列名) REFERENCES 关联表(关联列) [ON DELETE 操作] [ON UPDATE 操作], UNIQUE (列名1, ...), CHECK (条件) );
约束说明:NOT NULL(非空)、PRIMARY KEY(主键)、FOREIGN KEY(外键)、UNIQUE(唯一)、CHECK(自定义条件)。
示例:
CREATE TABLE IF NOT EXISTS user ( id INT NOT NULL PRIMARY KEY, name VARCHAR(50) NOT NULL, age SMALLINT CHECK (age > 0 AND age < 150), create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, order_id INT, FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE SET NULL );
CREATE [OR REPLACE] VIEW 视图名 [(列别名1, 列别名2, ...)] AS SELECT 语句 [WITH CHECK OPTION]; -- 确保通过视图修改的数据符合视图条件
示例:
CREATE VIEW v_user_adult AS SELECT id, name, age FROM user WHERE age >= 18;
-- 添加列 ALTER TABLE 表名 ADD [COLUMN] 列名 数据类型 [约束]; -- 修改列(类型/约束) ALTER TABLE 表名 ALTER [COLUMN] 列名 [SET DEFAULT 默认值] [DROP DEFAULT]; ALTER TABLE 表名 MODIFY [COLUMN] 列名 新数据类型; -- 删除列 ALTER TABLE 表名 DROP [COLUMN] 列名; -- 添加主键 ALTER TABLE 表名 ADD PRIMARY KEY (列名); -- 删除主键 ALTER TABLE 表名 DROP PRIMARY KEY;
示例:
-- 给user表添加phone列 ALTER TABLE user ADD COLUMN phone VARCHAR(20) UNIQUE; -- 修改age列的类型为INT ALTER TABLE user MODIFY COLUMN age INT;
-- 删除数据库 DROP DATABASE [IF EXISTS] 数据库名; -- 删除表 DROP TABLE [IF EXISTS] 表名; -- 删除视图 DROP VIEW [IF EXISTS] 视图名;
示例:
DROP TABLE IF EXISTS user;
用于插入、更新、删除表中的数据,核心语句包括 INSERT/UPDATE/DELETE。
-- 方式1:指定列插入 INSERT INTO 表名 (列名1, 列名2, ...) VALUES (值1, 值2, ...), (值1, 值2, ...); -- 支持批量插入 -- 方式2:插入查询结果 INSERT INTO 表名 (列名1, 列名2, ...) SELECT 列1, 列2, ... FROM 源表 [WHERE 条件];
示例:
-- 单条插入 INSERT INTO user (id, name, age) VALUES (1, '张三', 25); -- 批量插入 INSERT INTO user (id, name, age) VALUES (2, '李四', 30), (3, '王五', 28); -- 插入查询结果 INSERT INTO user_adult (id, name) SELECT id, name FROM user WHERE age >= 18;
UPDATE 表名 SET 列名1 = 值1, 列名2 = 值2, ... [WHERE 条件] -- 必加!否则更新全表数据 [ORDER BY 列名] -- 部分数据库支持 [LIMIT 行数]; -- 部分数据库支持
示例:
-- 更新指定用户的年龄 UPDATE user SET age = 26 WHERE id = 1; -- 批量更新(加条件) UPDATE user SET create_time = CURRENT_TIMESTAMP WHERE age < 20;
DELETE FROM 表名 [WHERE 条件] -- 必加!否则删除全表数据 [ORDER BY 列名] [LIMIT 行数]; -- 清空表(仅删除数据,保留表结构) TRUNCATE TABLE 表名;
示例:
-- 删除指定数据 DELETE FROM user WHERE id = 3; -- 清空表 TRUNCATE TABLE user_temp;
SELECT 是 ANSI SQL 中最复杂、使用最频繁的语句,完整语法如下:
SELECT [DISTINCT] 列名1 [AS 别名1], 列名2 [AS 别名2], ... | * FROM 表名1 [AS 别名1] -- 关联查询 [JOIN 表名2 [AS 别名2] ON 关联条件] [LEFT/RIGHT/FULL OUTER JOIN 表名3 ON 关联条件] [CROSS JOIN 表名4] -- 条件过滤 [WHERE 行级条件] -- 分组聚合 [GROUP BY 列名1, 列名2, ...] [HAVING 分组级条件] -- 仅对分组结果过滤 -- 排序 [ORDER BY 列名1 [ASC/DESC], 列名2 [ASC/DESC], ...] -- 分页 [LIMIT 行数 OFFSET 偏移量] | [FETCH FIRST 行数 ROWS ONLY] -- 集合操作 [UNION [ALL] SELECT 语句] [INTERSECT SELECT 语句] [EXCEPT SELECT 语句];
关键说明:
DISTINCT:去重,只返回唯一值;
JOIN:关联多表,ON 指定关联条件(如 user.order_id = orders.id);
WHERE 过滤行数据(在分组前),HAVING 过滤分组结果(在分组后);
ORDER BY 默认升序(ASC),降序用 DESC;
分页:ANSI 标准用 FETCH FIRST n ROWS ONLY,MySQL 用 LIMIT n OFFSET m,SQL Server 用 TOP n。
示例:
-- 基础查询 SELECT id, name AS 用户名, age FROM user WHERE age > 20; -- 关联查询+分组+排序 SELECT u.name, COUNT(o.id) AS 订单数 FROM user u LEFT JOIN orders o ON u.id = o.user_id GROUP BY u.name HAVING COUNT(o.id) > 0 ORDER BY 订单数 DESC FETCH FIRST 10 ROWS ONLY; -- 集合操作(合并结果) SELECT name FROM user WHERE age < 20 UNION ALL SELECT name FROM user WHERE age > 50;
用于授予 / 回收用户权限、管理事务,核心语句包括 GRANT/REVOKE/COMMIT/ROLLBACK。
GRANT 权限1, 权限2, ... ON 对象类型 对象名 TO 用户名 [WITH GRANT OPTION];
权限类型:SELECT/INSERT/UPDATE/DELETE/ALL PRIVILEGES(所有权限);对象类型:TABLE/DATABASE/VIEW 等。示例:
-- 授予用户查询user表的权限 GRANT SELECT ON TABLE user TO test_user; -- 授予用户对orders表的增删改查权限 GRANT INSERT, DELETE, UPDATE, SELECT ON TABLE orders TO test_user;
REVOKE 权限1, 权限2, ... ON 对象类型 对象名 FROM 用户名;
示例:
-- 回收用户修改user表的权限 REVOKE UPDATE ON TABLE user FROM test_user;
-- 开始事务(部分数据库隐式开始,无需显式执行) START TRANSACTION; -- 提交事务(永久保存修改) COMMIT; -- 回滚事务(撤销所有修改) ROLLBACK; -- 设置保存点 SAVEPOINT 保存点名; -- 回滚到保存点 ROLLBACK TO 保存点名;
示例:
START TRANSACTION; INSERT INTO user (id, name) VALUES (4, '赵六'); UPDATE orders SET user_id = 4 WHERE id = 100; -- 验证无误后提交 COMMIT; -- 若出错则回滚 -- ROLLBACK;
(1)大小写:ANSI SQL 不区分关键字大小写(如 SELECT 和 select 等效),但建议关键字大写、标识符(表 / 列名)小写,增强可读性;
(2)分号:每条语句以分号 ; 结尾(ANSI 标准);
(3)注释:单行注释用 -- 注释内容,多行注释用 /* 注释内容 */;
(4)兼容性:上述语法是 ANSI 标准,不同数据库有细微差异(如 MySQL 的 LIMIT、Oracle 的 ROWNUM),跨库开发需优先使用标准语法。