温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何规范ANSI SQL写法

发布时间:2026-07-26 20:25:19 来源:亿速云 阅读:94 作者:小樊 栏目:数据库

规范 ANSI SQL 写法,核心目标是可移植、可读、可维护、可优化。下面从语法规范、命名规范、结构规范、性能与安全、常见误区几个方面系统说明,并给出对比示例。


一、什么是“规范 ANSI SQL 写法”

ANSI SQL 是 SQL 的国际标准,不同数据库(Oracle / MySQL / PostgreSQL / SQL Server)在 ANSI 基础上做扩展。
规范写法指:

尽量使用 ANSI 标准语法,减少数据库私有语法,保证跨数据库兼容性和长期可维护性。


二、语法规范(最重要)

1. 使用标准 JOIN,而不是隐式连接

❌ 不推荐(旧写法,难维护)

SELECT a.id, b.name
FROM table_a a, table_b b
WHERE a.id = b.a_id;

✅ 推荐(ANSI SQL-92)

SELECT a.id, b.name
FROM table_a a
INNER JOIN table_b b
  ON a.id = b.a_id;

原因:

  • 逻辑清晰(连接条件 vs 过滤条件)
  • 避免笛卡尔积
  • 便于优化器

2. 明确 JOIN 类型

不要省略 INNER / LEFT / RIGHT

SELECT *
FROM a
JOIN b ON a.id = b.id;

SELECT *
FROM a
INNER JOIN b ON a.id = b.id;

3. 使用标准聚合与 GROUP BY

ANSI 要求:

SELECT 中的非聚合列,必须出现在 GROUP BY 中

SELECT dept, name, COUNT(*)
FROM emp
GROUP BY dept;

SELECT dept, COUNT(*)
FROM emp
GROUP BY dept;

4. 使用标准字符串、日期写法

✅ 推荐

SELECT *
FROM orders
WHERE order_date = DATE '2024-01-01';

❌ 数据库私有

WHERE order_date = '2024-01-01'; -- 依赖数据库

三、命名与格式规范(可读性)

1. 命名规范

  • 统一小写或下划线
  • 不使用保留字
  • 表名、字段名语义清晰

user_account
order_item
created_at

User, ORDER, 1col

2. SQL 书写格式

✅ 推荐风格

SELECT
    u.id,
    u.name,
    COUNT(o.id) AS order_count
FROM user u
LEFT JOIN orders o
    ON u.id = o.user_id
WHERE u.status = 'ACTIVE'
GROUP BY
    u.id,
    u.name
HAVING COUNT(o.id) > 5
ORDER BY order_count DESC;

原则:

  • 关键字大写
  • 每个子句一行
  • 缩进统一

四、结构规范(逻辑清晰)

1. SELECT 中避免 SELECT *

SELECT * FROM orders;

SELECT id, user_id, amount, created_at
FROM orders;

原因:

  • 减少 IO
  • 避免字段变更导致错误
  • 提高可维护性

2. WHERE vs HAVING

  • WHERE:过滤行
  • HAVING:过滤分组

SELECT dept, AVG(salary)
FROM emp
WHERE status = 'ACTIVE'
GROUP BY dept
HAVING AVG(salary) > 10000;

五、性能与安全规范

1. 使用参数化查询(防 SQL 注入)

"SELECT * FROM user WHERE name = '" + name + "'"

SELECT *
FROM user
WHERE name = ?;

2. 合理使用索引字段

❌ 索引失效

WHERE YEAR(created_at) = 2024

WHERE created_at >= DATE '2024-01-01'
  AND created_at <  DATE '2025-01-01'

3. 避免隐式类型转换

WHERE user_id = '1001'

WHERE user_id = 1001

六、事务与 NULL 规范

1. NULL 判断用 IS NULL

WHERE col IS NULL
WHERE col IS NOT NULL

WHERE col = NULL

2. 明确事务边界

BEGIN;
UPDATE account SET balance = balance - 100 WHERE id = 1;
UPDATE account SET balance = balance + 100 WHERE id = 2;
COMMIT;

七、常见 ANSI SQL 写法对照表

功能 推荐 ANSI 写法
连接 INNER JOIN / LEFT JOIN
分页 FETCH FIRST / OFFSET
当前时间 CURRENT_TIMESTAMP
字符串 ‘abc’
日期 DATE ‘2024-01-01’
空值 NULL
条件 CASE WHEN

八、ANSI SQL 与数据库私有语法对比

场景 ANSI SQL 私有写法
分页 OFFSET 10 FETCH NEXT 10 LIMIT 10,10
字符串拼接 `
日期 DATE ‘2024-01-01’ TO_DATE()

九、总结一句话

规范 ANSI SQL 写法的核心:用标准语法、明确语义、清晰结构、避免数据库私有特性。

如果你愿意,我可以:

  • ✅ 帮你审查一段 SQL 是否规范
  • ✅ 给你一份 团队 SQL 编码规范模板
  • ✅ 对比 MySQL / Oracle / PostgreSQL 的 ANSI 差异

只要把你的 SQL 或场景发我即可。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI