举例mysql和postgreSQL的sql语句语法有什么区别
 
 

MySQL 和 PostgreSQL 的 SQL 语法差异

MySQL 和 PostgreSQL 虽然都遵循 SQL 标准,但在语法上存在一些差异。以下是它们之间的一些主要区别:

1. LIMIT 和 OFFSET 语法

MySQL:

sql
 
SELECT * FROM users LIMIT 10 OFFSET 20;
-- 或者简写为
SELECT * FROM users LIMIT 20, 10;

PostgreSQL:

sql
 
SELECT * FROM users LIMIT 10 OFFSET 20;
-- PostgreSQL 不支持 MySQL 的简写形式

2. 字符串连接

MySQL:

sql
 
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
-- 或者使用非标准语法
SELECT first_name || ' ' || last_name AS full_name FROM users; -- 需要设置 PIPES_AS_CONCAT 模式

PostgreSQL:

sql
 
SELECT first_name || ' ' || last_name AS full_name FROM users;
-- 或者使用标准函数
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;

3. 日期和时间函数

MySQL:

sql
 
SELECT NOW();
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d');
SELECT DATE_ADD(NOW(), INTERVAL 1 DAY);

PostgreSQL:

sql
 
SELECT NOW();
SELECT TO_CHAR(NOW(), 'YYYY-MM-DD');
SELECT NOW() + INTERVAL '1 day';

4. 自动递增字段

MySQL:

sql
 
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100)
);

PostgreSQL:

sql
 
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100)
);
-- 或者使用 IDENTITY (PostgreSQL 10+)
CREATE TABLE users (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name VARCHAR(100)
);

5. 布尔值表示

MySQL:

sql
 
-- 使用 TINYINT(1) 或 BOOLEAN (实际上是 TINYINT 的别名)
CREATE TABLE flags (
is_active TINYINT(1)
);
INSERT INTO flags VALUES (1), (0), (TRUE), (FALSE);

PostgreSQL:

sql
 
-- 有真正的 BOOLEAN 类型
CREATE TABLE flags (
is_active BOOLEAN
);
INSERT INTO flags VALUES (TRUE), (FALSE), ('t'), ('f'), ('yes'), ('no');

6. 正则表达式

MySQL:

sql
 
SELECT * FROM users WHERE name REGEXP '^A';
-- 或者
SELECT * FROM users WHERE name RLIKE '^A';

PostgreSQL:

sql
 
SELECT * FROM users WHERE name ~ '^A';
-- 区分大小写不敏感
SELECT * FROM users WHERE name ~* '^a';

7. 分页查询

MySQL:

sql
 
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 20;

PostgreSQL:

sql
 
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 20;
-- 也支持更标准的 FETCH 语法
SELECT * FROM users ORDER BY id OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

8. 插入多行数据

MySQL:

sql
 
INSERT INTO users (name, age) VALUES ('Alice', 25), ('Bob', 30), ('Charlie', 35);

PostgreSQL:

sql
 
-- 与 MySQL 相同
INSERT INTO users (name, age) VALUES ('Alice', 25), ('Bob', 30), ('Charlie', 35);
-- 或者使用 FROM 子句
INSERT INTO users (name, age)
SELECT 'Alice', 25 UNION ALL
SELECT 'Bob', 30 UNION ALL
SELECT 'Charlie', 35;

9. 更新多个表

MySQL:

sql
 
UPDATE users u, orders o
SET u.last_order_date = o.order_date, o.status = 'processed'
WHERE u.id = o.user_id AND o.status = 'pending';

PostgreSQL:

sql
 
UPDATE users
SET last_order_date = o.order_date
FROM orders o
WHERE users.id = o.user_id AND o.status = 'pending'; -- 需要单独更新 orders 表
UPDATE orders SET status = 'processed' WHERE status = 'pending';

10. 删除多表数据

MySQL:

sql
 
DELETE u, o FROM users u JOIN orders o ON u.id = o.user_id WHERE u.status = 'inactive';

