PostgreSQL和mysql语法区别详解通俗易懂

目录

0.PostgreSQL的数据类型:

0.1.数值数据类型

0.2.字符串数据类型

0.3.日期/时间数据类型

0.4.布尔类型

0.5.货币类型

0.6.几何类型

1.PostgreSQL创建表

1.1.建表之前,创建自增序列

1.2.创建表,设置id为自增序列

2.夸表数据复制

3.分页处理

3.1.PostgreSQL两种分页方法查询

3.2.mysql 的分页

4.函数使用

5.数据类型转化(针对于PostgreSQL)

 6.字段拼接

7.获取当前时间


 

0.PostgreSQL的数据类型:

0.1.数值数据类型

名称描述存储大小范围

smallint

存储整数,小范围2字节-32768 至 +32767
integer存储整数。使用这个类型可存储典型的整数4字节-2147483648 至 +2147483647
bigint存储整数,大范围。8字节-9223372036854775808 至 9223372036854775807

decimal

[desɪml]

用户指定的精度,精确变量小数点前最多为131072个数字; 小数点后最多为16383个数字

numeric

[nuˈmɛrɪk]

用户指定的精度,精确变量小数点前最多为131072个数字; 小数点后最多为16383个数字。
real可变精度,不精确4字节6位数字精度
double可变精度,不精确8字节15位数字精度

serial

[ˈsɪəriəl]

自动递增整数4字节1 至 2147483647

big serial

大的自动递增整数8字节1 至 9223372036854775807

0.2.字符串数据类型

数据类型描述
char(size)这里size是要存储的字符数。固定长度字符串,右边的空格填充到相等大小的字符。

character(size)

[ˈkærəktər]

这里size是要存储的字符数。 固定长度字符串。 右边的空格填充到相等大小的字符
varchar(size)这里size是要存储的字符数。 可变长度字符串。
character varying(size)这里size是要存储的字符数。 可变长度字符串。
text可变长度字符串

 0.3.日期/时间数据类型

名称描述
timestamp [ (p) ] [不带时区 ]日期和时间(无时区)
timestamp [ (p) ]带时区包括日期和时间,带时区
date日期(没有时间)
time [ (p) ] [ 不带时区 ]时间(无日期)
time [ (p) ] 带时区仅限时间,带时区

0.4.布尔类型

名称描述存储大小
boolean它指定truefalse的状态。1字节

0.5.货币类型

名称描述存储大小范围
money货币金额8字节-92233720368547758.08 至 +92233720368547758.07

0.6.几何类型

名称存储大小表示描述
point16字节在一个平面上的点(x,y)
line32字节无限线(未完全实现)((x1,y1),(x2,y2))
lseg32字节有限线段((x1,y1),(x2,y2))
box32字节矩形框((x1,y1),(x2,y2))
path16+16n字节封闭路径(类似于多边形)((x1,y1),…)
polygon40+16n字节多边形(类似于封闭路径)((x1,y1),…)
circle24字节<(x,y),r>(中心点和半径)

1.PostgreSQL创建表

1.1.建表之前,创建自增序列

创建自增序列

--创建序列
CREATE SEQUENCE "xiang_base"."cloud_new_id_seq" 
INCREMENT 1
MINVALUE  1
MAXVALUE 9223372036854775807
START 1
CACHE 1;

--设置丛多少开始自增
SELECT setval('"xiang_base"."cloud_new_id_seq"', 1, true);

--给序列指定字段
ALTER SEQUENCE "xiang_base"."cloud_new_id_seq" OWNED BY "xiang_base"."cloud_news"."id";

--给序列指定所有人
ALTER SEQUENCE "xiang_base"."cloud_new_id_seq" OWNER TO "cloud_admin";

1.2.创建表,设置id为自增序列

设置自增序列:nextval('xiang_base.cloud_new_id_seq'::regclass)

