PostgreSQL与MySQL在语法上的区别

1. 数据库管理

1.1 查看数据库

  • PostgreSQL : 使用 \l 命令列出所有数据库,或者查询系统表 pg_database

    sql 复制代码
    -- PostgreSQL
    \l
    -- 或者
    SELECT datname FROM pg_database;
  • MySQL : 使用 SHOW DATABASES; 来列出所有数据库。

    sql 复制代码
    -- MySQL
    SHOW DATABASES;

2. 表的管理

2.1 数据类型

  • PostgreSQL : 支持多种高级数据类型,如 ARRAY, JSONB, ENUM, HSTORE。这些类型可以处理复杂数据结构,特别是 JSONB 支持高效的查询和索引。

    sql 复制代码
    -- PostgreSQL 创建一个带有 JSONB 和 ARRAY 列的表
    CREATE TABLE test_table (
      id SERIAL PRIMARY KEY,
      data JSONB,
      tags TEXT[]
    );
  • MySQL : 支持 ENUMJSON 数据类型,但不支持数组类型。

    sql 复制代码
    -- MySQL 创建一个带有 JSON 列的表
    CREATE TABLE test_table (
      id INT AUTO_INCREMENT PRIMARY KEY,
      data JSON
    );

2.2 查看表结构

  • PostgreSQL : 使用 \d tablename;psql 中查看表的结构,或查询系统表。

    sql 复制代码
    -- PostgreSQL 查看表结构
    \d test_table;
  • MySQL : 使用 DESCRIBE tablename;SHOW COLUMNS FROM tablename; 查看表的结构。

    sql 复制代码
    -- MySQL 查看表结构
    DESCRIBE test_table;

2.3 修改列

  • PostgreSQL : 使用 ALTER TABLE ALTER COLUMN 修改列的类型,支持直接修改而不需删除列。

    sql 复制代码
    -- PostgreSQL 修改列的类型
    ALTER TABLE test_table ALTER COLUMN data TYPE TEXT;
  • MySQL : 使用 MODIFY 语法修改列的类型。

    sql 复制代码
    -- MySQL 修改列的类型
    ALTER TABLE test_table MODIFY COLUMN data TEXT;

2.4 查看所有表

  • PostgreSQL : 使用 \dtpsql 终端中列出所有表。

    sql 复制代码
    -- PostgreSQL 查看所有表
    \dt;
  • MySQL : 使用 SHOW TABLES; 列出当前数据库中的所有表。

    sql 复制代码
    -- MySQL 查看所有表
    SHOW TABLES;

3. 数据查询

3.1 条件查询(WHERE)

  • PostgreSQL : 使用 ILIKE 进行大小写不敏感的字符串匹配查询。适合模糊匹配场景。

    sql 复制代码
    -- PostgreSQL 使用 ILIKE 进行大小写不敏感的查询
    SELECT * FROM test_table WHERE data ILIKE '%somevalue%';
  • MySQL : 使用 LIKE 进行大小写敏感的查询。如果需要不敏感匹配,可以使用 LOWER() 函数。

    sql 复制代码
    -- MySQL 使用 LIKE 进行查询
    SELECT * FROM test_table WHERE data LIKE '%somevalue%';
    
    -- 或者使用 LOWER() 进行大小写不敏感匹配
    SELECT * FROM test_table WHERE LOWER(data) LIKE '%somevalue%';

4. 数据更新与删除

4.1 UPDATE 语句

  • PostgreSQL : 支持 RETURNING 子句,允许在更新数据时返回受影响的行。

    sql 复制代码
    -- PostgreSQL 更新并返回更新后的行
    UPDATE test_table SET data = '{"name": "new value"}' WHERE id = 1 RETURNING *;
  • MySQL : 不支持 RETURNING,需要使用单独的查询获取更新后的数据。

    sql 复制代码
    -- MySQL 更新数据
    UPDATE test_table SET data = '{"name": "new value"}' WHERE id = 1;
    
    -- 如果需要查看更新后的数据,需要再次查询
    SELECT * FROM test_table WHERE id = 1;

4.2 DELETE 语句

  • PostgreSQL : 同样支持 RETURNING 子句,允许在删除时返回被删除的行。

    sql 复制代码
    -- PostgreSQL 删除并返回删除的行
    DELETE FROM test_table WHERE id = 1 RETURNING *;
  • MySQL : 不支持 RETURNING,删除前需要先查询要删除的行。

    sql 复制代码
    -- MySQL 删除数据
    DELETE FROM test_table WHERE id = 1;
    
    -- 删除前需要查询
    SELECT * FROM test_table WHERE id = 1;

5. 条件判断语句

5.1 IF 语句

  • PostgreSQL : 使用标准的 CASE 表达式来实现条件判断。

    sql 复制代码
    -- PostgreSQL 使用 CASE 进行条件判断
    SELECT CASE WHEN data->>'name' = 'John' THEN 'Match' ELSE 'No Match' END FROM test_table;
  • MySQL : 使用 IF() 函数进行简单的条件判断,相当于三元表达式。

    sql 复制代码
    -- MySQL 使用 IF 函数进行条件判断
    SELECT IF(data->>'name' = 'John', 'Match', 'No Match') FROM test_table;

6. 联接操作

