浅聊MySQL和postgreSQL
MySQL 和 PostgreSQL 的 SQL 语法差异
MySQL 和 PostgreSQL 虽然都遵循 SQL 标准,但在语法上存在一些差异。以下是它们之间的一些主要区别:
1. LIMIT 和 OFFSET 语法
MySQL:
SELECT * FROM users LIMIT 10 OFFSET 20;
-- 或者简写为
SELECT * FROM users LIMIT 20, 10;
PostgreSQL:
SELECT * FROM users LIMIT 10 OFFSET 20;
-- PostgreSQL 不支持 MySQL 的简写形式
2. 字符串连接
MySQL:
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:
SELECT first_name || ' ' || last_name AS full_name FROM users;
-- 或者使用标准函数
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
3. 日期和时间函数
MySQL:
SELECT NOW();
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d');
SELECT DATE_ADD(NOW(), INTERVAL 1 DAY);
PostgreSQL:
SELECT NOW();
SELECT TO_CHAR(NOW(), 'YYYY-MM-DD');
SELECT NOW() + INTERVAL '1 day';
4. 自动递增字段
MySQL:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100)
);
PostgreSQL:
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:
-- 使用 TINYINT(1) 或 BOOLEAN (实际上是 TINYINT 的别名)
CREATE TABLE flags (
is_active TINYINT(1)
);
INSERT INTO flags VALUES (1), (0), (TRUE), (FALSE);
PostgreSQL:
-- 有真正的 BOOLEAN 类型
CREATE TABLE flags (
is_active BOOLEAN
);
INSERT INTO flags VALUES (TRUE), (FALSE), ('t'), ('f'), ('yes'), ('no');
6. 正则表达式
MySQL:
SELECT * FROM users WHERE name REGEXP '^A';
-- 或者
SELECT * FROM users WHERE name RLIKE '^A';
PostgreSQL:
SELECT * FROM users WHERE name ~ '^A';
-- 区分大小写不敏感
SELECT * FROM users WHERE name ~* '^a';
7. 分页查询
MySQL:
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 20;
PostgreSQL:
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:
INSERT INTO users (name, age) VALUES ('Alice', 25), ('Bob', 30), ('Charlie', 35);
PostgreSQL:
-- 与 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:
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:
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:
DELETE u, o FROM users u JOIN orders o ON u.id = o.user_id WHERE u.status = 'inactive';
PostgreSQL:
-- 需要分别删除
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 语法区别:
MySQL
支持更多简写(如
LIMIT 10 OFFSET 20可以写成LIMIT 20, 10)。更宽松的语法(比如
||在 MySQL 默认是逻辑 OR,但在 PostgreSQL 是字符串连接)。非标准扩展(如
ON DUPLICATE KEY UPDATE是 MySQL 特有的语法)。
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)或 `ab`(需设置模式) `a b 或CONCAT(a, b)`自动递增 AUTO_INCREMENTSERIAL或IDENTITY多表更新 UPDATE t1, t2 SET ... WHERE ...UPDATE t1 SET ... FROM t2 WHERE ...如果是从 MySQL 迁移到 PostgreSQL,主要注意:
LIMIT/OFFSET写法不同||在 PostgreSQL 是字符串连接(MySQL 默认是 OR)多表
UPDATE/DELETE语法不同自增主键的写法不同(
AUTO_INCREMENTvsSERIAL)
浅聊MySQL和postgreSQL的更多相关文章
- Mysql与Postgresql
在经过一段时间的数据库学习之后,我接触到了Mysql与Postgresql两种数据库管理系统,由于我对这两者的理解都停留在很浅的层面,就不在此比较两者的好坏,主要在这里比较一下两者的入门指令(当然两者 ...
- 重新学习MySQL数据库6:浅谈MySQL的中事务与锁
『浅入深出』MySQL 中事务的实现 在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的:在这篇 ...
- SQLite vs MySQL vs PostgreSQL:关系型数据库比较
自1970年埃德加·科德提出关系模型之后,关系型数据库便开始出现,经过了40多年的演化,如今的关系型数据库种类繁多,功能强大,使用广泛.面对如此之多的关系型数据库,我们应该如何权衡找出适合自己应用场景 ...
- 【转】 MySQL与PostgreSQL:该选择哪个开源数据库?哪一个更好?
转载地址:http://www.infoq.com/cn/news/2013/12/mysql-vs-postgresql 如果打算为项目选择一款免费.开源的数据库,那么你可能会在MySQL与Post ...
- 浅谈mysql的两阶段提交协议
前两天和百度的一个同学聊MySQL两阶段提交,当时自信满满的说了一堆,后来发现还是有些问题的理解还是比较模糊,可能是因为时间太久了,忘记了吧.这里再补一下:) 5.3.1事务提交流程 MySQL的事务 ...
- 常用SQL操作(MySQL或PostgreSQL)与相关数据库概念
本文对常用数据库操作及相关基本概念进行总结:MySQL和PostgreSQL对SQL的支持有所不同,大部分SQL操作还是一样的. 选择要用的数据库(MySQL):use database_name; ...
- MySQL和PostgreSQL 导入数据对照
在虚拟机上測评了下MySQL 和 PostgreSQL 的各种LOAD FILE方式以及时间. 由于是虚拟机上的測评,所以时间仅仅做參考,不要太较真, 看看就好了.MySQL 工具: 1. 自带 ...
- 关于PDF.NET开发框架对Mysql Sqlite PostgreSQL数据库分页支持的个人看法
关于PDF.NET开发框架的名字由来 在设计www.pwmis.com站点的时候,考虑到架构的兼容性和将来升级的可能性,最重要的是没有足够的时间去为网站添加和维护很多复杂的程序,所以在借鉴前人成功经 ...
- 浅谈mysql主从复制的高可用解决方案
1.熟悉几个组件(部分摘自网络)1.1.drbd —— DRBD(Distributed Replicated Block Device),DRBD号称是 "网络 RAID" ...
- 异常 SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase]
使用Spring 的JDBCtemplate 调用数据库的时候 出现了如下的问题 SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-S ...
随机推荐
- C#/.NET/.NET Core技术前沿周刊 | 第 37 期(2025年5.1-5.11)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...
- 简述python中的深浅拷贝
说到什么是深浅拷贝,就不得不说python中赋值的含义,赋值并不是拷贝,而是将target(变量名)和object(对象本身)建立了一种联系,当一个object可变时,连接该object的任意一个ta ...
- stopPropagation()方法阻止父级事件
方式一 <div id="div1"> <div id="div2"></div> </div> $(" ...
- [2025五一lyyz集训] 数论+练习赛
一如既往地在 \(lyyz\) 集训. 5.1 今天是练习赛,但感觉今天不适合打比赛,交几道挂几道,被教练一顿凶. 练习赛结果:\(100+26+62+22\) 其中有道 \(DP\) 不错: C密码 ...
- Qt图像处理技术七:轮廓提取
Qt图像处理技术七:轮廓提取 效果图 原理 图像先二值化让rgb数值相同,只有(0,0,0)或者(255,255,255) 取每个点的周围8个点,如果周围8个点与该点rgb值相同,则需要将该点描黑为( ...
- 【洛谷有题】NOI 笔试题库(非初赛)订正
传送门 第一次做,那个成绩可是一个惨不忍睹-- 我还是想说--我虽然要用Linux,但是不一定要用到指令啊(吧)--编译啥的我可以用Vim|guide啊-- Linux 中为文件改名使用的命令是: m ...
- Java IO<2> 输入/输出流 FileInputStream/FileOutputStream
输入/输出流 按操作 数据单位不同分为:流 字节流(8 bit) ,字符流(16 bit) 按数据流的 流向不同分为: 输入流,输出流 按流的 角色的不同分为:节点流,处理流 ![image-2 ...
- Springboot笔记<3> 组件注入注解@Conditional与@import
@Conditional @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean. 创建ConfigConditional类和测试类Conf ...
- Opencv学习:使用Opencv对图象进行抠图和滤镜处理,实现“你的名字”动漫图片效果
最近接到了一个坑爹题目,是这么要求的: 仿照 <你的名字>,对天坛图像.src.jpg进行处理.要求 (一)背景(天空)分割,替换后再融合 在自然界的图片中,很难出现动漫中大多大多的云彩. ...
- SpringBoot集成ShardingSphere‐JDBC搭配Dynamic多数据源
概述 本文章主要是用SpringBoot 3.3.4 集成 ShardingSphere‐JDBC 5.5.2 并且搭配Dynamic使用的一个应用场景,为什么用了分库分表了还会用到多数据源呢?我们在 ...