PostgreSQL和mysql常用语法比较
1、分区表
mysql和pg中的分区表使用基本类似,同样都支持hash、range、list三种基本的分区类型。两者的区别在于:
mysql:不支持指定默认分区,最多只支持2级分区,不支持表达式分区。且需要注意,mysql当前除InnoDB或NDB之外的任何存储引擎都不支持分区表这一功能,如MyISAM。
pg:pg中可以通过default分区名的方式指定默认分区,并且支持多级别的分区,且支持不同种类分区的任意组。pg还支持表达式分区,不过必须得是immutable类型表达式。
除此之外主要注意的是,无论是pg还是mysql都必须pk、uk中包含分区键,因为两者目前都不支持全局索引。
2、语法
offset/limit:
mysql和pg中都支持offset/limit的分页语法,但是两者有一点不同:
–mysql
mysql> select * from t1 limit 2,2;
+------+------+
| id | ino |
+------+------+
| 3 | c |
| 4 | d |
+------+------+
2 rows in set (0.00 sec)
–pg
pg中不支持上面这种mysql的写法
bill=# select * from tbl limit 2,2;
ERROR: LIMIT #,# syntax is not supported
LINE 1: select * from tbl limit 2,2;^
HINT: Use separate LIMIT and OFFSET clauses.bill=# select * from tbl limit 2 offset 2;id | c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8 | c9 | c10
----+----+------+-----+------+---------+-------+----+--------+-------+-------3 | 92 | 8207 | 167 | 3031 | 363025 | 66793 | 31 | 108702 | 3358 | 462844 | 19 | 6982 | 834 | 4278 | 6929072 | 83949 | 80 | 8206 | 25265 | 59691
(2 rows)
类型转换:
mysql和pg中都支持cast(expression as target_type)的方法去进行类型转换,但是pg中除此之外还支持value::new_type的方法来进行类型转换。
bill=# select cast(id as int8) from t1 limit 1;id
----1
(1 row)bill=# select id::int8 from t1 limit 1;id
----1
(1 row)
upsert/replace:
pg中的upsert作用是当插入数据时:如果不存在则insert,存在则update。
语法为:
INSERT INTO table_name [ AS alias ] [ ( column_name [, ...] ) ][ ON CONFLICT [ conflict_target ] conflict_action ]and conflict_action is one of:DO NOTHINGDO UPDATE SET { column_name = { expression | DEFAULT } |( column_name [, ...] ) = [ ROW ] ( { expression | DEFAULT } [, ...] ) |( column_name [, ...] ) = ( sub-SELECT )} [, ...][ WHERE condition ]
mysql中使用replace来实现类似的功能。
语法为:
REPLACE [LOW_PRIORITY | DELAYED][INTO] tbl_name[PARTITION (partition_name [, partition_name] ...)][(col_name [, col_name] ...)]{ {VALUES | VALUE} (value_list) [, (value_list)] ...|VALUES row_constructor_list}
例子:
mysql> CREATE TABLE test (-> id INT UNSIGNED NOT NULL AUTO_INCREMENT,-> data VARCHAR(64) DEFAULT NULL,-> ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,-> PRIMARY KEY (id)-> );
Query OK, 0 rows affected (0.02 sec)mysql> REPLACE INTO test VALUES (1, 'Old', '2014-08-20 18:47:00');
Query OK, 1 row affected (0.00 sec)mysql> SELECT * FROM test;
+----+------+---------------------+
| id | data | ts |
+----+------+---------------------+
| 1 | Old | 2014-08-20 18:47:00 |
+----+------+---------------------+
1 row in set (0.00 sec)mysql> REPLACE INTO test VALUES (1, 'New', '2014-08-20 18:47:42');
Query OK, 2 rows affected (0.00 sec)mysql> SELECT * FROM test;
+----+------+---------------------+
| id | data | ts |
+----+------+---------------------+
| 1 | New | 2014-08-20 18:47:42 |
+----+------+---------------------+
1 row in set (0.00 sec)
load data:
mysql中使用load命令来实现加载数据的功能。
语法为:
LOAD DATA[LOW_PRIORITY | CONCURRENT] [LOCAL]INFILE 'file_name'[REPLACE | IGNORE]INTO TABLE tbl_name[PARTITION (partition_name [, partition_name] ...)][CHARACTER SET charset_name][{FIELDS | COLUMNS}[TERMINATED BY 'string'][[OPTIONALLY] ENCLOSED BY 'char'][ESCAPED BY 'char']][LINES[STARTING BY 'string'][TERMINATED BY 'string']][IGNORE number {LINES | ROWS}][(col_name_or_user_var[, col_name_or_user_var] ...)][SET col_name={expr | DEFAULT},[, col_name={expr | DEFAULT}] ...]
在pg中我们使用copy命令来实现同样的功能,copy命令分为服务端copy和客户端的copy协议。
语法为:
COPY table_name [ ( column_name [, ...] ) ]FROM { 'filename' | PROGRAM 'command' | STDIN }[ [ WITH ] ( option [, ...] ) ][ WHERE condition ]COPY { table_name [ ( column_name [, ...] ) ] | ( query ) }TO { 'filename' | PROGRAM 'command' | STDOUT }[ [ WITH ] ( option [, ...] ) ]
3、索引
mysql中索引类型:
btree索引;
invert索引,即倒排索引,常用来实现多值类型、json类型、全文检索等的索引查询;
表达式索引,mysql中的表达式索引不支持spatial和fulltext类型。
空间索引,mysql中不支持空间索引,其实现空间索引的方式是将空间对象转换成geohash编码,然后使用btree索引来实现。
pg中的索引类型:
支持多种索引类型:btree、hash、gin、gist、sp-gist、bloom、rum、brin;
还支持exclude索引、表达式索引、partial索引(分区索引);
支持空间索引,是真正的基于rtree的空间索引类型;
且pg开发了多种索引接口,用户可以自定义新的索引。
4、其它
约束:
mysql和pg一样都支持主键约束、外键约束、唯一约束、not null约束等。两者在约束方面的区别在于:
mysql:check约束不是强制的,即可以创建check约束,但是违反该约束的数据仍然不会报错;exclude排它约束mysql中不支持。
pg:pg中的check约束是强制的,如果数据不符合check约束则无法插入。并且pg中还支持exclude约束。
use/desc:
mysql中use database_name和desc table_name的快捷命令在pg中也有很方便的命令支持,pg中可以使用:\c database_name和\d table_name来代替。
除此之外,pg和mysql虽然都支持四种事务隔离级别,但是在pg中read uncommitted的隔离级别是不可用的,这也确保了在pg中不会出现脏读的现象。
另外在mysql中是存在隐式提交的,即在事务中的DDL语句会被自动提交,而在pg中不会。
例如:
–mysql
可以发现事务回滚后t2表仍然存在,因为已经自动提交了。
mysql> begin;
Query OK, 0 rows affected (0.00 sec)mysql> create table t2(id int);
Query OK, 0 rows affected (0.00 sec)mysql> insert into t2 values(222);
Query OK, 1 row affected (0.00 sec)mysql> rollback;
Query OK, 0 rows affected (0.00 sec)mysql> select * from t2;
+------+
| id |
+------+
| 222 |
+------+
1 row in set (0.00 sec)
–pg:
而在pg中却没有,可以被rollback
bill=# create table tt2(id int);
CREATE TABLE
bill=# insert into tt2 values(222);
INSERT 0 1
bill=# rollback ;
ROLLBACK
bill=# select * from t2;
ERROR: relation "t2" does not exist
PostgreSQL和mysql常用语法比较相关推荐
- Mysql常用语法总结
Mysql常用语法总结如下: #连接mysql数据库(Dos下面) mysql -u root -p 123 #创建数据库 create database myschool; #创建表 drop ta ...
- MYSQL常用语法命令,MySQL中delete,drop和alter分别是用来删除什么的?有什么区别?删除了以后可以恢复吗?
1.Alter.Delete.Drop相关语法 a.Alter 删除,添加或重新定义列 删除列:alter table tablename drop columnname 增加列:alter tabl ...
- PostgreSQL 与 MySQL 常用命令对照
有很多 MySQL 的用户在使用 PostgreSQL 时,对于 PostgreSQL 客户端(psql)的常用命令不是很熟悉,有时甚至会感到困惑,在此罗列 MySQL 客户端 mysql 与 Pos ...
- MySQL常用语法记录
0.说明 记录MySQL使用到的常用语法. 1.MySQLDISTINCT唯一 2.MySQLLIMIT限制 3.MySQL ORDER排序升序 4.MySQL DESC降序 5.MySQL WHER ...
- 【ChatGPT】输出MySQL常用语法汇总
以下是MySQL常用的语法汇总: 创建数据库 CREATE DATABASE database_name; 删除数据库 DROP DATABASE database_name; 创建表 CREATE ...
- MYSQL 常用语法学习汇总
数据库的概念 DB:数据库,保存一组有组织的数据的容器(database) DBMS:数据库管理系统,又称为数据库软件(产品),用于管理DB中的数据(Database Management Syste ...
- 一文读懂MySQL常用语法
MySQL查询语句链接地址 MySQL是什么? 成为MySQL大神的基础~ 数据类型 数值:整数,浮点数(小数) 日期:年,年月日,时分秒,年月日时分秒 字符串:文本类型字符串,二进制类型字符串 整形 ...
- 收藏|MySQL常用语法小结
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | http://8rr.co/uCbS 一.基础 ...
- 手写MySQL常用语法
文章目录 01 准备工作 02 了解你的数据库 03 检索数据 04 对数据排序 05 使用where进行数据筛选 06 组合where子句 07 使用通配符 08 正则表达式 09 计算字段 10 ...
- MySQL 常用语法 之 DISTINCT
DISTINCT作用很简单就是去除重复行的数据. 具体看下面列子 表A数据[两条 nami 99] nameA scoreA robin 98 nami 99 saber 98 lu ...
最新文章
- Martin Fowler对全世界程序员的建议
- 文件中数组的最大值及其对应的最小下标
- 用Everything搜索指定的路径
- 好程序员web前端分享javascript枚举算法
- 问:Linux下Chrome标题栏中文乱码
- 介绍一个能够对日志文件进行自定义高亮的 VS Code 扩展
- Flask服务部署与简单内网穿透
- TSQLDBServerHttpApi使用工作线程池
- 魅蓝x android 7,魅蓝x2什么时候发布 魅蓝x2发布时间最新消息
- ie6识别important问题
- 在此计算机中仅有部分vs2010产品升级到sp1,解决安装Microsoft Visual Studio 2010 Service Pack 1 ,系统无法找到指定的对象
- 愿天下有情人都是失散多年的兄妹(25分)
- Python读取文本内容
- Vue制作图片翻面效果
- 一、C++面向对象高级编程(上) (侯捷)
- 被火龙强奸了100次~~~怨念!
- 如何下载GitHub网站上的代码的方法(未完,更新中。。。)
- 计算机毕业设计springboot教学事务流转与管理平台k0446源码+系统+程序+lw文档+部署
- Shell 脚本中 set -ex 命令的作用
- open_nsfw: 雅虎基于Caffe的成人图片识别模型
热门文章
- 在crontab中找不到sqlplus命令
- 什么是Robtos.txt 协议?
- matlab第六章课后答案,第六章习题及答案
- 专业PDF转换Word/PPT/Excel工具:AnyBizSoft PDF Converter绿色便携版
- 中国生物医药产业集群产业战略布局及运营管理模式分析报告2021-2027年
- 编译原理-第一章:引论
- SLAM机器人开发(一)系统框图
- python交通流预测算法_基于遗传算法优化LSTM神经网络的交通流预测方法与流程...
- android zlib 和zip,gzip zip 和zlib
- Global Mapper居然也有手机版(附安装包下载)