PostgreSQL

1. postgreSQL

PostgreSQL是以加州大学伯克利分校计算机系开发的 POSTGRES,现在已经更名为PostgreSQL,版本 4.2为基础的对象关系型数据库管理系统(ORDBMS)。PostgreSQL支持大部分 SQL标准并且提供了许多其他现代特性:复杂查询、外键、触发器、视图、事务完整性、MVCC。同样,PostgreSQL 可以用许多方法扩展,比如, 通过增加新的数据类型、函数、操作符、聚集函数、索引。免费使用、修改、和分发 PostgreSQL,不管是私用、商用、还是学术研究使用。

特点与优势
PostgreSQL 是一个自由的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。它提供了相对其他开放源代码数据库系统(比如 MySQL 和 Firebird),和专有系统(比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server)之外的另一种选择。
PostgreSQL 不寻常的名字导致一些读者停下来尝试拼读它,特别是那些把SQL拼读为"sequel"的人。PostgreSQL 开发者把它拼读为 “post-gress-Q-L”。它也经常被简略念为 “postgres”。
事实上, PostgreSQL 的特性覆盖了 SQL-2/SQL-92 和 SQL-3/SQL-99,首先,它包括了可以说是目前世界上最丰富的数据类型的支持,其中有些数据类型可以说连商业数据库都不具备, 比如 IP 类型和几何类型等;其次,PostgreSQL 是全功能的自由软件数据库,很长时间以来,PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统(MVCC)、数据完整性检查等特性的唯一的一种自由软件的数据库管理系统。 Inprise 的 InterBase 以及SAP等厂商将其原先专有软件开放为自由软件之后才打破了这个唯一。最后,PostgreSQL拥有一支非常活跃的开发队伍,而且在许多黑客的努力下,PostgreSQL 的质量日益提高。
从技术角度来讲,PostgreSQL 采用的是比较经典的C/S(client/server)结构,也就是一个客户端对应一个服务器端守护进程的模式,这个守护进程分析客户端来的查询请求,生成规划树,进行数据检索并最终把结果格式化输出后返回给客户端。为了便于客户端的程序的编写,由数据库服务器提供了统一的客户端 C 接口。而不同的客户端接口都是源自这个 C 接口,比如ODBC,JDBC,Python,Perl,Tcl,C/C++,ESQL等, 同时也要指出的是,PostgreSQL 对接口的支持也是非常丰富的,几乎支持所有类型的数据库客户端接口。这一点也可以说是 PostgreSQL 一大优点。
架构
PostgreSQL强壮的一个原因源于它的架构。和商业数据库一样,PostgreSQL可以用于C/S(客户/服务器)环境。这对于用户和开发人员有很多好处。
PostgreSQL安装核心是数据库服务端进程。它允许在一个独立服务器上。需要访问存储在数据库中的数据的应用程序必须通过数据库进程。这些客户端程序无法直接访问数据,即使它们和服务程序在同一台机器上。

2. 特征

函数
通过函数,可以在数据库服务器端执行指令程序。尽管这样的指令程序可以使用基本的SQL语句写成,但是由于其缺乏流程控制等功能,所以在PostgreSQL中引入了使用其它程序语言编写函数的能力,包括:
  • 一个内置的名为PL/pgSQL的过程语言,类似于Oracle的PL/SQL;
  • 包括PL/Perl,plPHP,PL/Python,PL/Ruby,PL/sh,PL/Tcl与PL/Scheme在内的脚本语言;
  • 编译语言:C,C++,或Java(通过PL/Java)。
  • R统计语言(PL/R)。

以上部分的语言,甚至可以在触发器内执行。PostgreSQL支持行返回函数:它们的输出是一系列行类型数据的集合,可以在查询中当作表来使用。函数也可以被定义成以创建者或者调用者的身份运行。在某些场合,或者其他的数据库产品中,函数也会被称为“存储过程”,但技术上这两者并未有太大分别。

