一、PostgreSQL是什么?
PostgreSQL是一個功能強大的開源對象關系數據庫管理系統(ORDBMS)。 用於安全地存儲數據; 支持最佳做法,並允許在處理請求時檢索它們。
PostgreSQL(也稱為Post-gress-Q-L
)由PostgreSQL全球開發集團(全球志願者團隊)開發。 它不受任何公司或其他私人實體控制。
它是開源的,其源代碼是免費提供的。PostgreSQL是跨平台的,可以在許多操作系統上運行,如Linux,OS X和Microsoft Windows等。
PostgreSQL特點

跨平台 支持文本、圖像、視頻、聲音等 並提供C/C++、Java、Perl、Python、Ruby放數據庫連接(ODBC)的編程接口。 支持SQL的許多功能,例如復雜的SQL查詢,子查詢,外鍵,觸發器,視圖,視圖,多進程並發控制(MVCC)、異步復制。 在PostgreSQL中,表可以設置為從“父”表繼承其特征。 PostgreSQL是第一個實現多版本並發控制(MVCC)功能的數據庫管理系統,甚至在Oracle之前。MVCC功能在Oracle中稱為快照隔離。 PostgreSQL是一個通用的對象 - 關系數據庫管理系統。它允許您添加使用不同編程語言(如C / C ++,Java等)開發的自定義函數。 PostgreSQL旨在實現可擴展性。在PostgreSQL中,您可以定義自己的數據類型,索引類型,函數語言等。如果您不喜歡系統的任何部分,您可以隨時開發自定義插件以增強它以滿足您的要求,例如,添加新的優化。 如果您需要任何支持,可以使用活躍的社區來提供幫助。您可以隨時找到PostgreSQL社區的答案,以了解使用PostgreSQL時可能遇到的問題。許多公司在您需要時提供商業支持服務。
PostgreSQL工具
- psql:命令行工具,也是管理PostgreSQL的主要工具
- pgAdmin:是PostgreSQL免費開源的圖形化界面管理工具
二、安裝PostgreSQL
可以參考postgresql官網安裝教程:https://www.postgresql.org/download/linux/redhat/
1、Linux安裝(centos)
安裝參考博客:https://www.jianshu.com/p/cc5bc168e5e1
添加RPM:
-- centos 6 安裝 postgresql 10
yum install https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-6-x86_64/pgdg-centos10-10-2.noarch.rpm
-- centos 7 安裝 postgresql 11
yum install https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7-x86_64/pgdg-centos11-11-2.noarch.rpm
安裝客戶端:
yum install postgresql11
安裝服務端:
yum install postgresql11-server
初始化與設置自啟動:
/usr/pgsql-11/bin/postgresql-11-setup initdb systemctl enable postgresql-11 systemctl start postgresql-11
默認會創建一個名為postgres的linux登錄用戶,這里進行密碼修改
(注意,這里修改的是linux登陸的賬號密碼,不是數據庫的)
passwd postgres
Python3安裝
pip install psycopg2
三、PostgreSQL數據庫命令
學習文檔:https://www.yiibai.com/postgresql/install-postgresql.html
# su - postgres -- 首先切換到postgres
-bash-4.1$ psql -- 輸入psql psql (10.5) Type "help" for help. postgres=#
注意:退出使用exit命令
創建用戶
postgres=# create user username with password '****'; CREATE ROLE postgres=#
需要注意:
1. 要以英文分號結尾
2.密碼需要引號包裹
1、創建數據庫
create database mydb;
或者
postgres=# create database dbtest owner username; -- 創建數據庫指定所屬者 CREATE DATABASE postgres=#
將數據庫得權限,全部賦給某個用戶
postgres=# grant all on database dbtest to username -- 將dbtest所有權限賦值給username GRANT postgres=#
2、刪除數據庫
drop database mydb
這個動作將在物理上把所有與該數據庫相關的文件都刪除並且不可取消, 因此做這中操作之前一定要考慮清楚。
3、訪問數據庫
運行PostgreSQL的交互式終端程序,它被稱為psql, 它允許你交互地輸入、編輯和執行SQL命令。
psql mydb -- 用下面的命令為mydb數據庫激活它
4、查看數據庫
postgres=# \l -- l是L的小寫
5.選擇數據庫,如果創建表的話,前提是在哪個數據庫中:
\c mydb -- 選擇mydb數據庫,注意\c是小寫
6.如果要退出psql
mydb=> \q
7、備份數據庫
可以使用pg_dump和pg_dumpall來完成。比如備份sales數據庫: pg_dump drupal>/opt/Postgresql/backup/1.bak
導入整個數據庫
psql -U username databasename < /data/dum.sql -- 用戶名和數據庫名
四、數據表操作
創建一個新表
通過指定表的名字、所有列的名字以及其數據類型來創建新的表:
CREATE TABLE weather ( city varchar(80), temp_lo int, -- 最低溫度 temp_hi int, -- 最高溫度 prcp real, -- 濕度 date date );
和mysql命令終端類似,psql可以識別該命令直到分號結束。SQL 是對關鍵字和標識符大小寫不敏感的語言,只有在標識符用雙引號包圍時才能保留它們的大小寫。兩個中橫線(--)表示注釋。
PostgreSQL支持標准的SQL類型int、smallint、real、double precision、char(N)、varchar(N)、date、time、timestamp和interval,還支持其他的通用功能的類型和豐富的幾何類型。PostgreSQL中可以定制任意數量的用戶定義數據類型。因而類型名並不是語法關鍵字,除了SQL標准要求支持的特例外。
第二個例子將保存城市和它們相關的地理位置:
CREATE TABLE cities ( name varchar(80), location point );
類型point就是一種PostgreSQL特有數據類型的例子。
刪除一張表:
drop table tablename; -- 刪除數據表
重命名一個表:
alter table [表名A] rename to [表名B];
列舉表
\dt
查看表結構
\d tblname
查看索引
\di
增
insert語句用於向表中添加行:
INSERT INTO weather VALUES ('San Francisco', 46, 50, 0.25, '1994-11-27');
需要注意的是:那些不是簡單數字的值,通常使用單引號包裹,date類型實際上對可接收的格式相當靈活,不過我們應該堅持使用這種清晰的格式。
point類型要求一個座標對作為輸入,如下:
INSERT INTO cities VALUES ('San Francisco', '(-194.0, 53.0)');
另一種方式是列出所有的列,一個可選的語法允許你明確地列出列:
INSERT INTO weather (city, temp_lo, temp_hi, prcp, date) VALUES ('San Francisco', 43, 57, 0.0, '1994-11-29');
你可以用另外一個順序列出列或者是忽略某些列, 比如說,我們不知道降水量:
INSERT INTO weather (date, city, temp_hi, temp_lo) VALUES ('1994-11-29', 'Hayward', 54, 37);
你還可以使用COPY從文本文件中裝載大量數據。這種方式通常更快,因為COPY命令就是為這類應用優化的, 只是比 INSERT少一些靈活性。比如:
COPY weather FROM '/home/user/weather.txt';
刪
刪除表中某行數據: delete from [表名] where [該行特征]; delete from [表名];--刪空整個表
刪除表中的字段:
alter table [表名] drop column [字段名];
去除缺省值:
alter table [表名] alter column [字段名] drop default;
改
修改表中的某行某列的數據 update [表名] set [目標字段名]=[目標值] where [該行特征];
在已有的表里添加字段:
alter table [表名] add column [字段名] [類型];
給一個字段設置缺省值:
alter table [表名] alter column [字段名] set default [新的默認值];
重命名一個字段:
alter table [表名] rename column [字段名A] to [字段名B];
查
- 使用DISTINCT運算符選擇不同的行
- 使用where進行過濾
- 使用order by進行排序
- 根據between,in,like選擇不同的行
- 使用group by進行分組
- 使用hving子句為 組應用條件
- 使用inner join、left join、full outer join、cross join進行連表查詢
postgresql的select例子
SELECT語法:
SELECT column_1, column_2, ... FROM table_name;
首先,指定要在select子句中查詢數據表的列,多個列使用逗號分隔,如果要查詢所有列,使用星號(*)作為簡寫;其次,在From之后指出表名。 使用星號(*)不是一個好習慣:
-- 在SELECT語句中使用星號(*)不是一個好習慣 。想象一下,你有一個包含許多列的大表,SELECT帶有星號(*)的語句將從整列中檢索所有數據,這可能不是必需的。
此外,從表中檢索不必要的數據會增加數據庫服務器和應用程序之間的流量。
因此,您的應用程序將變得緩慢且可擴展性降低。
因此,最好在SELECT子句中明確指定列名,以便只從表中獲取所需的數據。
LIMIT:PostgreSQL 中limit是select語句可選的子句,它獲取查詢返回的所有行的子集。
LIMIT語法:
SELECT * FROM table_name LIMIT n;
如果要在返回行之前跳過m行,請使用offset子句:
SELECT *FROM table LIMIT n OFFSET m;
由於數據庫表行的順序是不可預測的,因此在使用limit子句的時候,應始終使用該order by子句來控制行的順序。
我們經常使用LIMIT子句來獲取表中最高或最低項的數據,例如,要獲得最貴的前十名電影,您可以按照售價按降序排序,並使用LIMIT條款獲得前10部電影:
select * from film order by rental_rate desc limit 10;
ORDER BY:如何對查詢返回的結果集進行排序
當你從表中查詢數據,PostgreSQL按照他們插入的順序返回行,需要對結果集進行排序,需要使用select的order by子句
select column_1,column_2 from table_name order by column_1 ASC,column_2 DESC;
首先,在order by子句中指定要排序的列,如果基於多個列對結果集進行排序,使用逗號分隔。
使用ASC表示升序,DESC按照降序,如果省略,默認按照ASC。
DISTINCT:刪除結果集中重復行的子句
使用distinct語句可以從結果集中刪除重復的行,該distinct子句為每組重復項保留一行
select distinct column_1 from table_name; -- column_1列中的值用於評估重復項
select distinct column_1,column_2 from table_name; -- column_1列和column_2兩者的結合用於評估重復項
Pgsql常用命令:

