PostgreSQL 与MySQL 对比使用

一、前言

       博主的系统既有 用到MySQL 也有用到PostgreSQL ,之所以用到这两种数据库,主要是现在都是国产替代,虽然说这两款数据库也不是国产的,但是相对开源,oracle是不让用了。所以现在使用比较多的就是这两个关系型数据库PostgreSQL 与MySQL。那么什么情况下选择PostgreSQL ,什么情况下选择 MySQL呢。说句实话在这两种数据库选型时,我们的系统没做选型,就按照以前的服务使用了什么数据库,后面项目的演进就选择什么数据库。实在没办法,在公司不是我一个人说的算,哈哈哈。本节对比PostgreSQL 与MySQL 的使用区别

二、PostgreSQL 与MySQL 对比区别

两种数据库的定义

1 、MySQL

MySQL 声称自己是最流行的开源数据库,它属于最流行的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。LAMP 中的 M 指的就是 MySQL。构建在 LAMP 上的应用都会使用 MySQL。MySQL 最初是由 MySQL AB 开发的,然后在 2008 年以 10 亿美金的价格卖给了 Sun 公司,Sun 公司又在 2010 年被 Oracle 收购。Oracle 收购导致 MySQL 的出现两个版本:商业版和社区版。对于后者,由于 Oracle 控制了 MySQL 的开发,受到了广大使用者的批评。

2、 PostgreSQL

PostgreSQL 标榜自己是世界上最先进的开源数据库,属于关系型数据库管理系统 (ORDBMS), 是以加州大学计算机系开发的 POSTGRES,4.2 版本为基础的对象关系型数据库管理系统, 最初是 1985 年在加利福尼亚大学伯克利分校开发的,作为 Ingres 数据库的后继。PostgreSQL 是完全由社区驱动的开源项目。它提供了单个完整功能的版本,而不像 MySQL 那样提供了多个不同的社区版、商业版与企业版。PostgreSQL 基于自由的 BSD/MIT 许可,组织可以使用、复制、修改和重新分发代码,只需要提供一个版权声明即可。

比较

相对于 Postgres MySQL 更简单, 所以有着更高的流行度, 在技术资料,以及技术组件支持上,支持的也更完善一些, 但不意味着它并不是不能替代的, 于笔者而言, MYSQL 更像用于中小企业、个人的一款数据库工具, 因为会的人多, 文档资料比较完善,所以入手难度低。但这些并不意味着 MYSQL 是最好的。

MySQL 适用的场景

MySQL 适用于简单的应用场景,如电子商务、博客、网站等, 大中小型系统均可以使用 MySQL, 它最高支持千万级别到数亿级别的数据量, 但是在高性能要求的情况下, 比如较快的响应和较高的吞吐量的时候, MySQL 的性能稍微捉襟见肘, 另外,在查询条件比较复杂、业务吞吐量要求不高,响应时长无要求,的时候,可以选择 MySQL,

Postgres SQL适用的场景

总的来说, Postgre SQL 更适合复杂的数据结构、高级应用和大规模数据集, 当然如果数据规模比较小, 也可以选择 Postgres SQL, 无论是什么场景,如果你想用 Postgres SQL, 总可以找到对应的解决方法, 有且仅有, 在查询条件比较复杂,的时候不太适用, 因为根据我们实际线上的业务表现是 Postgre SQL 可能会选错索引。

PostgreSQL 相对于 MySQL 的优势

  • Postgre SQL 在性能上远远好于 MYSQL, 通过上面的压测数据即可体现,无论是在耗时,还是在整体吞吐量上,有显著优势。

  • Postgre SQL 在单行更新上有明显优势,尤其是启用了 HOT UPDATE 后, 性能比 MYSQL 高了一个数量级。

  • 在 SQL 的标准实现上要比 MySQL 完善,而且功能实现比较严谨,比较学院化;

  • Postgre SQL 主表采用堆表存放,MySQL 采用索引组织表,能够支持比 MySQL 更大的数据量。

  • Postgre SQL 的主备复制属于物理复制,相对于 MySQL 基于 binlog 的逻辑复制,数据的一致性更加可靠,复制性能更高,对主机性能的影响也更小。

  • MySQL 的事务隔离级别 repeatable read 并不能阻止常见的并发更新,得加锁才可以,但悲观锁会影响性能,手动实现乐观锁又复杂。而 Postgre SQL 的列里有隐藏的乐观锁 version 字段,默认的 repeatable read 级别就能保证并发更新的正确性,并且又有乐观锁的性能。

