SQL 附录:SQL 语句语法

下面会按数据定义 (DDL)、数据操作 (DML)、数据查询 (DQL)、数据控制 (DCL) 四大类,梳理每类核心语句的标准语法,并补充示例和关键说明,帮你理解语法结构。

数据定义语言 (DDL)

用于创建、修改、删除表、索引、视图等数据库对象,核心语句包括 CREATE/ALTER/DROP。

CREATE(创建对象)

(1)创建数据库

CREATE DATABASE [IF NOT EXISTS] 数据库名
[DEFAULT CHARACTER SET 字符集]
[COLLATE 排序规则];

示例:

CREATE DATABASE IF NOT EXISTS my_db DEFAULT CHARACTER SET utf8;

(2)创建表(核心)

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
);

(3)创建视图

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(修改对象)

(1)修改表(添加 / 删除列、修改类型、约束)

-- 添加列
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(删除对象)

-- 删除数据库
DROP DATABASE [IF EXISTS] 数据库名;

-- 删除表
DROP TABLE [IF EXISTS] 表名;

-- 删除视图
DROP VIEW [IF EXISTS] 视图名;

示例:

DROP TABLE IF EXISTS user;

  

数据操作语言 (DML)

用于插入、更新、删除表中的数据,核心语句包括 INSERT/UPDATE/DELETE。

INSERT(插入数据)

-- 方式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(更新数据)

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(删除数据)

DELETE FROM 表名
[WHERE 条件] -- 必加!否则删除全表数据
[ORDER BY 列名]
[LIMIT 行数];

-- 清空表(仅删除数据,保留表结构)
TRUNCATE TABLE 表名;

示例:

-- 删除指定数据
DELETE FROM user WHERE id = 3;
-- 清空表
TRUNCATE TABLE user_temp;

  

数据查询语言 (DQL)

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;

  

数据控制语言 (DCL)

用于授予 / 回收用户权限、管理事务,核心语句包括 GRANT/REVOKE/COMMIT/ROLLBACK。

GRANT(授予权限)

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(回收权限)

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;

  

ANSI SQL 语法通用规则

(1)大小写:ANSI SQL 不区分关键字大小写(如 SELECT 和 select 等效),但建议关键字大写、标识符(表 / 列名)小写,增强可读性;

(2)分号:每条语句以分号 ; 结尾(ANSI 标准);

(3)注释:单行注释用 -- 注释内容,多行注释用 /* 注释内容 */;

(4)兼容性:上述语法是 ANSI 标准,不同数据库有细微差异(如 MySQL 的 LIMIT、Oracle 的 ROWNUM),跨库开发需优先使用标准语法。


说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号