举例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 语法区别:
- 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)
来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除 |