三、postgreSQL常用语法

一、查询基础

1、连接数据库

C:\PostgreSQL\9.5\bin\psql.exe -U postgres -d shop

2、检查数据库连接是否成功   

SELECT 1;

3、创建数据库   

CREATE DATABASE shop;

4、退出数据库口令   

\q

5、\d 数据库 ——得到所有表的名字

6、\d 表名 —— 得到表结构

7、创建表

CREATE TABLE <表名>

(<列名1> <数据类型> <该列所需约束>,

<列名2> <数据类型> <该列所需约束>,

<列名3> <数据类型> <该列所需约束>,

<列名4> <数据类型> <该列所需约束>,

...

<该表的约束1>, <该表的约束2>,……);

8、删除表      

DROP TABLE <表名>;

9、修改表-添加列

ALTER TABLE <表名> ADD COLUMN <列的定义>;

    注:Oracle和SQL Server中不用写COLUMN: ALTER TABLE <表名> ADD <列名> ;

    oracle还可以这样:ALTER TABLE <表名> ADD (<列名>,<列名>,<列名>... );

10、修改表-删除列

ALTER TABLE <表名> DROP COLUMN <列名>;

11、插入数据   

BEGIN TRANSACTION;

INSERT INTO Product VALUES ('0001', 'T恤衫', '衣服', 1000, 500, '2009-09-20');

COMMIT;

注:在MySQL中运行时,BEGIN TRANSACTION改写成 START TRANSACTION;在Oracle和DB2中运行时,无需使用BEGIN TRANSACTION;

12、变更表名

ALTER TABLE Product RENAME TO Product;

13、查询语句

(1) 查询全部列

  Select  *  from  <表名>;

星号(*)代表全部列的意思。

(2) 查询指定列

SELECT <列名>,<列名>,…… FROM <表名>;

注:查询多列时,需要使用逗号进行分隔。查询结果中列的顺序和

SELECT 子句中的顺序相同

14、用AS为列设置别名

例:SELECT  product_id as id,

product_name as name,

purchase_price as price

FROM  product;

别名可用中文,但要用“”。

15、SELECT子句可以用常数

例:SELECT '商品' as string,'2019-12-12' as date,product_id,product_name from product;

注:此处用单引号‘’。

16、查询结果去重:distinct

例:select distinct product_type from product;

注:用distinct时null类型数据也会被作为一类数据;distinct也可以同时合并多列

17、WHERE子句添加查询筛选条件

例:select product_name,product_type from product where product_type='衣服';

18、注释的书写方式

1行注释:写在--后面

多行注释:写在/*  和  */之间

19、使用(+、-、*、/)运算符

例:select product_name,sale_price,sale_price * 2 as “sale_price_x2” from product;

20、使用比较运算符

(1) 含义

(2) 字符串类型的数据原则上按字典的顺序排序,不能与数字的大小顺序混淆,如’1-3‘<’2’

(3) 对null数据不能用比较运算符

用特定语句:is null /is not null

21、逻辑运算符

(1) NOT运算符:用来否定某一条件

例:select product_name ,sale_price from product where not sale_price >= 1000;

(2) AND运算符

其两侧条件需同步成立,相当于”并且“

例:select product_name,purchase_price from product where product_type = '厨 房用具' and sale_price >=3000;

(3) OR运算符

其两侧条件只需一个成立,相当于”或者“

例:select product_name,purchase_price from product where product_type = '厨房用具' or sale_price >=3000;

(4) 运用括号控制运算优先级

例:select product_name,product_type,regist_date from product where product_type = '办公用品' and (regist_date = '2009-09-11' or regist_date = '2009-09-20');

注:AND运算符优先于OR运算符,想要先执行OR语句可以用括号

二、聚合函数:多行汇集成一行

1、COUNT:计算表中的记录数(行数)

 例:select count(*) from product;

计算某列非空行:SELECT COUNT(purchase_price)  FROM Product;

2、SUM: 计算表中数值列中数据的合计值

例:select sum(sale_price) from product

3、AVG: 计算表中数值列中数据的平均值

例:select avg(sale_price) from product;

4、MAX: 求出表中任意列中数据的最大值

MIN: 求出表中任意列中数据的最小值

