百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

【SQL】SQL 语法差异大全(PgSQL/MySQL/Oracle/TiDB/OceanBase)

wptr33 2025-08-01 21:36 6 浏览

以下是针对不同数据库系统的 SQL 语法差异总结,按功能分类展示:

一、基础查询

1. 分页查询

-- PostgreSQL/TiDB/OceanBase
SELECT * FROM TableName LIMIT 10 OFFSET 20;

-- MySQL
SELECT * FROM TableName LIMIT 20, 10;

-- Oracle
SELECT * FROM (
  SELECT t.*, ROWNUM rn FROM (
    SELECT * FROM TableName ORDER BY column1
  ) t WHERE ROWNUM <= 30
) WHERE rn > 20;

2. 字符串连接

-- PostgreSQL/TiDB/OceanBase
SELECT column1 || ' ' || column2 FROM TableName;

-- MySQL
SELECT CONCAT(column1, ' ', column2) FROM TableName;

-- Oracle
SELECT column1 || ' ' || column2 FROM TableName;
-- 或
SELECT CONCAT(CONCAT(column1, ' '), column2) FROM TableName;

二、日期函数

1. 当前日期时间

-- PostgreSQL/TiDB
SELECT NOW();
SELECT CURRENT_TIMESTAMP;

-- MySQL
SELECT NOW();
SELECT CURRENT_TIMESTAMP();
SELECT SYSDATE();

-- Oracle
SELECT SYSDATE FROM dual;
SELECT CURRENT_TIMESTAMP FROM dual;

-- OceanBase
SELECT NOW();
SELECT CURRENT_TIMESTAMP;

2. 日期加减

-- PostgreSQL/TiDB/OceanBase
SELECT NOW() + INTERVAL '1 day';
SELECT NOW() - INTERVAL '1 hour';

-- MySQL
SELECT DATE_ADD(NOW(), INTERVAL 1 DAY);
SELECT DATE_SUB(NOW(), INTERVAL 1 HOUR);

-- Oracle
SELECT SYSDATE + 1 FROM dual;
SELECT SYSDATE - 1/24 FROM dual;

三、类型转换

1. 字符串转日期

-- PostgreSQL/TiDB/OceanBase
SELECT CAST('2023-01-01' AS DATE);
SELECT '2023-01-01'::DATE;

-- MySQL
SELECT CAST('2023-01-01' AS DATE);
SELECT STR_TO_DATE('2023-01-01', '%Y-%m-%d');

-- Oracle
SELECT TO_DATE('2023-01-01', 'YYYY-MM-DD') FROM dual;

2. 数字格式化

-- PostgreSQL/TiDB/OceanBase
SELECT TO_CHAR(1234.56, '9999.99');

-- MySQL
SELECT FORMAT(1234.56, 2);

-- Oracle
SELECT TO_CHAR(1234.56, '9999.99') FROM dual;

四、窗口函数

1. ROW_NUMBER()

-- 所有数据库通用语法
SELECT column1, column2, 
       ROW_NUMBER() OVER (ORDER BY column2) AS rn
FROM TableName;

2. 分页查询(使用窗口函数)

-- PostgreSQL/TiDB/OceanBase/MySQL 8.0+
SELECT * FROM (
  SELECT t.*, 
         ROW_NUMBER() OVER (ORDER BY column1) AS rn
  FROM TableName t
) WHERE rn BETWEEN 21 AND 30;

-- Oracle
SELECT * FROM (
  SELECT t.*, 
         ROW_NUMBER() OVER (ORDER BY column1) AS rn
  FROM TableName t
) WHERE rn BETWEEN 21 AND 30;

五、DDL 语句

1. 自增列

-- PostgreSQL
CREATE TABLE TableName (
  id SERIAL PRIMARY KEY,
  name VARCHAR(50)
);

-- MySQL/TiDB/OceanBase
CREATE TABLE TableName (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50)
);

-- Oracle
CREATE TABLE TableName (
  id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  name VARCHAR2(50)
);

2. 修改列

-- PostgreSQL/TiDB/OceanBase
ALTER TABLE TableName ALTER COLUMN column1 TYPE VARCHAR(100);

-- MySQL
ALTER TABLE TableName MODIFY COLUMN column1 VARCHAR(100);

-- Oracle
ALTER TABLE TableName MODIFY column1 VARCHAR2(100);

六、索引操作

1. 创建索引

-- PostgreSQL/TiDB/OceanBase
CREATE INDEX idx_name ON TableName (column1);

-- MySQL
CREATE INDEX idx_name ON TableName (column1);

-- Oracle
CREATE INDEX idx_name ON TableName (column1);

2. 函数索引

-- PostgreSQL
CREATE INDEX idx_name ON TableName (LOWER(column1));

-- MySQL 8.0+/TiDB/OceanBase
CREATE INDEX idx_name ON TableName ((LOWER(column1)));

-- Oracle
CREATE INDEX idx_name ON TableName (LOWER(column1));

七、事务控制

1. 事务语法

-- PostgreSQL/MySQL/TiDB/OceanBase
START TRANSACTION;
-- SQL语句
COMMIT;
-- 或
ROLLBACK;

-- Oracle
SET TRANSACTION;
-- SQL语句
COMMIT;
-- 或
ROLLBACK;

八、特殊功能

1. JSON 处理

-- PostgreSQL
SELECT json_column->>'key' FROM TableName;

-- MySQL/TiDB/OceanBase
SELECT JSON_EXTRACT(json_column, '$.key') FROM TableName;

-- Oracle 12c+
SELECT json_column.key FROM TableName;

