一、前言
博主的系统既有 用到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