Mysql数据库与PostgreSQL数据库语法比较

目录

前言

模式的概念

模式的主要作用

一、Mysql和PostgreSQL语法比较

1.数据类型差异

1.1整型

1.2浮点数类型

1.3字符串差异

1.4数组类型

2.字符串连接

3.日期和时间函数差异

4.Limit子句的差异

5.NULL值的处理

6.自增主键列

7.变量和参数差异

8.连接查询

9.having语法差异

10.Group by差异

10.1在选择列表中的非聚合列

10.2聚合函数的处理

11.编码和排序方式

11.1编码

11.2排序方式

二、PostgreSQL特有的

1.几何类型

2.网络地址类型

3.数组类型

4.范围类型

5.对象标识符类型

三、数据类型别名


前言

模式的概念

模式(Schema)表示数据库中的逻辑容器,用于组织和管理数据库对象,如表、视图、索引等。一个模式可以看作是一组相关对象的命名空间。

模式不同于表,它更多地是对数据库对象进行逻辑分组和隔离的一种方式。一个模式可以包含多个表,每个表又可以属于不同的模式。通过使用模式,可以将相关的数据库对象组织在一起,提供更好的可管理性和安全性。

模式的主要作用

  • 命名空间隔离:不同模式下的对象可以使用相同的名称,而不会发生冲突。例如,可以在模式A下创建一个名为"users"的表,在模式B下也可以创建一个名为"users"的表,它们互不冲突。
  • 访问控制:可以通过授权不同用户或角色对不同模式中的对象进行访问,从而实现更细粒度的权限控制。
  • 代码组织:将相关的数据库对象组织在同一个模式下,便于维护、管理和查询。

一、Mysql和PostgreSQL语法比较

1.数据类型差异

1.1整型

  • MySQL中的TEXT数据类型最大存储容量为64KB,而PostgreSQL中的TEXT类型没有此限制。
  • MySQL中使用TINYINT、MEDIUMINT和INT表示不同大小的整数,而PostgreSQL使用SMALLINT、INT和BIGINT

1.2浮点数类型

  • MySQL 提供了 FLOAT 和 DOUBLE 类型来表示浮点数,可以指定精度。
  • PostgreSQL 提供了 REAL 和 DOUBLE PRECISION 类型来表示浮点数。

1.3字符串差异

  • MySQL中可以使用''或""来表示字符串,而PostgreSQL只接受''来表示字符串。
  • PostgreSQL使用E'…' 来表示带有转义序列的字符串。
  • 双引号在 PostgreSQL 中用于引用标识符(如表名、列名等),而不是字符串值。
  • MySQL 使用 VARCHAR 来表示可变长度的字符串,例如 VARCHAR(255),VARCHAR(n)最大只能是64kb。而postgresql中的VARCHAR(n) 最大可以存 1GB。
  • PostgreSQL 使用 VARCHAR 或 TEXT 来表示可变长度的字符串,postgresql中的TEXT相当于MySQL中的longtext。

1.4数组类型

  • MySQL 不直接支持数组类型,但可以使用逗号分隔的字符串来模拟数组。
  • PostgreSQL 支持原生的数组类型,如,integer[]、varchar[]等。

2.字符串连接

  • 在MySQL中,可以使用"+"CONCAT函数来连接字符串,而在PostgreSQL中,可以使用"||"来连接字符串。
-- 使用双竖线进行字符串连接
SELECT 'Hello' || ' ' || 'World';  -- 输出结果为 'Hello World'
-- 使用 CONCAT 函数进行字符串连接
SELECT CONCAT('Hello', ' ', 'World');  -- 输出结果为 'Hello World'-- 直接使用空格符号进行字符串连接
SELECT 'Hello' ' ' 'World';  -- 输出结果为 'Hello World'

3.日期和时间函数差异

  • MySQL使用NOW()来获取当前日期时间,而PostgreSQL使用CURRENT_TIMESTAMPCURRENT_DATE来获取。
  • MySQL使用DATE_ADD()DATE_SUB()等函数来添加或减少日期时间,而PostgreSQL使用INTERVAL进行类似操作。
