举例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 更早)。| 场景 | MySQL | PostgreSQL |
|-------|---------------------------------------|---------------------------------------|------------|-----|---|--------------------|
| 分页 |LIMIT 10 OFFSET 20
或LIMIT 20, 10
| 只能用LIMIT 10 OFFSET 20
|
| 字符串连接 |CONCAT(a, b)
或 `a | | b`(需设置模式) | `a | | b或
CONCAT(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
vsSERIAL
)
-
-
-