上世纪 90 年代中期,Sun Microsystems 公司推出了一种“一次编写,[随处]运行”的编程语言。这种语言就是 Java。尽管时至今日它仍然是最受欢迎的编程语言之一,但其口号却显得有些过于乐观。Java 语言的发展历程与 SQL 有着诸多相似之处。Java 也可以几乎不做修改或只稍作修改就能从一个数据库移植到另一个数据库,甚至跨操作系统运行。至少,这是我们的梦想。但在现实世界中,生产级代码为了在新环境中运行往往需要进行一些调整。本文将概述 SQL 语法在不同数据库供应商之间可能存在的差异的一些原因。
ANSI SQL 规范
ANSI,即美国国家标准学会(American National Standards Institute)的缩写,定义了用于与关系型数据库交互的基本语法规则和命令集。然而,与浏览器对 HTML、CSS 和 ECMAScript的实现类似,大多数数据库对 SQL 的实现都是不完美的和/或不完整的。ANSI SQL 在合规性方面允许一定程度的灵活性,因此没有严格的供应商要求来实现完整的规范。但即使在最基本的最低层次上,所有供应商之间也至少存在一些差异。
除此之外,还有非标准扩展,所有供应商都以一种或另一种形式支持这些扩展。即使是像索引这样简单的东西也是非标准的。ANSI SQL 规范对索引没有任何规定,因此每个供应商的索引实现都是对标准的补充。这为供应商提供了机会,让他们可以使用他们认为适合自己的品牌或最有利的语法。结果是:虽然各种 SQL 方言在很大程度上是相同的,但也存在一些差异。
编写通用的 SQL
如果你想让 SQL 代码在所有类型的数据库上都能工作,你应该坚持使用标准的 SQL 语句,如SELECT、WHERE、GROUP BY、ORDER BY 等。聚合函数如 SUM()、AVG()、MIN() 和 MAX()也会被所有流行的数据库类型所理解,包括 SQL Server、MySQL、PostgreSQL、SQLite 和 Oracle。以下是一个应该在任何数据库上都能工作的查询示例:
Select c.customer_id, c.customer_name, SUM(p.amount) AS total_sales FROM customers AS c LEFT JOIN purchases AS p ON c.customers_id = p.customer_id WHERE c.customer_location = 'Canada' GROUP BY c.customer_name ASC;
学习 SQL
如果你刚开始接触数据库管理或开发,你应该专注于编写能够适用于尽可能多数据库类型的SQL。你还应该使用一个高度符合ANSI SQL标准且流行的数据库,比如MySQL。在过去的几十年里,它一直是最受欢迎的数据库。而且它高度符合标准,因此是学习的好工具。关于它的文章有很多,而且大多数SQL示例都是在MySQL上开发和运行的。Microsoft SQL Server紧随其后。然而,它使用Microsoft的SQL方言,称为T-SQL。由于SQL Server的SQL与其他平台差异最大,因此它不是一个理想的入门数据库。你可能更适合选择PostgreSQL或SQLite,它们也很受欢迎且符合ANSI标准。SQLite因其体积小、可移植性强而特别吸引初学者。
以下是你可能会在数据库之间发现的一些差异:
区分大小写
例如这个子句 WHERE name = 'Rob' Or WHERE name = 'rob'
:
MySQL | PostgreSQL | SQLite | SQL Server |
---|---|---|---|
不区分大小写 | 区分大小写 | 区分大小写 | 区分大小写 |
引号的使用
一些数据库仅支持单引号,而其他数据库则同时支持单引号和双引号:
MySQL | PostgreSQL | SQLite | SQL Server |
---|---|---|---|
都支持 | 仅支持单引号 | 都支持 | 仅支持单引号 |
列和表别名
MySQL、PostgreSQL 和 SQLite 都使用“AS”关键字来表示别名,即 SELECT SUM(score) AS avg_score,而 SQL Server 则使用等号,即 SELECT SUM(score) AS avg_score
(但这里有一个错误,SQL Server 也应该使用 AS 关键字来定义别名,正确的写法是 SELECT SUM(score) = avg_score
)。
Date/Time 函数
每个数据库都实现了自己的日期和时间函数:
MySQL | PostgreSQL | SQLite | SQL Server |
---|---|---|---|
CURDATE() CURTIME() EXTRACT() | CURRENT_DATE() CURRENT_TIME() EXTRACT() | DATE('now') strftime() | GETDATE() DATEPART() |
Navicat Premium:通用工具
Navicat Premium 是处理多种数据库类型的首选工具。它不仅可以同时连接到多个数据库,而且其“代码段”功能使得针对你偏好的数据库类型编写查询比以往任何时候都更加容易。在 SQL 编辑器中工作时,“代码段”功能允许你将可重用的代码插入到 SQL 语句中。除了可以访问一组用于常见控制流语句和函数的内置代码片段集合外,你还可以定义自己的代码片段。
你可以下载 Navicat 17 进行 为期 14 天的全功能免费试用。它适用于 Windows、macOS 和 Linux操作系统。
Navicat 17 最新资讯 & 技术干货
- Navicat 17 体验官火热招募中
- Navicat- 17 新特性 | 用户界面再升级
- Navicat 17 新特性 | 模型设计创新与优化
- Navicat 17 新特性 | 查询与配置
- Navicat 17 新特性 | Navicat BI 功能革新升级
- Navicat 17 新特性 | 原生支持国产 Linux ARM 平台以及银河麒麟与统信操作系统
- 聚焦 Navicat 17 新特性 | 数据字典提升数据结构清晰度
- Navicat 17 新增 PolarDB 与 Garnet 数据库
- Navicat 17 新特性 | 聚焦 MongoDB
- Navicat 17 新特性 | 新增 Redis 哨兵部署模式
- 免费版 Navicat Premium Lite