例:SELECT MAX(sale_price), MIN(purchase_price)  FROM Product;

5、使用聚合函数删除重复值

6、Group by子句

(1) 只能存在 常数、聚合函数group by子句中指定的列名

(2) group by子句中不能用别名

(3) Where 子句中不能用聚合函数

例:select product_type,count(*) from product group by product_type;

7、Haveing 子句 :取符合条件的组

8、Order by:排序

三、数据更新

1、Insert

2、Delete from 【表名】

3、Update

(1) 多列更新

① -- 使用逗号对列进行分隔排列

UPDATE Product

SET sale_price = sale_price * 10,

purchase_price = purchase_price / 2

WHERE product_type = '厨房用具';

② -- 将列用()括起来的清单形式

UPDATE Product

SET (sale_price, purchase_price) = (sale_price * 10, 

purchase_price / 2)

WHERE product_type = '厨房用具';

4、事务是需要在同一个处理单元中执行的一系列更新处理的集合。

(1) 语法:

① 事务开始语句

② DML语句1,DML语句2,......

③ 事务结束语句(commit或rollback)

(2) 开启事务语句:

① (SQLserver、postgreSQL)Begin transaction

② (MySQL) start transaction

(3) 提交事务--commit

(4) 取消处理--rollback

5、ACID特性:所有的DBMS都遵循四种特性

(1) 原子性atomicity

(2) 一致性consistency

(3) 隔离性isolation

(4) 持久性durability

四、复杂查询

1.创建视图 view:保存好的select语句

(1)语法:

CREATE VIEW 视图名称(<视图列名1>, <视图列名2>, ……)

AS

<SELECT语句>

(2)法则:尽量避免在视图的基础上创建视图,会降低sql效率

(3)法则:定义视图时不能使用order by 语句

(4)法则:部分情况可以对视图进行更新,如既没有聚合也没有结合的select语句

①视图设定为只读,因此需要on insert do instead规则

例:CREATE OR REPLACE RULE insert_rule

AS ON INSERT

TO ProductJim DO INSTEAD

INSERT INTO Product VALUES (

new.product_id,

new.product_name,

new.product_type,

new.sale_price,

new.purchase_price,

new.regist_date);

2.删除视图:drop view 【表名】

3.删除关联视图:DROP VIEW ProductSum CASCADE;

4.关联子查询:在子查询中添加条件

五、函数

1.ABS绝对值:ABS(数值)

2.Mod求余:mod(被除数,除数)

3.Round四舍五入:round(对象数值,保留小数位数)

4.|| 拼接:字符串1||字符串2

5.Length字符串长度:length(字符串)

6.lower小写转换:lower(字符串)

7.upper大写转换:upper(字符串)

8.replace字符串的替换:replace(对象字符串,替换前字符串,替换后字符串)

9.Substring(对象字符串 from 截取的起始位置 for 截取的字符数)

10.Current_date当前日期

11.Current_time当前时间

12.Current_timestamp当前日期和时间

13.Extract(日期元素 from 日期)