PostgreSQL:

sql
 
-- 需要分别删除
DELETE FROM orders WHERE user_id IN (SELECT id FROM users WHERE status = 'inactive');
DELETE FROM users WHERE status = 'inactive';

这些只是 MySQL 和 PostgreSQL 之间的一些常见语法差异。PostgreSQL 通常更严格地遵循 SQL 标准,而 MySQL 则提供了一些非标准的便利语法。

通俗的来说可以这么理解: mysql和postgresql的语法基本相同 只不过mysql支持的简写比较多,postgresql严格的遵循sql标准,语句的写法较mysql比更多

通俗总结一下:

MySQL 和 PostgreSQL 的 SQL 语法区别:

  1. MySQL

    • 支持更多简写(如 LIMIT 10 OFFSET 20 可以写成 LIMIT 20, 10)。

    • 更宽松的语法(比如 || 在 MySQL 默认是逻辑 OR,但在 PostgreSQL 是字符串连接)。

    • 非标准扩展(如 ON DUPLICATE KEY UPDATE 是 MySQL 特有的语法)。

  2. PostgreSQL

    • 严格遵循 SQL 标准(比如 || 一定是字符串连接,LIMIT/OFFSET 必须标准写法)。

    • 语法更严谨(比如 UPDATE 多表时要用 FROM 子句,而 MySQL 可以直接逗号分隔)。

    • 功能更强大(如支持 WINDOW 函数、JSON 操作、CTE 递归查询等高级特性比 MySQL 更早)。

      • 场景 MySQL PostgreSQL
        分页 LIMIT 10 OFFSET 20 或 LIMIT 20, 10 只能用 LIMIT 10 OFFSET 20
        字符串连接 CONCAT(a, b) 或 `a   b`(需设置模式) `a   bCONCAT(a, b)`
        自动递增 AUTO_INCREMENT SERIAL 或 IDENTITY
        多表更新 UPDATE t1, t2 SET ... WHERE ... UPDATE t1 SET ... FROM t2 WHERE ...
        • 如果是从 MySQL 迁移到 PostgreSQL,主要注意:

          • LIMIT/OFFSET 写法不同

          • || 在 PostgreSQL 是字符串连接(MySQL 默认是 OR)

          • 多表 UPDATE/DELETE 语法不同

          • 自增主键的写法不同(AUTO_INCREMENT vs SERIAL

浅聊MySQL和postgreSQL的更多相关文章

  1. Mysql与Postgresql

    在经过一段时间的数据库学习之后,我接触到了Mysql与Postgresql两种数据库管理系统,由于我对这两者的理解都停留在很浅的层面,就不在此比较两者的好坏,主要在这里比较一下两者的入门指令(当然两者 ...

  2. 重新学习MySQL数据库6:浅谈MySQL的中事务与锁

    『浅入深出』MySQL 中事务的实现 在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的:在这篇 ...

  3. SQLite vs MySQL vs PostgreSQL:关系型数据库比较

    自1970年埃德加·科德提出关系模型之后,关系型数据库便开始出现,经过了40多年的演化,如今的关系型数据库种类繁多,功能强大,使用广泛.面对如此之多的关系型数据库,我们应该如何权衡找出适合自己应用场景 ...

  4. 【转】 MySQL与PostgreSQL:该选择哪个开源数据库?哪一个更好?

    转载地址:http://www.infoq.com/cn/news/2013/12/mysql-vs-postgresql 如果打算为项目选择一款免费.开源的数据库,那么你可能会在MySQL与Post ...

  5. 浅谈mysql的两阶段提交协议

    前两天和百度的一个同学聊MySQL两阶段提交,当时自信满满的说了一堆,后来发现还是有些问题的理解还是比较模糊,可能是因为时间太久了,忘记了吧.这里再补一下:) 5.3.1事务提交流程 MySQL的事务 ...

  6. 常用SQL操作(MySQL或PostgreSQL)与相关数据库概念

    本文对常用数据库操作及相关基本概念进行总结:MySQL和PostgreSQL对SQL的支持有所不同,大部分SQL操作还是一样的. 选择要用的数据库(MySQL):use database_name; ...

  7. MySQL和PostgreSQL 导入数据对照

    在虚拟机上測评了下MySQL 和 PostgreSQL 的各种LOAD FILE方式以及时间. 由于是虚拟机上的測评,所以时间仅仅做參考,不要太较真, 看看就好了.MySQL 工具:    1. 自带 ...

  8. 关于PDF.NET开发框架对Mysql Sqlite PostgreSQL数据库分页支持的个人看法

    关于PDF.NET开发框架的名字由来  在设计www.pwmis.com站点的时候,考虑到架构的兼容性和将来升级的可能性,最重要的是没有足够的时间去为网站添加和维护很多复杂的程序,所以在借鉴前人成功经 ...

  9. 浅谈mysql主从复制的高可用解决方案

    1.熟悉几个组件(部分摘自网络)1.1.drbd     —— DRBD(Distributed Replicated Block Device),DRBD号称是 "网络 RAID" ...

  10. 异常 SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase]

    使用Spring 的JDBCtemplate 调用数据库的时候 出现了如下的问题 SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-S ...

