当前位置: 首页 > news >正文

浅聊MySQL和postgreSQL

举例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 更早)。

      • 场景MySQLPostgreSQL
        分页 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

http://www.vanclimg.com/news/325.html

相关文章:

  • 为什么企业需要员工自助入职录入系统?
  • NRF54L15 RRAM的优点;
  • 树剖学习笔记
  • clickhouse重启,以及修改数据存储目录后重启失败的解决办法
  • 身份证,港澳通行证,台胞证,记一下三个常用的正则判断
  • 接收解析封装H264为PS数据的RTP包
  • Zabbix优化参考1
  • hi
  • 框幅式高光谱文献数据库,换“新”看!科研效率Up Up!
  • vxe-table 实现服务端筛选、分页筛选
  • 函数参数为字符串类型时,默认值设为NULL会报错
  • 中电金信:源启研发协同一体化平台、源启混沌工程平台通过信通院可信云最高级评估
  • LGP9310 [EGTS 2021] Luna likes Love 学习笔记
  • 使用Amazon Q和MCP优化深度学习环境
  • Linux 系统硬盘命名规则详细解析
  • 【LeetCode 160】算法:相交链表 —— 双指针法和数学法
  • cgroup机制
  • ls | tee 1.txt 如何拿到ls的返回值$?
  • 深入浅出:Clang中的控制流完整性(CFI)技术解析
  • 工业互联网甄选联盟会员组织正式成立,合作共赢
  • VK16K33AQ QNF28小体积封装大电流LED驱动电子烟LED屏显方案
  • HelloWorld
  • 颠覆性应用指南:EtherCAT转PROFINET网关的工业场景核爆方案大全
  • 如何将 Markdown格式文章快速发布到微信公众号.240516
  • Maven 镜像配置文件 maven-settings.xml
  • 图论
  • 开源能源管理系统:数字化时代能源安全与效能提升的核心引擎
  • 四.分支语句的简单应用
  • 使用AnythingLLM本地化投喂文件,简单三步快速本地化部署DeepSeek满血版看这篇!.250304
  • 循环for、while