-- 在当前日期上添加3天
SELECT DATE_ADD(CURDATE(), INTERVAL 3 DAY);-- 在当前日期上减去1周
SELECT DATE_SUB(CURDATE(), INTERVAL 1 WEEK);
-- 在当前日期上添加3天
SELECT CURRENT_DATE + INTERVAL '3 day';-- 在当前日期上减去1周
SELECT CURRENT_DATE - INTERVAL '1 week';

4.Limit子句的差异

在MySQL中,LIMIT子句用于限制结果集中返回的记录数,语法为"LIMIT offset, count",offset为起始位置,count为返回记录数。
在PostgreSQL中,LIMIT子句用于限制结果集中返回的记录数,语法为"LIMIT count OFFSET offset",count为返回记录数,offset为起始位置。
count表示要返回的记录数,offset 表示返回记录集开始的位置。如果省略 offset 参数,则默认从第一条记录开始。

SELECT name, score  FROM class ORDER BY score DESC LIMIT 5;
SELECT name, score FROM class ORDER BY score DESC LIMIT 5 OFFSET 3;
-- 跳过前3个记录,然后获取接下来的5个记录

注意:LIMIT 子句需要与 ORDER BY 子句一起使用来保证结果集的正确性。否则,返回的结果可能会是没有排序的任意行。

5.NULL值的处理

  • 在MySQL中,使用"= NULL"或"IS NULL"来检查NULL值,使用"IS NOT NULL"来检查非NULL值。
  • 在PostgreSQL中,使用"IS NULL"来检查NULL值,使用"IS NOT NULL"来检查非NULL值。

6.自增主键列

  • 在MySQL中,可以使用AUTO_INCREMENT关键字将主键列设置为自增列。
  • 在PostgreSQL中,可以使用SERIALBIGSERIAL类型来创建自增主键列。
-- 使用 SERIAL 类型创建自增主键列
CREATE TABLE users (id SERIAL PRIMARY KEY,username VARCHAR(50),email VARCHAR(100));-- 使用 BIGSERIAL 类型创建自增主键列
CREATE TABLE products (id BIGSERIAL PRIMARY KEY,name VARCHAR(100),price DECIMAL(10,2));

注意
使用 SERIAL 类型时,自增的主键列将存储 **4 字节大小的整数值,范围从 1 到 2,147,483,647。
而使用 BIGSERIAL 类型时,自增的主键列将存储
 8 **字节大小的整数值,范围从 1 到 9,223,372,036,854,775,807。

无论使用 SERIAL 还是 BIGSERIAL 类型,都要将其指定为主键(PRIMARY KEY)以确保唯一性和索引优化。通过使用这些自增类型,可以方便地为表创建带有自动生成的唯一标识符的主键列。

7.变量和参数差异

  • MySQL使用@符号来声明和使用用户变量,使用?来作为占位符来传递参数。
  • PostgreSQL使用冒号(:)来声明和使用变量,使用$1$2等占位符来传递参数。
-- 声明一个名为my_var的用户变量,并将其赋值为'Hello World'
SET @my_var := 'Hello World';-- 打印变量的值
SELECT @my_var;-- 查询指定用户的信息,使用占位符传递参数
SELECT username, email FROM users WHERE id = ?;
-- 声明一个名为my_var的变量,并将其赋值为'Hello World'
DO $$
DECLAREmy_var TEXT := 'Hello World';
BEGIN-- 打印变量的值RAISE NOTICE 'The value of my_var is: %', my_var;
END $$;
-----------------------------------------
-- 查询指定用户的信息,使用占位符传递参数
SELECT username, email FROM users WHERE id = $1;

8.连接查询

  • 在MySQL中,可以使用JOINLEFT JOINRIGHT JOININNER JOIN来进行不同类型的连接。
  • 在PostgreSQL中,使用JOIN来进行内连接,使用LEFT JOINRIGHT JOIN来进行左连接和右连接。