6.1 全外联接(FULL OUTER JOIN)

  • PostgreSQL : 支持 FULL OUTER JOIN,能够返回两个表中匹配和不匹配的记录。

    sql 复制代码
    -- PostgreSQL 使用 FULL OUTER JOIN
    SELECT * FROM employees FULL OUTER JOIN departments ON employees.department_id = departments.id;
  • MySQL : 不支持 FULL OUTER JOIN,需要通过 UNION 组合 LEFT JOINRIGHT JOIN 实现。

    sql 复制代码
    -- MySQL 使用 UNION 模拟 FULL OUTER JOIN
    SELECT * FROM employees LEFT JOIN departments ON employees.department_id = departments.id
    UNION
    SELECT * FROM employees RIGHT JOIN departments ON employees.department_id = departments.id;

7. 索引管理

7.1 创建索引

  • PostgreSQL : 支持多种类型的索引,如 B-tree, Hash, GIN, GiST,用于不同场景的优化。

    sql 复制代码
    -- PostgreSQL 创建 GIN 索引
    CREATE INDEX idx_data_gin ON test_table USING GIN(data);
  • MySQL : 主要支持 B-treeHash 索引,适用于大多数场景。

    sql 复制代码
    -- MySQL 创建 B-tree 索引
    CREATE INDEX idx_data_btree ON test_table(data);

8. 查询性能分析

8.1 EXPLAIN 语句

  • PostgreSQL : 使用 EXPLAIN ANALYZE 可以显示查询计划和实际执行时间,帮助优化查询性能。

    sql 复制代码
    -- PostgreSQL 使用 EXPLAIN ANALYZE
    EXPLAIN ANALYZE SELECT * FROM test_table;
  • MySQL : EXPLAIN 仅显示查询计划,不显示执行时间。

    sql 复制代码
    -- MySQL 使用 EXPLAIN
    EXPLAIN SELECT * FROM test_table;

9. 用户权限管理

9.1 刷新权限

  • PostgreSQL: 权限修改后自动生效,不需要手动刷新。

  • MySQL : 权限修改后需要使用 FLUSH PRIVILEGES; 手动刷新权限,以确保更改生效。

    sql 复制代码
    -- MySQL 刷新权限
    FLUSH PRIVILEGES;

10. 视图管理

10.1 修改视图

  • PostgreSQL : 使用 CREATE OR REPLACE VIEW 修改视图,无需删除原有视图。

    sql 复制代码
    -- PostgreSQL 修改视图
    CREATE OR REPLACE VIEW emp_view AS SELECT * FROM employees WHERE salary > 5000;
  • MySQL : 必须先删除视图,再重新创建新的视图。

    sql 复制代码
    -- MySQL 修改视图需要先删除再创建
    DROP VIEW IF EXISTS emp_view;
    CREATE VIEW emp_view AS SELECT * FROM employees WHERE salary > 5000;

11. 存储过程管理

11.1 语言支持

  • PostgreSQL : 支持多种语言编写存储过程,如 PL/pgSQL、PL/Python 等,适合复杂业务逻辑处理。

    sql 复制代码
    -- PostgreSQL 使用 PL/pgSQL 编写存储过程
    CREATE FUNCTION add_employee() RETURNS void AS $$
    BEGIN
      INSERT INTO employees (name) VALUES ('John');
    END;
    $$ LANGUAGE plpgsql;
  • MySQL : 只支持使用 SQL 语言编写存储过程,功能较为简单。

    sql 复制代码
    -- MySQL 编写存储过程
    CREATE PROCEDURE add_employee()
    BEGIN
      INSERT INTO employees (name) VALUES ('John');
    END;

12. 触发器管理

12.1 触发器类型

  • PostgreSQL : 支持 BEFORE, AFTER, INSTEAD OF 触发器,适用于表和视图上的多种操作。

    sql 复制代码
    -- PostgreSQL 创建 BEFORE 插入触发器
    CREATE TRIGGER emp_before_insert
    BEFORE INSERT ON employees
    FOR EACH ROW
    EXECUTE FUNCTION check_employee();
  • MySQL : 支持 BEFOREAFTER 触发器,但不支持 INSTEAD OF 触发器。

    sql 复制代码
    -- MySQL 创建 BEFORE 插入触发器
    CREATE TRIGGER emp_before_insert
    BEFORE INSERT ON employees
    FOR EACH ROW
    BEGIN
      CALL check_employee();
    END;
相关推荐
一 乐6 分钟前
民宿|基于java的民宿推荐系统(源码+数据库+文档)
java·前端·数据库·vue.js·论文·源码
鹏码纵横7 分钟前
已解决:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 异常的正确解决方法,亲测有效!!!
java·python·mysql
美林数据Tempodata1 小时前
大模型驱动数据分析革新:美林数据智能问数解决方案破局传统 BI 痛点
数据库·人工智能·数据分析·大模型·智能问数
野槐2 小时前
node.js连接mysql写接口(一)
数据库·mysql
Zzzone6832 小时前
PostgreSQL日常维护
数据库·postgresql
chxii2 小时前
1.13使用 Node.js 操作 SQLite
数据库·sqlite·node.js
冰刀画的圈2 小时前
修改Oracle编码
数据库·oracle
这个胖子不太裤3 小时前
Django(自用)
数据库·django·sqlite
麻辣清汤3 小时前
MySQL 索引类型及其必要性与优点
数据库·mysql
2501_915374354 小时前
Neo4j 图数据库安装教程(2024最新版)—— Windows / Linux / macOS 全平台指南
数据库·windows·neo4j