CREATE TABLE "xiang_base"."cloud_news" (
    "id" int8 NOT NULL DEFAULT nextval('xiang_base.cloud_new_id_seq'::regclass),
    "title" TEXT COLLATE "pg_catalog"."default",
    "news_content" TEXT COLLATE "pg_catalog"."default",
    "news_content_m" TEXT COLLATE "pg_catalog"."default",
    "pic_path" VARCHAR ( 256 ) COLLATE "pg_catalog"."default",
    "intro" TEXT COLLATE "pg_catalog"."default",
    "is_deleted" bool NOT NULL DEFAULT FALSE,
    "creator" VARCHAR ( 32 ) COLLATE "pg_catalog"."default",
    "updater" VARCHAR ( 32 ) COLLATE "pg_catalog"."default",
    "create_time" TIMESTAMP ( 3 ) DEFAULT now( ),
    "update_time" TIMESTAMP ( 3 ) DEFAULT now( ),
    "description" TEXT COLLATE "pg_catalog"."default",
    "keywords" TEXT COLLATE "pg_catalog"."default",
    CONSTRAINT "cloud_news_pkey1" PRIMARY KEY ( "id" ) 
);
ALTER TABLE "xiang_base"."cloud_news" OWNER TO "cloud_admin";
COMMENT ON COLUMN "xiang_base"."cloud_news"."title" IS '新闻标题';
COMMENT ON COLUMN "xiang_base"."cloud_news"."news_content" IS '新闻内容';
COMMENT ON COLUMN "xiang_base"."cloud_news"."news_content_m" IS '新闻移动端内容';
COMMENT ON COLUMN "xiang_base"."cloud_news"."pic_path" IS '新闻图片';
COMMENT ON COLUMN "xiang_base"."cloud_news"."intro" IS '介绍';
COMMENT ON COLUMN "xiang_base"."cloud_news"."is_deleted" IS '删除标志:FALSE:未删除,TRUE:已删除';
COMMENT ON COLUMN "xiang_base"."cloud_news"."creator" IS '创建人';
COMMENT ON COLUMN "xiang_base"."cloud_news"."updater" IS '更新人';
COMMENT ON COLUMN "xiang_base"."cloud_news"."create_time" IS '创建时间';
COMMENT ON COLUMN "xiang_base"."cloud_news"."update_time" IS '更新时间';
COMMENT ON COLUMN "xiang_base"."cloud_news"."description" IS '描述';
COMMENT ON COLUMN "xiang_base"."cloud_news"."keywords" IS '关键词';

2.夸表数据复制

--从一张表复制数据到另一张表
INSERT INTO xiang_base.cloud_news ( ID, title, news_content, news_content_m, pic_path, intro, is_deleted, creator, updater, create_time, update_time ) SELECT ID
:: int8,
title,
news_content,
news_content_m,
pic_path,
intro,
is_deleted,
creator,
updater,
create_time,
update_time 
FROM
    xiang_base.cloud_news_bak_20221214_1;

 3.分页处理

3.1.PostgreSQL两种分页方法查询

在3000W数据的时候,建议使用第一种

--第一种
SELECT * FROM test_table WHERE i_id>0 limit 100;
--第二种 offset从0开始,offset 0表示从第一行开始获取。
SELECT * FROM test_table  limit 100 OFFSET 0;

3.2.mysql 的分页

SELECT * FROM test_table  limit 100, 10;

4.函数使用

--时间转字符串

--MySQL: 
date_format(a.tag_create_date,‘%Y-%m-%d %H:%i:%s’)

--PostgreSQL: 
to_char(a.tag_create_date,‘yyyy-mm-dd HH:MM:SS’)
--字符串转时间:

--MySQL: 
date_format(a.tag_create_date,‘%Y-%m-%d %H:%i:%s’)

--PostgreSQL: 
to_date(a.tag_create_date,‘yyyy-mm-dd HH:MM:SS’)
--IFNULL()函数

--MySQL: 
IFNULL(a.idm,‘’)

--PostgreSQL: 
COALESCE(a.id,‘’)
-- sysdate()函数

MySQL: SELECT sysdate()

PostgreSQL: SELECT now()
-- find_in_set()函数(允许在逗号分隔的字符串列表中查找指定字符串的位置)

MySQL: SELECT t.dept_id FROM sys_dept t WHERE find_in_set(‘100’, ancestors)

PostgreSQL: SELECT t.dept_id FROM sys_dept t WHERE ‘100’ = ANY (string_to_array(ancestors, ‘,’))
-- group_concat()函数

MySQL: select a.name,group_concat(distinct city)from user_city a group by a.name;

PostgreSQL: select a.name,array_to_string(array_agg(distinct a.city),‘,’)from user_city a group by a.name;
-- LIMIT

MySQL: select id,name from hospital.ods_user_basic limit 10,2;

PostgreSQL: select id,name from hospital.ods_user_basic limit 10 offset 2;
-- DISTINCT

MYSQL: select DISTINCT b.id from hospital.ods_user_basic as b

PostgreSQL: select DISTINCT ON (b.id) b.* from hospital.ods_user_basic as b
-- MyBatis-Plus整合MySQL、PostgreSQL,LIKE使用
-- LIKE是一般用法,ILIKE匹配时则不区分字符串的大小写

