浅聊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 更早)。

      | 场景 | MySQL | PostgreSQL |
      |-------|---------------------------------------|---------------------------------------|------------|-----|---|--------------------|
      | 分页 | LIMIT 10 OFFSET 20LIMIT 20, 10 | 只能用 LIMIT 10 OFFSET 20 |
      | 字符串连接 | CONCAT(a, b) 或 `a | | b`(需设置模式) | `a | | bCONCAT(a, b)` |
      | 自动递增 | AUTO_INCREMENT | SERIALIDENTITY |
      | 多表更新 | UPDATE t1, t2 SET ... WHERE ... | UPDATE t1 SET ... FROM t2 WHERE ... |

      • 如果是从 MySQL 迁移到 PostgreSQL,主要注意:

        • LIMIT/OFFSET 写法不同

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

        • 多表 UPDATE/DELETE 语法不同

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