9.having语法差异

  • 字符串比较:在 PostgreSQL 中,字符串比较是区分大小写的,默认情况下使用区分大小写的排序规则。而在 MySQL 中,字符串比较默认是不区分大小写的,可以使用 COLLATE 子句来指定不同的排序规则。
  • 聚合函数的引用:在 PostgreSQL 中,HAVING 子句可以直接引用 SELECT 语句中定义的聚合函数,如 HAVING SUM(column) > 100。而在 MySQL 中,默认情况下不允许在 HAVING 子句中直接使用 SELECT 语句中定义的聚合函数结果,需要使用重复的聚合函数表达式,如 HAVING SUM(column) > 100 和 HAVING SUM(column) > 200。
  • NULL 值处理:在 PostgreSQL 中,HAVING 子句可以直接使用 NULL 进行比较,如 HAVING column IS NULL。而在 MySQL 中,需要使用特殊函数 IS NULL 或 IS NOT NULL 进行 NULL 值的比较,如 HAVING IS NULL(column)。
  • 在 PostgreSQL 中,不能直接在 HAVING 子句中使用 SELECT 语句中定义的列别名进行引用。而在 MySQL 中,默认情况下也不支持在 HAVING 子句中直接使用 SELECT 语句中的列别名。然而,从 MySQL 5.7+ 版本开始,已经开始支持使用列别名。

10.Group by差异

10.1在选择列表中的非聚合列

  • MySQL 允许在 GROUP BY 子句中不列出选择列表中的非聚合列,而且结果集将使用该组中的任意一个值。这可能会导致不可预测的结果。
  • PostgreSQL 要求选择列表中的非聚合列要么包含在 GROUP BY 子句中,要么在聚合函数中使用。否则,会引发错误。

10.2聚合函数的处理

  • MySQL 允许在 SELECT 语句中使用聚合函数,即使没有使用 GROUP BY 子句。这将导致对整个结果集进行聚合计算并返回单个结果。
  • PostgreSQL 要求在使用聚合函数时必须使用 GROUP BY 子句,并按照指定的分组进行计算。
#MysqlSELECT name, AVG(score) AS avg_score FROM student GROUP BY name;
#PostgreSQLSELECT name, AVG(score) AS avg_score
FROM student
GROUP BY name;--- 报错!!!

 可以看到,MySQL 允许在 SELECT 子句中使用聚合函数,而 PostgreSQL 要求使用 GROUP BY 子句,并确保所有非聚合列都在GROUP BY子句中。

11.编码和排序方式

11.1编码

  • PostgreSQL 提供了许多字符集和编码,其中包括 UTF-8、Latin1、WIN1251 等。可以通过创建数据库时指定编码或者修改已有数据库的编码来设置。
  • MySQL 也提供了多种字符集和编码,其中包括 UTF-8、GBK、GB2312 等。可以通过创建数据库时指定字符集或者修改已有数据库的字符集来设置。

11.2排序方式

  • PostgreSQL 的默认排序规则是由其设置的区域设置(locale)确定的,可以使用 LC_COLLATE 环境变量或 SET 命令来更改。例如,如果使用以英文为基础的区域设置,则会在排序中将大写字母与小写字母一起处理。此外,PostgreSQL还支持自定义排序规则。
  • MySQL 的默认排序规则是根据字符集而不是区域设置确定的。例如,在 utf8 字符集下,MySQL 按照Unicode标准进行排序,因此对于不同语言的字符排序可能会有所不同。MySQL 支持使用 COLLATE 关键字来指定排序规则。

二、PostgreSQL特有的

1.几何类型

包括点(point)、直线(line)、线段(lseg)、路径(path)、多边形(polygon)、圆(cycle)等类型。

CREATE TABLE places (id SERIAL PRIMARY KEY,name VARCHAR(100),location GEOMETRY(Point, 4326));
INSERT INTO places (name, location) VALUES ('Central Park',ST_GeomFromText('POINT(-73.968500 40.785800)', 4326));

2.网络地址类型

cidrinetmacaddr 3种类型

CREATE TABLE users (id SERIAL PRIMARY KEY,name VARCHAR(100),ip_address INET);
INSERT INTO users (name, ip_address) VALUES ('Alice', '192.168.0.1');

3.数组类型

可以在表中存储和操作多个数值或对象

CREATE TABLE products (id SERIAL PRIMARY KEY,name VARCHAR(100),prices INTEGER[]);
INSERT INTO products (name, prices) VALUES ('Apple', ARRAY[10, 15, 20]);

