找回密码
 立即注册
首页 业界区 业界 浅聊MySQL和postgreSQL

浅聊MySQL和postgreSQL

褥师此 2025-7-28 14:20:54
举例mysql和postgreSQL的sql语句语法有什么区别  MySQL 和 PostgreSQL 的 SQL 语法差异

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

MySQL:
sql 
  1. SELECT * FROM users LIMIT 10 OFFSET 20;
  2. -- 或者简写为
  3. SELECT * FROM users LIMIT 20, 10;
复制代码
PostgreSQL:
sql 
  1. SELECT * FROM users LIMIT 10 OFFSET 20;
  2. -- PostgreSQL 不支持 MySQL 的简写形式
复制代码
2. 字符串连接

MySQL:
sql 
  1. SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
  2. -- 或者使用非标准语法
  3. SELECT first_name || ' ' || last_name AS full_name FROM users; -- 需要设置 PIPES_AS_CONCAT 模式
复制代码
PostgreSQL:
sql 
  1. SELECT first_name || ' ' || last_name AS full_name FROM users;
  2. -- 或者使用标准函数
  3. SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
复制代码
3. 日期和时间函数

MySQL:
sql 
  1. SELECT NOW();
  2. SELECT DATE_FORMAT(NOW(), '%Y-%m-%d');
  3. SELECT DATE_ADD(NOW(), INTERVAL 1 DAY);
复制代码
PostgreSQL:
sql 
  1. SELECT NOW();
  2. SELECT TO_CHAR(NOW(), 'YYYY-MM-DD');
  3. SELECT NOW() + INTERVAL '1 day';
复制代码
4. 自动递增字段

MySQL:
sql 
  1. CREATE TABLE users (
  2.     id INT AUTO_INCREMENT PRIMARY KEY,
  3.     name VARCHAR(100)
  4. );
复制代码
PostgreSQL:
sql 
  1. CREATE TABLE users (
  2.     id SERIAL PRIMARY KEY,
  3.     name VARCHAR(100)
  4. );
  5. -- 或者使用 IDENTITY (PostgreSQL 10+)
  6. CREATE TABLE users (
  7.     id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  8.     name VARCHAR(100)
  9. );
复制代码
5. 布尔值表示

MySQL:
sql 
  1. -- 使用 TINYINT(1) 或 BOOLEAN (实际上是 TINYINT 的别名)
  2. CREATE TABLE flags (
  3.     is_active TINYINT(1)
  4. );
  5. INSERT INTO flags VALUES (1), (0), (TRUE), (FALSE);
复制代码
PostgreSQL:
sql 
  1. -- 有真正的 BOOLEAN 类型
  2. CREATE TABLE flags (
  3.     is_active BOOLEAN
  4. );
  5. INSERT INTO flags VALUES (TRUE), (FALSE), ('t'), ('f'), ('yes'), ('no');
复制代码
6. 正则表达式

MySQL:
sql 
  1. SELECT * FROM users WHERE name REGEXP '^A';
  2. -- 或者
  3. SELECT * FROM users WHERE name RLIKE '^A';
复制代码
PostgreSQL:
sql 
  1. SELECT * FROM users WHERE name ~ '^A';
  2. -- 区分大小写不敏感
  3. SELECT * FROM users WHERE name ~* '^a';
复制代码
7. 分页查询

MySQL:
sql 
  1. SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 20;
复制代码
PostgreSQL:
sql 
  1. SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 20;
  2. -- 也支持更标准的 FETCH 语法
  3. SELECT * FROM users ORDER BY id OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
复制代码
8. 插入多行数据

MySQL:
sql 
  1. INSERT INTO users (name, age) VALUES ('Alice', 25), ('Bob', 30), ('Charlie', 35);
复制代码
PostgreSQL:
sql 
  1. -- 与 MySQL 相同
  2. INSERT INTO users (name, age) VALUES ('Alice', 25), ('Bob', 30), ('Charlie', 35);
  3. -- 或者使用 FROM 子句
  4. INSERT INTO users (name, age)
  5. SELECT 'Alice', 25 UNION ALL
  6. SELECT 'Bob', 30 UNION ALL
  7. SELECT 'Charlie', 35;
复制代码
9. 更新多个表

MySQL:
sql 
  1. UPDATE users u, orders o
  2. SET u.last_order_date = o.order_date, o.status = 'processed'
  3. WHERE u.id = o.user_id AND o.status = 'pending';
复制代码
PostgreSQL:
sql 
  1. UPDATE users
  2. SET last_order_date = o.order_date
  3. FROM orders o
  4. WHERE users.id = o.user_id AND o.status = 'pending';
  5. -- 需要单独更新 orders 表
  6. UPDATE orders SET status = 'processed' WHERE status = 'pending';
复制代码
10. 删除多表数据

MySQL:
sql 
  1. DELETE u, o FROM users u JOIN orders o ON u.id = o.user_id WHERE u.status = 'inactive';
复制代码
PostgreSQL:
sql 
  1. -- 需要分别删除
  2. DELETE FROM orders WHERE user_id IN (SELECT id FROM users WHERE status = 'inactive');
  3. 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 更早)。

      • 场景MySQLPostgreSQL分页LIMIT 10 OFFSET 20 或 LIMIT 20, 10只能用 LIMIT 10 OFFSET 20字符串连接CONCAT(a, b) 或 `a b`(需设置模式)`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_INCREMENT vs SERIAL)





来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除

相关推荐

您需要登录后才可以回帖 登录 | 立即注册