随机推荐

  1. C#/.NET/.NET Core技术前沿周刊 | 第 37 期(2025年5.1-5.11)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  2. 简述python中的深浅拷贝

    说到什么是深浅拷贝,就不得不说python中赋值的含义,赋值并不是拷贝,而是将target(变量名)和object(对象本身)建立了一种联系,当一个object可变时,连接该object的任意一个ta ...

  3. stopPropagation()方法阻止父级事件

    方式一 <div id="div1"> <div id="div2"></div> </div> $(" ...

  4. [2025五一lyyz集训] 数论+练习赛

    一如既往地在 \(lyyz\) 集训. 5.1 今天是练习赛,但感觉今天不适合打比赛,交几道挂几道,被教练一顿凶. 练习赛结果:\(100+26+62+22\) 其中有道 \(DP\) 不错: C密码 ...

  5. Qt图像处理技术七:轮廓提取

    Qt图像处理技术七:轮廓提取 效果图 原理 图像先二值化让rgb数值相同,只有(0,0,0)或者(255,255,255) 取每个点的周围8个点,如果周围8个点与该点rgb值相同,则需要将该点描黑为( ...

  6. 【洛谷有题】NOI 笔试题库(非初赛)订正

    传送门 第一次做,那个成绩可是一个惨不忍睹-- 我还是想说--我虽然要用Linux,但是不一定要用到指令啊(吧)--编译啥的我可以用Vim|guide啊-- Linux 中为文件改名使用的命令是: m ...

  7. Java IO<2> 输入/输出流 FileInputStream/FileOutputStream

    输入/输出流 按操作 数据单位不同分为:流 字节流(8 bit) ,字符流(16 bit) 按数据流的 流向不同分为: 输入流,输出流 按流的 角色的不同分为:节点流,处理流 ![image-2 ...

  8. Springboot笔记<3> 组件注入注解@Conditional与@import

    @Conditional @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean. 创建ConfigConditional类和测试类Conf ...

  9. Opencv学习:使用Opencv对图象进行抠图和滤镜处理,实现“你的名字”动漫图片效果

    最近接到了一个坑爹题目,是这么要求的: 仿照 <你的名字>,对天坛图像.src.jpg进行处理.要求 (一)背景(天空)分割,替换后再融合 在自然界的图片中,很难出现动漫中大多大多的云彩. ...

  10. SpringBoot集成ShardingSphere‐JDBC搭配Dynamic多数据源

    概述 本文章主要是用SpringBoot 3.3.4 集成 ShardingSphere‐JDBC 5.5.2 并且搭配Dynamic使用的一个应用场景,为什么用了分库分表了还会用到多数据源呢?我们在 ...