规范 ANSI SQL 写法,核心目标是可移植、可读、可维护、可优化。下面从语法规范、命名规范、结构规范、性能与安全、常见误区几个方面系统说明,并给出对比示例。
ANSI SQL 是 SQL 的国际标准,不同数据库(Oracle / MySQL / PostgreSQL / SQL Server)在 ANSI 基础上做扩展。
规范写法指:
尽量使用 ANSI 标准语法,减少数据库私有语法,保证跨数据库兼容性和长期可维护性。
❌ 不推荐(旧写法,难维护)
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;
原因:
不要省略 INNER / LEFT / RIGHT
❌
SELECT *
FROM a
JOIN b ON a.id = b.id;
✅
SELECT *
FROM a
INNER JOIN b ON a.id = b.id;
ANSI 要求:
SELECT 中的非聚合列,必须出现在 GROUP BY 中
❌
SELECT dept, name, COUNT(*)
FROM emp
GROUP BY dept;
✅
SELECT dept, COUNT(*)
FROM emp
GROUP BY dept;
✅ 推荐
SELECT *
FROM orders
WHERE order_date = DATE '2024-01-01';
❌ 数据库私有
WHERE order_date = '2024-01-01'; -- 依赖数据库
✅
user_account
order_item
created_at
❌
User, ORDER, 1col
✅ 推荐风格
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;
原则:
❌
SELECT * FROM orders;
✅
SELECT id, user_id, amount, created_at
FROM orders;
原因:
✅
SELECT dept, AVG(salary)
FROM emp
WHERE status = 'ACTIVE'
GROUP BY dept
HAVING AVG(salary) > 10000;
❌
"SELECT * FROM user WHERE name = '" + name + "'"
✅
SELECT *
FROM user
WHERE name = ?;
❌ 索引失效
WHERE YEAR(created_at) = 2024
✅
WHERE created_at >= DATE '2024-01-01'
AND created_at < DATE '2025-01-01'
❌
WHERE user_id = '1001'
✅
WHERE user_id = 1001
WHERE col IS NULL
WHERE col IS NOT NULL
❌
WHERE col = NULL
BEGIN;
UPDATE account SET balance = balance - 100 WHERE id = 1;
UPDATE account SET balance = balance + 100 WHERE id = 2;
COMMIT;
| 功能 | 推荐 ANSI 写法 |
|---|---|
| 连接 | INNER JOIN / LEFT JOIN |
| 分页 | FETCH FIRST / OFFSET |
| 当前时间 | CURRENT_TIMESTAMP |
| 字符串 | ‘abc’ |
| 日期 | DATE ‘2024-01-01’ |
| 空值 | NULL |
| 条件 | CASE WHEN |
| 场景 | ANSI SQL | 私有写法 |
|---|---|---|
| 分页 | OFFSET 10 FETCH NEXT 10 | LIMIT 10,10 |
| 字符串拼接 | ` | |
| 日期 | DATE ‘2024-01-01’ | TO_DATE() |
规范 ANSI SQL 写法的核心:用标准语法、明确语义、清晰结构、避免数据库私有特性。
如果你愿意,我可以:
只要把你的 SQL 或场景发我即可。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。