索引
在PostgreSQL中,用户可以自定义索引方法,或使用内置的B-tree,哈希表与GiST索引。PostgreSQL的索引功能同时也具有以下功能:
  • 反向索引检索:无须额外的索引就能实现类似ORDER BYfieldDESC的操作。
  • 表达式索引:可以建立基于表达式值而非数值或列的索引。
  • 部分索引:仅索引表的部分,可以通过在CREATE INDEX语句口添加WHERE从句以创建更小的索引。
  • 位图索引扫描:从8.1版开始支持此功能。该功能将读取多个索引,生成表示它们之间符合查询标准的多元组交集的位图。这样解决了混合索引的问题。在一个具有20列的表中,理论上能创建20!个索引,在实际应用中已不现实。使用位图索引扫描后,在每次查询时,它将能把约束条件中所涉及列各自的索引进行任意的排列组合。
触发器
触发器是由SQL语句查询所触发的事件。如:一个INSERT语句可能触发一个检查数据完整性的触发器。触发器通常由INSERT或UPDATE语句触发。
在PostgreSQL中,可在数据表上设置触发器,但无法在视图中设置(对视图的UPDATE或者INSERT操作可以使用规则(RULE)定义)。多个触发器可依据字母顺序依次执行。此外,除了使用内嵌的PL/PgSQL语言之外,触发器的函数也可以用PL/Perl,PL/Python等语言编写。
并发控制
PostgreSQL使用多版本并发控制(MVCC,Multiversion concurrency control)系统进行并发控制,该系统向每个用户提供了一个数据库的“快照”,用户在事务内所作的每个修改,对于其他的用户都不可见,直到该事务成功提交。这从很大程度上减少了对读取锁的依赖,同时保证了数据库高效地符合ACID原则。
规则
规则(RULE)允许一个查询能被重写,通常被用作实现可更新的视图。
数据类型
PostgreSQL内置丰富的数据类型,包括:
  • 任意精度的数值
  • 无限制长度文本
  • 几何图元
  • IP地址与IPv6地址
  • 无类域间路由地址块,MAC地址
  • 数组

此外,用户可以创建自定义数据类型,通常通过PostgreSQL的GiST机制,它们也能被很好得索引,比如PostGIS地理信息系统的数据类型。

定义对象
用户可以为数据库内几乎所有的对象定义新的类型,包括:
  • 索引
  • 操作符(可重载现有操作符。)
  • 聚合函数
  • 数据域
  • 数据类型转换
  • 会话(编码转换)
继承
数据表的结构及属性可从一个“父”表中继承,数据将在两者间共享。对子表中数据的插入或者删除也将在父表中体现,同样,对父表作出的修改,比如添加列等操作也会导致子表产生相应改动。该功能尚未完全实现,实际上,表的约束尚不能继承。比如,在一张外联参考了父表id字段的表中,插入一条具有子表中某条记录id数据的记录会导致失败,因为PostgreSQL在对父表的外键约束检查中不会检查子表的内容。
扩展
地理数据对象:PostGISGPL
全文检索:通过Tsearch2或OpenFTS, 将在8.3版本中内嵌Tsearch2。GPL
多种异步主/从复制方案,包括Slony-I(BSD授权),Mammoth Replicator
XML/XSLT支持contrib软件包中的XPath扩展GPL

3. demo

驱动下载地址:https://pan.baidu.com/s/1eBRESdntbnZQoN-yxJgFDA

功能:建立连接,数据读取

package com.epoint.HadoopAPIDemo;

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.Statement; 
 
public class PostgreSQLTest { 
    // JDBC连接串 
    static String url = "jdbc:postgresql://192.168.186.14:5432/hive"; 
    // PG用户名 
    static String usr = "hive"; 
    // PG密码 
    static String psd = "h3cDataEngine"; 
 
    public static void main(String args[]) { 
        Connection conn = null; 
        try { 
            Class.forName("org.postgresql.Driver"); 
            // 创建连接 
            conn = DriverManager.getConnection(url, usr, psd); 
            Statement st = conn.createStatement(); 
            // 查询TEST表内容 
            ResultSet rs = st.executeQuery("SELECT * FROM \"DBS\""); 
            while (rs.next()) { 
                System.out.print(rs.getString(1)); 
                System.out.print("  "); 
                System.out.println(rs.getString(2)); 
            } 
            rs.close(); 
            st.close(); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } finally { 
            // 关闭连接 
            if (conn != null) { 
                try { 
                    conn.close(); 
                    conn = null; 
                } catch (Exception e) { 
                    e.printStackTrace(); 
                } 
            } 
        } 
    } 
} 

你可能感兴趣的:(数据库)