4.范围类型

range类型,可以存储范围数据,其他数据库中无此类型
用于表示一定范围内的数值或时间戳等数据。

CREATE TABLE events (id SERIAL PRIMARY KEY,name VARCHAR(100),event_time TSRANGE);
INSERT INTO events (name, event_time) VALUES ('Meeting', '[2024-03-30 16:00, 2024-03-31 16:00]');

5.对象标识符类型

PostgreSQL 具有特殊的对象标识符类型,用于存储和引用数据库对象的标识,如表、列、模式等。

CREATE TABLE orders (id SERIAL PRIMARY KEY,order_number OID,product_name VARCHAR(100));
INSERT INTO orders (order_number, product_name) VALUES ('163125', 'Computer');

三、数据类型别名

为了提高SQL的兼容性,部分数据类型还有很多别名,如integer类型,可以用intint4表示,smallint也可以用int2表示;char varying(n)可以用varchar(n)表示,numeric(m,n)也可以用decimal(m,n)表示,等等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/781236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaScript编程】前端实现文件下载

在前端实现文件下载&#xff0c;主要有以下几种常见的方法&#xff1a; 一、使用<a>标签 这种方法是最常见的&#xff0c;只需要在HTML中创建一个<a>标签&#xff0c;并通过JavaScript控制其点击行为&#xff0c;就可以实现文件下载。例如&#xff1a; function…

【Vue】动态样式

内联样式的动态样式 body(){ boxASelect:false, } v-bind:style"{borderColor:boxASelect ? red : #ccc}" <body><header><h1>Vue Dynamic Styling</h1></header><section id"styling"><div class"demo&quo…

2024年MathorCup数学建模思路A题B题C题D题思路分享

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

深入理解MySQL索引:原理、类型

在数据库领域&#xff0c;索引是提高查询效率的重要工具之一。MySQL作为最流行的关系型数据库之一&#xff0c;其索引的使用和优化至关重要。本文将深入探讨MySQL索引的原理、类型以及最佳实践&#xff0c;帮助读者更好地理解和应用索引。 一、索引的基本概念 1. 什么是索引&…

电脑文件轻松管理:按大小归类,高效存储文件

在数字化时代&#xff0c;电脑文件的管理变得至关重要。面对海量的数据和信息&#xff0c;如何高效整理、归类和保存这些文件&#xff0c;成为了我们必须要面对的挑战。今天&#xff0c;我们就来介绍一种简单而实用的文件管理方法——按文件大小归类保存&#xff0c;让您的数据…

再次加深理解Java中的并发编程

目录 一、线程、进程、程序 二、线程状态 三、线程的七大参数 四、lock与synchronized锁机制 一&#xff09;、lock与synchronized锁区别 二&#xff09;、synchronized锁原理 三&#xff09;、Lock锁原理 五、synchronized锁升级原理 一&#xff09;、锁升级基础知识 …

深度思考:雪花算法snowflake分布式id生成原理详解

雪花算法snowflake是一种优秀的分布式ID生成方案&#xff0c;其优点突出&#xff1a;它能生成全局唯一且递增的ID&#xff0c;确保了数据的一致性和准确性&#xff1b;同时&#xff0c;该算法灵活性强&#xff0c;可自定义各部分bit位&#xff0c;满足不同业务场景的需求&#…

EXCEL VBA 多sheet批量转转PDF

EXCEL VBA 多sheet批量转转PDF Sub zhuanpdf() 转pdfApplication.ScreenUpdating False 关闭刷新Dim chaifm As String 拆分名chaifm Sheets("参数表").Cells(75, 2).ValueDim yuanbm As String 原表名Dim ws As Worksheet 定义表格Dim biao As String 表名Dim …

java Web洗衣店管理系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 洗衣店管理系统是一套完善的web设计系统&#xff0c;对理解JSP java 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&#xff0c;使用…

API接口自动化测试框架搭建之需求整理、详细设计和框架设计!

​ 简介&#xff1a; API接口自动化测试框架搭建之需求整理、详细设计和框架设计 1 需求整理 1.1 实现目的 API接口自动化测试&#xff0c;主要针对http接口协议&#xff1b;便于回归测试&#xff1b;线上或线下巡检测试&#xff0c;结合持续集成&#xff0c;及时发现运行环…