-- MySQL:
	<select id="checkReportPage" resultMap="reportResultMap">
       SELECT
       *
       FROM
       infisa_medical_report
       WHERE is_deleted=0 AND status = 1 AND name LIKE concat('%',#{handleTask.name},'%')
    </select>

-- PostgreSQL:
	<select id="checkReportPage" resultMap="reportResultMap">
       SELECT
       *
       FROM
       infisa_medical_report
       WHERE is_deleted=0 AND status = 1 AND name like concat('%',#{handleTask.name}::varchar,'%')
    </select>

5.数据类型转化(针对于PostgreSQL)

-- 强转(在查询字段上指定数据类型)

a.a1 = b.b1::int8 
-- 或者 
a.a1::varchar = b.b1 
-- 或者
CAST(a.a1 AS varchar)

MySQL:CAST(a.a1 AS varchar)

 6.字段拼接

如果需要对拼接的值去重,可以这样处理:

SELECT string_agg(address,',') FROM student GROUP BY grade;
--未去重的情况下:
string_agg|
----------|
天河一路,天河一路 |
天河一路,天河一路 |
SELECT string_agg(distinct address,',') FROM student GROUP BY grade;
string_agg|
----------|
天河一路      |
天河一路      |

 如果想对拼接的值做排序,可以在拼接符号后面加order by

SELECT string_agg(name,',' order by name desc) FROM student GROUP BY grade;
--结果:
string_agg|
----------|
小B,小A     |
小D,小C     |

7.获取当前时间

MySQL

  • CURDATE(), CURTIME(), NOW():可以获取客户端所在时区的当前时间;
  • UTC_DATE(), UTC_TIME(), UTC_TIMESTAMP():可以获得当前的UTC时间;
  • CURRENT_DATE(), CURRENT_TIME(), CURRENT_TIMESTAMP():就是CURDATE(), CURTIME(), NOW()的别名
mysql> SELECT CURDATE(), CURTIME(), NOW();
+------------+-----------+---------------------+
| CURDATE()  | CURTIME() | NOW()               |
+------------+-----------+---------------------+
| 2022-08-30 | 11:45:47  | 2022-08-30 11:45:47 |
+------------+-----------+---------------------+

mysql> SELECT UTC_DATE(), UTC_TIME(), UTC_TIMESTAMP();
+------------+------------+---------------------+
| UTC_DATE() | UTC_TIME() | UTC_TIMESTAMP()     |
+------------+------------+---------------------+
| 2022-08-30 | 07:46:10   | 2022-08-30 07:46:10 |
+------------+------------+---------------------+

mysql> SELECT CURRENT_DATE(), CURRENT_TIME(), CURRENT_TIMESTAMP();
+----------------+----------------+---------------------+
| CURRENT_DATE() | CURRENT_TIME() | CURRENT_TIMESTAMP() |
+----------------+----------------+---------------------+
| 2022-08-30     | 11:46:31       | 2022-08-30 11:46:31 |
+----------------+----------------+---------------------+

PGSql

 
select now();
select CURRENT_DATE;
select CURRENT_TIME;
select CURRENT_TIMESTAMP;
select CURRENT_TIME(precision);
select CURRENT_TIMESTAMP(precision);
select LOCALTIME;
select LOCALTIMESTAMP;
select LOCALTIME(precision);
select LOCALTIMESTAMP(precision);
 
--示例
SELECT CURRENT_TIME;
结果:14:39:53.662522-05
 
SELECT CURRENT_DATE;
结果:2001-12-23
 
SELECT CURRENT_TIMESTAMP;
结果:2001-12-23 14:39:53.662522-05
 
SELECT CURRENT_TIMESTAMP(2);
结果:2001-12-23 14:39:53.66-05
 
SELECT LOCALTIMESTAMP;
结果:2001-12-23 14:39:53.662522

 

 

  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: PostgreSQLMySQL是两种流行的关系型数据库管理系统,它们都使用SQL作为查询语言,但在一些方面有一些区别。 以下是它们之间的一些区别: 1. 数据类型:PostgreSQL支持更多的数据类型,包括数组、范围类型和JSON类型等。而MySQL则不支持这些类型,但是有一些特殊的数据类型,例如ENUM和SET。 2. 性能:在大多数情况下,MySQL的性能比PostgreSQL更好,特别是在处理大量数据时。但是,PostgreSQL在处理复杂查询和大量连接时表现更好。 3. 安全性:PostgreSQL在安全性方面比MySQL更好,它提供了更多的安全功能,例如行级别安全性和加密存储等。 4. 扩展性:PostgreSQL是一种高度可扩展的数据库系统,支持多个主节点和从节点。而MySQL则没有这个功能,只能通过主从复制来实现扩展性。 5. 社区支持:MySQL拥有更大的社区支持和更多的第三方工具和插件。而PostgreSQL的社区相对较小,但是它也有一些非常有用的工具和插件。 总的来说,PostgreSQLMySQL都是非常好的数据库管理系统,选择哪一个取决于您的具体需求和应用场景。如果您需要更高的安全性和可扩展性,则可以选择PostgreSQL。如果您需要更好的性能和更大的社区支持,则可以选择MySQL。 ### 回答2: PostgreSQLMySQL 都是目前最流行的关系型数据库管理系统。虽然两种数据库都有相似之处,但它们在语法方面还是存在着一定的差异。 1. 数据类型 PostgreSQLMySQL 在数据类型上有一些差异。在 PostgreSQL 中的数据类型包括:数字类型、字符类型、日期/时间类型、布尔类型、数组类型等。而 MySQL 中常见的数据类型包括:数值类型、字符串类型、日期/时间类型、二进制类型、布尔类型等。其中,PostgreSQL 中的数组类型与 MySQL 不同。在 PostgreSQL 中,数组类型是一种内置类型,支持多种不同的数据类型。而在 MySQL 中,虽然也能够存储数组,但需要使用一些技巧来存储多个值。 2. 索引 索引是提高数据库查询效率的关键组件。在 PostgreSQLMySQL 中,都有类似的索引类型,如 B-tree 索引、哈希索引、GIN 索引、GIST 索引等。但 PostgreSQL 相较于 MySQL 更加灵活,提供更多的索引类型。例如,PostgreSQL 还支持全文索引和空间索引。在 PostgreSQL 中,不同的索引类型使用的语法也略有差异。 3. 存储过程 存储过程是一种用于封装 SQL 代码的数据库对象。MySQL 支持存储过程的创建和使用,但 PostgreSQL 更加强大。PostgreSQL 能够支持多种语言的存储过程,如 PL/SQL、Python、Perl 等。这使得 PostgreSQL 在存储过程方面能够更加灵活,开发人员能够选择他们熟悉的语言编写存储过程。 4. 事务处理 事务处理是数据库系统中非常重要的一环。PostgreSQLMySQL 两种数据库在事务处理上略有不同。PostgreSQL 支持完全 ACID 性质的事务,具有更高的数据一致性。而 MySQL 的事务处理则默认是自动提交的,这可能会导致一些不可预见的结果。 综上所述,PostgreSQLMySQL语法方面有着一些区别PostgreSQL 在某些方面表现得更加强大,比如支持多种数据类型、索引,更加灵活的存储过程、更好的事务处理;而 MySQL 则在易用性方面表现更好。无论选择哪种数据库系统,都需要根据具体应用场景来进行选择。 ### 回答3: PostgreSQLMySQL是两种常用的关系型数据库管理系统。虽然它们都是SQL数据库,但是在语法和功能方面存在一些区别。 1. 数据类型 PostgreSQL支持更多的数据类型,如数组、范围、网络地址、枚举等。MySQL只支持基本的数据类型,如INTEGER、CHAR、VARCHAR等。 2. 自动递增 在MySQL中,自动递增使用AUTO_INCREMENT关键字,而PostgreSQL中则采用SERIAL类型。 3. 外键约束 在MySQL中,外键约束需要手动设置。而在PostgreSQL中,外键约束可以自动检查和强制执行。 4. 触发器 PostgreSQL中可以创建复杂的触发器,可以在行级别和语句级别触发。MySQL中的触发器只能在行级别触发。 5. 函数 PostgreSQL有很强的函数编程能力,可以创建自定义的函数和类型,甚至可以编写存储过程。MySQL则当前版本的函数支持较弱,不能编写存储过程。 6. 全文索引 在MySQL中,只能使用MyISAM引擎来创建全文索引。而PostgreSQL中,可以使用内置的tsvector和tsquery类型创建全文索引。 总体来说,PostgreSQL是一个功能更强大的数据库管理系统,支持更多的数据类型,并具有更好的约束和触发器支持。MySQL则更加简单易用,适合中小型项目和初学者使用。但是具体要选用哪个数据库管理系统,还需根据项目情况和需求进行选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值