連接數據庫, 默認的用戶和數據庫是postgres psql -U user -d dbname 切換數據庫,相當於mysql的use dbname \c dbname 列舉數據庫,相當於mysql的show databases \l 列舉表,相當於mysql的show tables \dt 查看表結構,相當於desc tblname,show columns from tbname \d tblname \di 查看索引 創建數據庫: create database [數據庫名]; 刪除數據庫: drop database [數據庫名]; *重命名一個表: alter table [表名A] rename to [表名B]; *刪除一個表: drop table [表名]; *在已有的表里添加字段: alter table [表名] add column [字段名] [類型]; *刪除表中的字段: alter table [表名] drop column [字段名]; *重命名一個字段: alter table [表名] rename column [字段名A] to [字段名B]; *給一個字段設置缺省值: alter table [表名] alter column [字段名] set default [新的默認值]; *去除缺省值: alter table [表名] alter column [字段名] drop default; 在表中插入數據: insert into 表名 ([字段名m],[字段名n],......) values ([列m的值],[列n的值],......); 修改表中的某行某列的數據: update [表名] set [目標字段名]=[目標值] where [該行特征]; 刪除表中某行數據: delete from [表名] where [該行特征]; delete from [表名];--刪空整個表 創建表: create table ([字段名1] [類型1] <references 關聯表名(關聯的字段名)>;,[字段名2] [類型2],......<,primary key (字段名m,字段名n,...)>;); \copyright 顯示 PostgreSQL 的使用和發行條款 \encoding [字元編碼名稱] 顯示或設定用戶端字元編碼 \h [名稱] SQL 命令語法上的說明,用 * 顯示全部命令 \prompt [文本] 名稱 提示用戶設定內部變數 \password [USERNAME] securely change the password for a user \q 退出 psql 可以使用pg_dump和pg_dumpall來完成。比如備份sales數據庫: pg_dump drupal>/opt/Postgresql/backup/1.bak
五、Psycopg簡介
Psycopg是Python編程語言中最流行的PostgreSQL數據庫適配器。它的主要功能是完整實現Python DB API 2.0規范和線程安全(多個線程可以共享相同的連接)。它專為大量多線程應用程序而設計,可以創建和銷毀大量游標並創建大量並發“INSERT”或“UPDATE”。Psycopg 2主要在C中作為libpq包裝器實現,從而既高效又安全。它具有客戶端和服務器端游標,異步通信和通知,“復制到/復制”支持。許多Python類型都支持開箱即用,適用於匹配PostgreSQL數據類型; 通過靈活的物體適應系統,可以擴展和定制適應性。Psycopg 2兼容Unicode和Python 3。
六、PsyCopg的使用
使用Python3連接postgresql數據庫
import psycopg2
#創建連接對象
conn=psycopg2.connect(database="postgres",user="postgres",password="123456",host="localhost",port="5432")
cur=conn.cursor() #創建指針對象
# 創建表
cur.execute("CREATE TABLE student(id integer,name varchar,sex varchar);")
#插入數據
cur.execute("INSERT INTO student(id,name,sex)VALUES(%s,%s,%s)",(1,'Aspirin','M'))
cur.execute("INSERT INTO student(id,name,sex)VALUES(%s,%s,%s)",(2,'Taxol','F'))
cur.execute("INSERT INTO student(id,name,sex)VALUES(%s,%s,%s)",(3,'Dixheral','M'))
# 獲取結果
cur.execute('SELECT * FROM student')
results=cur.fetchall()
print (results)
# 關閉連接
conn.commit()
cur.close()
conn.close()