数据迁移通用笔记(Minio、Mysql、Mongo、ElasticSearch)

序号更新时间备注12024.03.26初始化笔记22024.03.27细化ES 集群和单节点的描述 文章目录 一、Mino 数据迁移1、mc的基础操作2、镜像复制3、备份复制 二、MySql数据迁移1、利用主从复制2、数据汇出汇入 三、Mongo数据迁移1、利用主从复制2、数据汇出汇入 四、ElasticSearch数据迁…

图像最低三位的可能情况

要求 函数f,函数g,分别针对三个比特位bit1,bit2,bit3进行运算,得到结果为A和B。具体为: A=f(bit1,bit2,bit3) B=g(bit1,bit2,bit3) 能否让函数f和函数g满足让A和B的结果出现四种可能“00”、“01”、“10”、“11”。 实现 可以设计这样的函数f和g,使得它们对于三个比特…

设计模式(8):组合模式

一.组合模式场景 把部分和整体的关系用树形结构来表示&#xff0c;从而使客户端可以使用统一的方式处理部分对象和整体对象。 二.组合模式核心 抽象组件(Component)角色&#xff1a;定义了叶子和容器组件的共同点&#xff1b;叶子组件(Leaf)角色&#xff1a;无子节点&#x…

嵌入式中逻辑分析仪的基本操作与实现

作为一名嵌入式软件/硬件工程师,要会使用各种仪表仪器,尤其示波器、逻辑分析仪, 这两个仪器可以监测各种数据线、信号线波形, 可以帮我们快速定位产品问题,缩短开发周期。 今天一口君安利一款非常不错的逻辑分析仪:kingst LA5016 这款仪器非常容易上手, 尤其在一些…

【滑动窗口】Leetcode 水果成篮

题目解析 904. 水果成篮 算法讲解 这道题的本质就是&#xff1a;寻找一段连续的区域&#xff08;子数组&#xff09;&#xff0c;这一段连续的区域里面最多包含两种水果&#xff0c;因为有可能这一段连续的区域里面全是一种水果&#xff0c;比如&#xff1a;f(x) {1,1,1,1,…

Linux中安装JDK17.X

1、总体概述&#xff1f; 该操作方式适合centos或red hat环境 2.1、在线下载JDK安装包&#xff1f; 通过wget命令下载JDK17.X包 wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 如果提示&#xff1a;没有wget命令就安装wget yum install w…

G35-2单螺杆泵

在现代工业流程中&#xff0c;流体输送是至关重要的一环。无论是石油化工、能源开采还是精细化工领域&#xff0c;高效率和可靠的泵送设备都是确保生产过程平稳运行的关键。在这样的背景下&#xff0c;G35-2单螺杆泵凭借其卓越的性能和广泛的应用性&#xff0c;成为了众多工业企…

答题小程序功能细节揭秘:如何提升用户体验和满足用户需求?

答题小程序功能细节体现 随着移动互联网的快速发展&#xff0c;答题小程序成为了用户获取知识、娱乐休闲的重要平台。一款优秀的答题小程序不仅应该具备简洁易用的界面设计&#xff0c;更应该在功能细节上做到极致&#xff0c;以提升用户体验和满足用户需求。本文将从题库随机…

SCI论文发表多长时间才可以被检索?

sci检索&#xff0c;是指发表的sci论文可以在web of science上查询到&#xff0c;是sci论文发表的最后一个步骤&#xff0c;建立在见刊的基础之上。那么&#xff0c;sci发表后多久可检索?没有统一标准&#xff0c;刊物不同&#xff0c;检索时间有差异。 一、SCI文章检索的注意…

深入解析AI大模型:原理、挑战与前景

前言 在现今技术飞速发展的时代&#xff0c;AI大模型学习已成为科技领域的研究热点。要想在这一领域取得突破&#xff0c;研究者需掌握扎实的数学基础、编程能力以及特定领域的业务知识。本文将深入剖析AI大模型的原理、挑战与前景&#xff0c;为读者提供有益的建议。 一、AI…