2. 正则表达式

-- PostgreSQL/TiDB/OceanBase
SELECT * FROM TableName WHERE column1 ~ 'pattern';

-- MySQL
SELECT * FROM TableName WHERE column1 REGEXP 'pattern';

-- Oracle
SELECT * FROM TableName WHERE REGEXP_LIKE(column1, 'pattern');

九、系统函数

1. 获取最后插入ID

-- PostgreSQL
INSERT INTO TableName (...) VALUES (...) RETURNING id;

-- MySQL/TiDB/OceanBase
INSERT INTO TableName (...) VALUES (...);
SELECT LAST_INSERT_ID();

-- Oracle
INSERT INTO TableName (...) VALUES (...) RETURNING id INTO :variable;

2. 分组合并字符串

-- PostgreSQL
SELECT string_agg(column1, ',') FROM TableName GROUP BY column2;

-- MySQL
SELECT GROUP_CONCAT(column1 SEPARATOR ',') FROM TableName GROUP BY column2;

-- Oracle
SELECT LISTAGG(column1, ',') WITHIN GROUP (ORDER BY column1) 
FROM TableName GROUP BY column2;

-- TiDB/OceanBase
SELECT GROUP_CONCAT(column1 SEPARATOR ',') FROM TableName GROUP BY column2;

十、存储过程

1. 基本语法

-- PostgreSQL
CREATE OR REPLACE FUNCTION func_name() RETURNS void AS $
BEGIN
  -- 代码
END;
$ LANGUAGE plpgsql;

-- MySQL/TiDB/OceanBase
DELIMITER //
CREATE PROCEDURE proc_name()
BEGIN
  -- 代码
END //
DELIMITER ;

-- Oracle
CREATE OR REPLACE PROCEDURE proc_name AS
BEGIN
  -- 代码
END;
/

以上是主要数据库系统在常见 SQL 功能上的语法差异,实际使用时还需考虑各数据库的版本差异。

相关推荐

Python 中 必须掌握的 20 个核心:str()

str()是Python中用于将对象转换为字符串表示的核心函数,它在字符串处理、输出格式化和对象序列化中扮演着关键角色。本文将全面解析str()函数的用法和特性。1.str()函数的基本用法...

python中的函数报错后继续运行而不是停止整个程序

要让main...

如何在身份证号码中提取出生年月日的函数公式

在不同软件中,从身份证号码提取出生年月日的函数公式不同,以下是常见软件的方法:Excelo假设身份证号码在A列,在B列提取出生年月日,在B2单元格输入公式=TEXT(MID(A2,7,8),"...

sql中的一些CTE和开窗函数相关用法

CTE的优势提高可读性:将复杂查询分解为更简单的部分避免重复子查询:同一CTE可以在查询中多次引用递归查询:处理层次结构数据模块化SQL:将复杂查询拆分成逻辑模块...

【SQL】SQL 语法差异大全(PgSQL/MySQL/Oracle/TiDB/OceanBase)

以下是针对不同数据库系统的SQL语法差异总结,按功能分类展示:一、基础查询1.分页查询...

MySQL索引:从原理到实战的终极指南

MySQL索引原理揭秘MySQL索引是数据库高效查询的核心机制,其原理基于特定的数据结构(主要是B+Tree)和数据库引擎(如InnoDB)的实现策略。索引本质上是一种空间换时间的策略,虽然会占...

如何在本地安装开源人工智能Agent——AutoGen Studio的安装

AutoGen是微软出品的一个用于创建可自主行动,或与人类协同工作的多智能体AI应用程序的框架。下面来介绍如何在本地安装AutoGenStudio,AutoGenStudio是一个低代码界...

小巧WinForm库存系统,竟能实现这些功能?

第一次体验真正“握在手里的”库存控制,是在一个微型工厂的仓库运输带旁。顶着仓库里金属味和三十几平米的闷热,老王蹲在地上,一边用笔在账本上划格,一边嘴里嘟囔:“每次都说要数字化管理,数字在哪儿呢?”透过...

有关SQLite数据库的介绍

SQLite,是一种轻型的数据库,它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/U...

SQLite 数据库Web管理工具

概述SQLite数据库以其轻量级和易于配置的特点,成为了许多项目中的首选数据库。尽管它的便捷性受到了广泛的认可,但对于数据库的管理和维护,尤其是在没有图形界面工具的情况下,开发者往往需要通过复杂的命...

SqlLite数据库注意要点分析

1.验证sqlite是否安装配置好了。执行sqlite3命令。当执行该命令的时候没有传递任何参数表示默认连接到了一个内存数据库,当退出该程序的时候,数据库自动销毁。退出命令:.quit.ex...

python 连接sqlite

在Python中,你可以使用标准库sqlite3来连接SQLite数据库。在Python中,sqlite3模块是内置的,无需使用pip进行安装。sqlite3模块提供了与SQ...

提升数据库搜索效率:探索SQLite的向量搜索扩展

大家好!今天我们要聊一个特别酷炫的东西——sqlite-vec,一个能让SQLite飞起来的向量搜索扩展。如果你对数据库的搜索速度不满意,那你可得好好看看这篇文章了。...

Qt编程进阶(21):Qt操作SQLite数据库及实例

QtSql模块Qt提供的QtSql模块实现了对数据库的访问,同时提供了一套与平台和具体所用数据库均无关的调用接口。此模块为不同层次的用户提供了不同的丰富的数据库操作类。例如,对于习惯使用SQL语法的用...

5分钟快速掌握在Python使用SQLite数据库,

小巧、稳定、快速!我为什么喜欢用SQLite...