14.cast类型转换:cast(转换前的值 as 想要转换的数据类型

15.Coalesce讲null值转换为其他值:coalesce(数值1,数值2,数值3......)

16.like字符串部分一致查询(%代表“0字符以上任意字符串”)

17.Like+指定字符串查询:

select * from samplelike where strcol like ‘abc__’;

查询”abc+任意三个字符”的字符串

18.Between范围查询

19.Is null ,is not null判断是否为null

20.in谓语--or 的简便用法

21.Exists

22.case表达式

语法:case when <求值表达式> then <表达式>

When <求值表达式> then <表达式>

When <求值表达式> then <表达式>

...

Else <>

          End

六、集合运算

1.Union表的加法

2.Union all包含重复行

3.Except记录的减法(Oracle中使用minus

4.Inner join内联结

5.Outer join外联结

6.Cross join 交叉联结

七、SQL高级处理

1.窗口函数

(1)语法:<窗口函数> OVER ([PARTITION BY <列清单>]  

ORDER BY <排序用列清单>)

PARTITION BY:能够设定排序的对象范围

ORDER BY:能够指定按照哪一列、何种顺序排序

(2)Rank函数:排序时,如存在相同位次的记录会跳过之后的位次(1,1,1,4)

(3)Dense_rank函数:排序时,如果存在相同位次,不会跳过(1,1,2,3)

(4)Row_number函数:赋予唯一连续位次

2.聚合函数作为窗口函数

(1)Sum函数:此处与纯聚合函数不一样,此处为累计

(2)Avg函数:计算移动平均

①Rows 2 preseding:(移动平均:截止到之前2行)

②Rows 2 following :(移动平均:截止到之后2行)

3.Grouping运算符

(1)Rollup同时得出合算和小计

(2)Grouping让null更加容易分辨

(3)Cube用数据搭积木

(4)Grouping sets取得期望的积木

(5)   可以从rollup或者cube的结果中取出部分记录

八、应用程序连接数据库

驱动:可以从网上下载(PostgreSQL JDBC Driver :https://jdbc.postgresql.org/download.html)

(1)ODBC:open database connectivity

(2)JDBC:java database connectivity

(3)C:\PostgreSQL\java\jdk\bin\java -cp D:\soft\PostgreSQL\jdbc\*;. DBConnect1

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

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

相关文章

cmake 构建Qt存在多个子项目的应用

概述&#xff1a;一般在开发UI应用时候我们都会存在多个子项目&#xff0c;比如一个是主UI界面的项目&#xff0c;有些动态库的项目&#xff0c;主UI中用到子项目中的动态库&#xff0c;我们来看看如何利用cmake来构建这样的一个工程&#xff0c;方便我们在跨平台中开发(macos、…

FullCalendar日历组件:进行任务增删改,参考gitee例子修改

效果 参考路径 zxj/FullCalendar开发示例 - 码云 - 开源中国 (gitee.com) 代码 主页面&#xff1a;index.php <?php ob_start(); include(includes/session.inc); ?> <!DOCTYPE html> <html><head><title>日程管理</title><meta …

python Matplotlib Tkinter-->tab切换3

环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 pillow 10.1.0 import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk import tkinter as tk import tkinter.messagebox as messagebox import …

MySQL认证方法介绍

阅读本文之前请参阅----MySQL 数据库安装教程详解&#xff08;linux系统和windows系统&#xff09; MySQL数据库的认证方法对于确保数据安全和维护系统完整性至关重要。在MySQL中&#xff0c;有多种认证方法可供选择&#xff0c;每种方法都有其特定的用途和配置方式。本文将详细…

2024.1.9-1.24

2024.1.9 TUE 类路径 feign远程调用 content-service的test调用media-api的如下接口&#xff0c;用来上传图片 nginx的代理 如上图&#xff0c;proxy_pass 后面跟的代理到的地址后面须有/否则不生效&#xff01;&#xff01;&#xff01;&#xff01; content-service定义…

医学试纸条图像处理技术

医学试纸条图像处理是一个重要的领域&#xff0c;它涉及到从医学试纸条上提取和分析信息的各种技术。这里是一些常见的工作步骤&#xff1a; 一、图像预处理&#xff1a;在处理任何图像之前&#xff0c;通常需要进行预处理步骤&#xff0c;以改善图像质量并准备后续分析。这可…

ETH Denver见!来参加DAO的领袖和爱好者的活动吧

我们将和 DAOBase 在美国丹佛举办 DAO 领袖和爱好者的盛会——“去中心化对话&#xff1a;DAO 治理的新时代”活动&#xff01; 随着加密货币和区块链技术的快速发展&#xff0c;DAO 已成为数字经济不可或缺的一部分。目前&#xff0c;已有超过 10 万个 DAO&#xff0c;拥有超…

Go语言必知必会100问题-05 接口污染

接口污染 在Go语言中&#xff0c;接口是我们设计和编写代码的基石。然而&#xff0c;像很多概念一样&#xff0c;滥用它是不好的。接口污染是指用不必要的抽象来编写代码&#xff08;刻意使用接口&#xff09;&#xff0c;使得代码更难以理解。这是具有不同习惯&#xff0c;特…

Rust-windows安装环境

文章目录 前言一、Using rustup (Recommended)二、配置vscode解决办法&#xff1a;在终端依次运行如下两条指令&#xff1a; 总结 前言 Rust学习系列&#xff0c;之前介绍了macOS环境下的rust安装方式macOS rust安装。这篇学习windows的rust安装方式。 提示&#xff1a;以下是…

【STM32备忘录】【STM32WB系列的BLE低功耗蓝牙】一、测试广播配置搜不到信号的注意事项

文章目录 一、预备知识&#xff1a;二、准备工具&#xff1a;三、FUS和无线协议栈更新流程四、广播例程测试五、DEBUG输出调试 一、预备知识&#xff1a; WB系列是双核单片机&#xff0c;用户写M4&#xff0c;无线协议栈使用M0新买到手的单片机&#xff0c;需要自己刷入使用的…

TF-IDF,textRank,LSI_LDA 关键词提取

目录 任务 代码 keywordExtract.py TF_IDF.py LSI_LDA.py 结果 任务 用这三种方法提取关键词&#xff0c;代码目录如下&#xff0c; keywordExtract.py 为运行主程序 corpus.txt 为现有数据文档 其他文件&#xff0c;停用词&#xff0c;方法文件 corpus.txt 可以自己…

DP读书:《半导体物理学(第八版)》(一)绪论 3min速通

DP读书&#xff1a;《半导体物理学&#xff08;第八版&#xff09;》刘恩科 3min速通半导体物理之绪论 DP读书&#xff1a;《半导体物理学&#xff08;第八版&#xff09;》刘恩科绪论第一章 半导体中的电子状态1.1 半导体的晶格结构和结合性质1.1.1 金刚石型结构和共价键1.1.2…

【电机仿真】HFI算法脉振高频电压信号注入观测器-PMSM无感FOC控制

【电机仿真】HFI算法脉振高频电压信号注入观测器-PMSM无感FOC控制 文章目录 前言一、脉振高频电压注入法简介&#xff08;注入在旋转坐标系的d轴&#xff09;1.旋转高频电压&#xff08;电流&#xff09;注入法2.脉振高频电压注入法 二、高频注入理论1.永磁同步电机的高频模型2…

Pyglet控件的批处理参数batch和分组参数group简析

先来复习一下之前写的两个例程&#xff1a; 1. 绘制网格线 import pygletwindow pyglet.window.Window(800, 600) color (255, 255, 255, 255) # 白色 lines []for y in range(0, window.height, 40):lines.append(pyglet.shapes.Line(0, y, window.width, y, colorcolo…

LeetCode704. 二分查找(C++)

LeetCode704. 二分查找 题目链接代码 题目链接 https://leetcode.cn/problems/binary-search/description/ 代码 class Solution { public:int search(vector<int>& nums, int target) {int left 0;int right nums.size() - 1;while(left < right){int midd…

外包工作两个月,技术退步让我决心改变

大家好&#xff0c;我是一名大专生&#xff0c;2019年通过校招进入了湖南的一家软件公司。在这里&#xff0c;我从事了接近4年的功能测试工作。然而&#xff0c;今年8月份&#xff0c;我深刻地意识到&#xff0c;我不能继续这样下去了。 长时间在一个舒适的环境里&#xff0c;…

数据库系统概论(超详解!!!) 第一节 绪论

1.四个基本概念 1.数据&#xff08;Data&#xff09; 数据&#xff08;Data&#xff09;是数据库中存储的基本对象 数据的定义&#xff1a;描述事物的符号记录 数据的种类&#xff1a;数字、文字、图形、图像、音频、视频、学生的档案记录等 数据的含义称为数据的语义&…

记生产OOM的故障分析

一、引言 生产上告警&#xff0c;交易堵塞&#xff0c;服务无响应&#xff0c;使用jstack、jmap、jhat命令进行故障分析。 Java虚拟机&#xff08;Java Virtual Machine&#xff0c;简称JVM&#xff09;作为Java语言的核心组件&#xff0c;为Java程序提供了运行环境和内存管理…

docker存储驱动

目录 一、写时复制和用时分配 二、联合文件系统 2.1、aufs ​编辑 2.2、分层的问题 2.3、overlay 2.4 文件系统区别 三、容器跑httpd案例 3.1、案例1&#xff1a;端口映射 3.2、案例2&#xff1a;制作httpd应用镜像 3.3、案例3&#xff1a;docker数据卷挂载 3.4、案…

【hot100】跟着小王一起刷leetcode -- 49. 字母异位词分组

【【hot100】跟着小王一起刷leetcode -- 49. 字母异位词分组 49. 字母异位词分组题目解读解题思路代码实现 总结 49. 字母异位词分组 题目解读 49. 字母异位词分组 ok&#xff0c;兄弟们&#xff0c;咱们来看看这道题&#xff0c;很明显哈&#xff0c;这里的关键词是字母异位…