超实用,分享PostgreSQL和mysql的几点区别

前言

今天是元宵节,首先祝大伙元宵快乐!上一篇文章,给大家讲解了一下MySQL和PostgreSQL性能上的差别。这篇文章主要是记录一下日常应用中,两者常见的一些语法以及一些区别。

PostgreSQL的数据类型

数值类型

字符串类型

日期|时间类型

布尔类型

货币类型

几何类型

常见的区别

建表语句

这里主要是为了说明两者建表时候,自增逐渐的区别,MySQL的自增一般用auto_increment, PgSql直接用bigserial即可,如果是普通的整型的话,用serial就行,有的文章讲解了很多什么设置起始值,如果默认从1开始的话,按照我这里的就满足需求了,简单的东西简单处理就好,不用过分复杂化,因为效果是一样的。

  • MySQL
CREATE TABLE test_create_TABLE (
    id INT UNSIGNED NOT NULL AUTO_     INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    age INT
);
  • PgSQL
CREATE table test_create_table
(  "id" bigserial NOT NULL PRIMARY KEY,
   "name" VARCHAR NOT NULL,
   "age" int4
);

备注:非long型的可以用serial;

插入两条数据看一下结果
insert into test_create_table(name,age) values ('张三',20);
insert into test_create_table(name,age) values ('李四',30);

SELECT * from test_create_table;

分页处理

  • PostgreSQL两种分页方法查询
    数据量较大的时候采用第一种方式
--第一种
SELECT * FROM test_create_table WHERE i_id>0 limit 100;

--第二种 offset从0开始,offset 0表示从第一行开始获取。
SELECT * FROM test_create_table  limit 100 OFFSET 0;
  • MySQL的分页
SELECT * FROM test_table  limit 100, 10;

函数区别

  • 时间转字符串
 
--MySQL: 
date_format(a.day_time,'%Y-%m-%d %H:%i:%s')
 
--PostgreSQL: 
to_char(a.day_time,'yyyy-mm-dd HH:MM:SS')
  • 字符串转时间
--MySQL: 
date_format(a.day_time,'%Y-%m-%d %H:%i:%s')
 
--PostgreSQL: 
to_date(a.day_time,'yyyy-mm-dd HH:MM:SS')
  • IFNULL()函数
--MySQL: 
IFNULL(a.id,'')
 
--PostgreSQL: 
COALESCE(a.id,'')
  • sysdate()函数
MySQL: SELECT sysdate()
 
PostgreSQL: SELECT now()
  • find_in_set()函数
-- 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()函数
-- 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;
  • MyBatis-Plus整合MySQL、PostgreSQL,like使用
-- LIKE是一般用法,ILIKE匹配时则不区分字符串的大小写
 
-- MySQL:
	<select id="queryDetail" resultMap="reportResultMap">
       SELECT
       *
       FROM
       financial_report
       WHERE is_deleted=0 AND status = 1 AND name LIKE concat('%',#{handleTask.name},'%')
    </select>
 
-- PostgreSQL:
	<select id="queryDetail" resultMap="reportResultMap">
       SELECT
       *
       FROM
       financial_report
       WHERE is_deleted=0 AND status = 1 AND name like concat('%',#{handleTask.name}::varchar,'%')
    </select>
    温馨提醒:注意pgsql后面的处理,::varchar
  • 数据类型转化(针对于PgSQL)
-- 强转(在查询字段上指定数据类型)
 
a.a1 = b.b1::int8 
-- 或者 
a.a1::varchar = b.b1 
-- 或者
CAST(a.a1 AS varchar)
 
MySQL:CAST(a.a1 AS varchar)
  • 字段拼接
SELECT string_agg(address,',') FROM address GROUP BY grade;
--未去重的情况下:
string_agg|
----------|
黄河路,黄河路 |
黄河路,黄河路 |
SELECT string_agg(distinct address,',') FROM address GROUP BY grade;
string_agg|
----------|
黄河路     |
黄河路   |

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

SELECT string_agg(name,',' order by name desc) FROM address GROUP BY grade;
--结果:
string_agg|
----------|
小B,小A     |
小D,小C     |
  • 获取当前时间

1、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()               |
+------------+-----------+---------------------+
| 2024-02-24 | 11:45:47  | 2024-02-24 11:45:47 |
+------------+-----------+---------------------+
 
mysql> SELECT UTC_DATE(), UTC_TIME(), UTC_TIMESTAMP();
+------------+------------+---------------------+
| UTC_DATE() | UTC_TIME() | UTC_TIMESTAMP()     |
+------------+------------+---------------------+
| 2024-02-24 | 07:46:10   | 2024-02-24 07:46:10 |
+------------+------------+---------------------+
 
mysql> SELECT CURRENT_DATE(), CURRENT_TIME(), CURRENT_TIMESTAMP();
+----------------+----------------+---------------------+
| CURRENT_DATE() | CURRENT_TIME() | CURRENT_TIMESTAMP() |
+----------------+----------------+---------------------+
| 2024-02-24     | 11:46:31       | 2024-02-24 11:46:31 |
+----------------+----------------+---------------------+

2、PgSql

说明:precision表示秒的精度,比如想精确到3位,直接把precision填充成3就可以

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

写在最后

以上就是今天的干货分享,内容其实不难,一般遇到的时候查阅一下都有,这里就是记录一下,嗑瓜子的时候看到,刚好就有个概念。觉得有点收获的话,帮忙点赞 + 在看,分享不易,你的点赞是我坚持输出的动力,感激涕零,下期再见。

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

做一枚快乐的程序员

觉得不错的话,可以点赞加关注哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值