文献参考:https://www.postgresql.org/docs/12/tutorial.html

这个文档,基本对PG的使用有一个感性认识。

目录

数据库

创建数据库

  1. [postgres@db ~]$ createdb zsddb

进入数据库

  1. $ psql zsddb

查看版本

  1. zsddb=# SELECT version();
  2. version
  3. ---------------------------------------------------------------------------------------------------------
  4. PostgreSQL 12.1 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-23), 64-bit
  5. (1 row)

查看当前时间日期

  1. zsddb=# SELECT current_date;
  2. current_date
  3. --------------
  4. 2019-12-02
  5. (1 row)

简单的select

  1. zsddb=# SELECT 2 + 2;
  2. ?column?
  3. ----------
  4. 4
  5. (1 row)

获得帮助命令

  1. zsddb=# \h

退出psql客户端

  1. 两种方式,如下:
  2. zsddb=# quit
  3. zsddb=# \q

创建表

weather和cities表的创建

  1. CREATE TABLE weather (
  2. city varchar(80),
  3. temp_lo int, -- low temperature
  4. temp_hi int, -- high temperature
  5. prcp real, -- precipitation
  6. date date
  7. );
  8. CREATE TABLE cities (
  9. name varchar(80),
  10. location point
  11. );

删除表

  1. DROP TABLE tablename;

插入数据

  1. INSERT INTO weather VALUES ('San Francisco', 46, 50, 0.25, '1994-11-27');
  2. The point type requires a coordinate pair as input, as shown here:
  3. INSERT INTO cities VALUES ('San Francisco', '(-194.0, 53.0)');
  4. INSERT INTO weather (city, temp_lo, temp_hi, prcp, date)
  5. VALUES ('San Francisco', 43, 57, 0.0, '1994-11-29');
  6. INSERT INTO weather (date, city, temp_hi, temp_lo)
  7. VALUES ('1994-11-29', 'Hayward', 54, 37);

数据库导出成csv文本文件

  1. zsddb=# copy weather to '/home/postgres/weather.csv' delimiter ',' csv header;
  2. COPY 3
  3. zsddb=# exit
  4. [postgres@db ~]$ cat /home/postgres/weather.csv
  5. city,temp_lo,temp_hi,prcp,date
  6. San Francisco,46,50,0.25,1994-11-27
  7. San Francisco,43,57,0,1994-11-29
  8. Hayward,37,54,,1994-11-29

查询表的语句

查询所有的数据

  1. zsddb=# SELECT * FROM weather;
  2. city | temp_lo | temp_hi | prcp | date
  3. ---------------+---------+---------+------+------------
  4. San Francisco | 46 | 50 | 0.25 | 1994-11-27
  5. San Francisco | 43 | 57 | 0 | 1994-11-29
  6. Hayward | 37 | 54 | | 1994-11-29
  7. (3 rows)

查看指定列

  1. zsddb=# SELECT city, temp_lo, temp_hi, prcp, date FROM weather;
  2. city | temp_lo | temp_hi | prcp | date
  3. ---------------+---------+---------+------+------------
  4. San Francisco | 46 | 50 | 0.25 | 1994-11-27
  5. San Francisco | 43 | 57 | 0 | 1994-11-29
  6. Hayward | 37 | 54 | | 1994-11-29
  7. (3 rows)

查看平均温度

  1. zsddb=# SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date FROM weather;
  2. city | temp_avg | date
  3. ---------------+----------+------------
  4. San Francisco | 48 | 1994-11-27
  5. San Francisco | 50 | 1994-11-29
  6. Hayward | 45 | 1994-11-29
  7. (3 rows)

查看城市是'San Francisco',降水率大于0的数据。

  1. zsddb=# SELECT * FROM weather
  2. zsddb-# WHERE city = 'San Francisco' AND prcp > 0.0;
  3. city | temp_lo | temp_hi | prcp | date
  4. ---------------+---------+---------+------+------------
  5. San Francisco | 46 | 50 | 0.25 | 1994-11-27
  6. (1 row)

对城市排序

  1. zsddb=# SELECT * FROM weather
  2. zsddb-# ORDER BY city;
  3. city | temp_lo | temp_hi | prcp | date
  4. ---------------+---------+---------+------+------------
  5. Hayward | 37 | 54 | | 1994-11-29
  6. San Francisco | 46 | 50 | 0.25 | 1994-11-27
  7. San Francisco | 43 | 57 | 0 | 1994-11-29
  8. (3 rows)

城市排序后,对温度再排序

  1. zsddb=# SELECT * FROM weather
  2. zsddb-# ORDER BY city, temp_lo;
  3. city | temp_lo | temp_hi | prcp | date
  4. ---------------+---------+---------+------+------------
  5. Hayward | 37 | 54 | | 1994-11-29
  6. San Francisco | 43 | 57 | 0 | 1994-11-29
  7. San Francisco | 46 | 50 | 0.25 | 1994-11-27

城市去重DISTINCT

  1. zsddb=# SELECT DISTINCT city
  2. zsddb-# FROM weather;
  3. city
  4. ---------------
  5. Hayward
  6. San Francisco
  7. (2 rows)

去重+排序

  1. SELECT DISTINCT city
  2. FROM weather
  3. ORDER BY city;

表连接查询

查看zsddb数据库下的表名称

  1. zsddb=# \dt
  2. List of relations
  3. Schema | Name | Type | Owner
  4. --------+---------+-------+----------
  5. public | cities | table | postgres
  6. public | weather | table | postgres
  7. (2 rows)

查看表结构

  1. zsddb=# \d weather
  2. Table "public.weather"
  3. Column | Type | Collation | Nullable | Default
  4. ---------+-----------------------+-----------+----------+---------
  5. city | character varying(80) | | |
  6. temp_lo | integer | | |
  7. temp_hi | integer | | |
  8. prcp | real | | |
  9. date | date | | |
  10. zsddb=# \d cities
  11. Table "public.cities"
  12. Column | Type | Collation | Nullable | Default
  13. ----------+-----------------------+-----------+----------+---------
  14. name | character varying(80) | | |
  15. location | point | | |

weather.city和cities.name做表连接查询。

  1. zsddb=# SELECT *
  2. zsddb-# FROM weather, cities
  3. zsddb-# WHERE city = name;
  4. city | temp_lo | temp_hi | prcp | date | name | location
  5. ---------------+---------+---------+------+------------+---------------+-----------
  6. San Francisco | 46 | 50 | 0.25 | 1994-11-27 | San Francisco | (-194,53)
  7. San Francisco | 43 | 57 | 0 | 1994-11-29 | San Francisco | (-194,53)
  8. (2 rows)

一般来说,你可能会输出你想要的列而不是"*"

  1. zsddb=# SELECT city, temp_lo, temp_hi, prcp, date, location
  2. zsddb-# FROM weather, cities
  3. zsddb-# WHERE city = name;
  4. city | temp_lo | temp_hi | prcp | date | location
  5. ---------------+---------+---------+------+------------+-----------
  6. San Francisco | 46 | 50 | 0.25 | 1994-11-27 | (-194,53)
  7. San Francisco | 43 | 57 | 0 | 1994-11-29 | (-194,53)

虽然pg的parser会自动分析city和name是属于哪个表的列。但是如果有同名的列话,还需手动指定,如下:

  1. zsddb=# SELECT weather.city, weather.temp_lo, weather.temp_hi,
  2. zsddb-# weather.prcp, weather.date, cities.location
  3. zsddb-# FROM weather, cities
  4. zsddb-# WHERE cities.name = weather.city;
  5. city | temp_lo | temp_hi | prcp | date | location
  6. ---------------+---------+---------+------+------------+-----------
  7. San Francisco | 46 | 50 | 0.25 | 1994-11-27 | (-194,53)
  8. San Francisco | 43 | 57 | 0 | 1994-11-29 | (-194,53)
  9. (2 rows)

上述的写法被广泛认为是good style ,还有一种替代写法如下:

  1. zsddb=# SELECT *
  2. zsddb-# FROM weather INNER JOIN cities ON (weather.city = cities.name);
  3. city | temp_lo | temp_hi | prcp | date | name | location
  4. ---------------+---------+---------+------+------------+---------------+-----------
  5. San Francisco | 46 | 50 | 0.25 | 1994-11-27 | San Francisco | (-194,53)
  6. San Francisco | 43 | 57 | 0 | 1994-11-29 | San Francisco | (-194,53)
  7. (2 rows)

其实为了说明,上面的连接其实是inner join的表连接。

现在我们要把 Hayward那条记录找回来,我们需要对weather 表中每条记录与cities的表的记录相匹配,如果

匹配不到,就用"empty value"来显示,这个就需要用到outer join。如下:

  1. zsddb=# SELECT *
  2. zsddb-# FROM weather LEFT OUTER JOIN cities ON (weather.city = cities.name);
  3. city | temp_lo | temp_hi | prcp | date | name | location
  4. ---------------+---------+---------+------+------------+---------------+-----------
  5. San Francisco | 46 | 50 | 0.25 | 1994-11-27 | San Francisco | (-194,53)
  6. San Francisco | 43 | 57 | 0 | 1994-11-29 | San Francisco | (-194,53)
  7. Hayward | 37 | 54 | | 1994-11-29 | |
  8. (3 rows)

当然还有right outer joins and full outer joins,这里不演示了。

我们还可以对表自身做一个表连接,叫做self join,如下:

  1. zsddb=# SELECT W1.city, W1.temp_lo AS low, W1.temp_hi AS high,
  2. zsddb-# W2.city, W2.temp_lo AS low, W2.temp_hi AS high
  3. zsddb-# FROM weather W1, weather W2
  4. zsddb-# WHERE W1.temp_lo < W2.temp_lo
  5. zsddb-# AND W1.temp_hi > W2.temp_hi;
  6. city | low | high | city | low | high
  7. ---------------+-----+------+---------------+-----+------
  8. San Francisco | 43 | 57 | San Francisco | 46 | 50
  9. Hayward | 37 | 54 | San Francisco | 46 | 50
  10. (2 rows)

当然,以后通过对表一个别名,减少select打query的数量,如下:

  1. zsddb=# SELECT *
  2. zsddb-# FROM weather w, cities c
  3. zsddb-# WHERE w.city = c.name;
  4. city | temp_lo | temp_hi | prcp | date | name | location
  5. ---------------+---------+---------+------+------------+---------------+-----------
  6. San Francisco | 46 | 50 | 0.25 | 1994-11-27 | San Francisco | (-194,53)
  7. San Francisco | 43 | 57 | 0 | 1994-11-29 | San Francisco | (-194,53)

Aggregate Functions 聚合函数

天气最大值

  1. zsddb=# SELECT max(temp_lo) FROM weather;
  2. max
  3. -----
  4. 46
  5. (1 row)

如果想知道temp_lo最大值对应的城市

  1. zsddb=# SELECT city FROM weather
  2. zsddb-# WHERE temp_lo = (SELECT max(temp_lo) FROM weather);
  3. city
  4. ---------------
  5. San Francisco
  6. (1 row)

使用聚合函数,需要group by来进行分组。

  1. zsddb=# SELECT city, max(temp_lo)
  2. zsddb-# FROM weather
  3. zsddb-# GROUP BY city;
  4. city | max
  5. ---------------+-----
  6. Hayward | 37
  7. San Francisco | 46
  8. (2 rows)

聚合函数,需要group by,再加where条件,挑选出小于40的。

  1. zsddb=# SELECT city, max(temp_lo)
  2. zsddb-# FROM weather
  3. zsddb-# GROUP BY city
  4. zsddb-# HAVING max(temp_lo) < 40;
  5. city | max
  6. ---------+-----
  7. Hayward | 37
  8. (1 row)

update语句的应用

  1. zsddb=# SELECT * FROM weather;
  2. city | temp_lo | temp_hi | prcp | date
  3. ---------------+---------+---------+------+------------
  4. San Francisco | 46 | 50 | 0.25 | 1994-11-27
  5. San Francisco | 43 | 57 | 0 | 1994-11-29
  6. Hayward | 37 | 54 | | 1994-11-29
  7. (3 rows)
  8. zsddb=# UPDATE weather
  9. zsddb-# SET temp_hi = temp_hi - 2, temp_lo = temp_lo - 2
  10. zsddb-# WHERE date > '1994-11-28';
  11. UPDATE 2
  12. zsddb=# SELECT * FROM weather;
  13. city | temp_lo | temp_hi | prcp | date
  14. ---------------+---------+---------+------+------------
  15. San Francisco | 46 | 50 | 0.25 | 1994-11-27
  16. San Francisco | 41 | 55 | 0 | 1994-11-29
  17. Hayward | 35 | 52 | | 1994-11-29

delete语句的应用

  1. zsddb=# SELECT * FROM weather;
  2. city | temp_lo | temp_hi | prcp | date
  3. ---------------+---------+---------+------+------------
  4. San Francisco | 46 | 50 | 0.25 | 1994-11-27
  5. San Francisco | 41 | 55 | 0 | 1994-11-29
  6. Hayward | 35 | 52 | | 1994-11-29
  7. (3 rows)
  8. zsddb=# DELETE FROM weather WHERE city = 'Hayward';
  9. DELETE 1
  10. zsddb=# SELECT * FROM weather;
  11. city | temp_lo | temp_hi | prcp | date
  12. ---------------+---------+---------+------+------------
  13. San Francisco | 46 | 50 | 0.25 | 1994-11-27
  14. San Francisco | 41 | 55 | 0 | 1994-11-29
  15. (2 rows)

视图

  1. CREATE VIEW myview AS
  2. SELECT city, temp_lo, temp_hi, prcp, date, location
  3. FROM weather, cities
  4. WHERE city = name;
  5. zsddb=# SELECT * FROM myview;
  6. city | temp_lo | temp_hi | prcp | date | location
  7. ---------------+---------+---------+------+------------+-----------
  8. San Francisco | 46 | 50 | 0.25 | 1994-11-27 | (-194,53)
  9. San Francisco | 41 | 55 | 0 | 1994-11-29 | (-194,53)
  10. (2 rows)

事务

PostgreSQL通过BEGINCOMMIT这一对代表事务的开启。

  1. BEGIN;
  2. UPDATE accounts SET balance = balance - 100.00
  3. WHERE name = 'Alice';
  4. -- etc etc
  5. COMMIT;

PostgreSQL的使用向导的更多相关文章

  1. DRDS和RDS主要用来存储用户交易信息,MongoDB主要用来存储商品维度信息

    数据集成Data Integration-数加-大数据-阿里云 https://www.aliyun.com/product/cdp 数据集成支持的数据源 数据源类型 数据源 来源数据源被读取 目标数 ...

  2. 连接到 PostgreSQL 数据源(SQL Server 导入和导出向导)

    本主题向你介绍如何从 SQL Server 导入和导出向导的“选择数据源”页或“选择目标”页连接到 PostgreSQL 数据源. 重要 连接到 PostgreSQL 数据库的详细需求和先决条件不在此 ...

  3. PostgreSQL:安装

    官网地址:https://www.postgresql.org/ 安装文件下载地址:http://www.enterprisedb.com/products-services-training/pgd ...

  4. Navicat for PostgreSQL 必须知道的十大功能

    Navicat for PostgreSQL 是一套易于使用的图形化 PostgreSQL 数据库管理工具.可使用强劲的 SQL 编辑器创建和运行查询.函数和使用多功能的数据编辑工具管理数据.Navi ...

  5. golang web实战之一(beego,mvc postgresql)

    想写个小网站,听说MVC过时了,流行MVVM,但是看了一下gin+vue+axios方式,发现还有一堆知识点要掌握,尤其是不喜欢nodejs和javascript方式的写法.算了,还是用beego来写 ...

  6. Confluence 6 PostgreSQL 输入你的数据库细节

    在 Confluence 的设置安装向导中,将会指导你 Confluence 如何连接到你的数据库.请确定选择 "My own database". 使用 JDBC 连接(默认) ...

  7. 在Windows中安装PostgreSQL

    在Windows中安装PostgreSQL 虽然PostgreSQL是为类UNIX平台开发的,但它却是可以移植的.从7.1版本开始,PostgreSQL可以编译安装和作为一个PostgreSQL服务器 ...

  8. 【转帖】Windows下PostgreSQL安装图解

    Windows下PostgreSQL安装图解     这篇文章主要为大家介绍了如果在Windows下安装PostgreSQL数据库的方法,需要的朋友可以参考下     现在谈起免费数据库,大多数人首先 ...

  9. PostgreSQL+pgpool-II复制方案

    目录 PostgreSQL+pgpool-II复制方案 1. Pgpool-II介绍 2. pgpool-II安装 2.1 安装pgpool-II yum源,并安装pgpool-II 2.2 添加Pg ...

随机推荐

  1. SpringCloud Config(配置中心)实现配置自动刷新(十六)

    一.实现原理 1.ConfigServer(配置中心服务端)从远端git拉取配置文件并在本地git一份,ConfigClient(微服务)从ConfigServer端获取自己对应 配置文件: 2.当远 ...

  2. JavaFX简介和Scene Builder工具的安装使用简易教程

    JavaFX概述和简介 富互联网应用是那些提供与Web应用程序类似的功能,并可作为桌面应用程序体验的应用.与用户的正常网络应用程序相比,它们提供更好的视觉体验.这些应用程序可作为浏览器插件或作为虚拟机 ...

  3. 《JavaScript设计模式与开发实践》-- 单例模式

    详情个人博客:https://shengchangwei.github.io/js-shejimoshi-danli/ 原来只是听过设计模式,却不晓得其真面目,今天,终于步入了设计模式学习的殿堂,想想 ...

  4. Python3 下的输出字符控制

    最近在使用 python3 进行爬虫的时候,出现了令人窒息的,只会在 python2 中遇到的,没想到在 python3 还能碰见的输出编码问题,报错如下: UnicodeEncodeError: ' ...

  5. [考试反思]0924csp-s模拟测试51:破碎

    总参赛人数:15 有点菜. 不知道是撞了什么大运没有滚出A层. 但是一回到A层就暴露出了一个大问题:码速. 不是调试速度,,就是纯粹码的速度... 边讲考试状态边说吧... 上来肝T1.一看,是个换根 ...

  6. 「刷题」JZPKIL

    这道反演题,真牛逼. 以下用$B$代表伯努利数,$l*g=f$代表狄利克雷卷积,先推式子. 对于给出的$n,x,y$求一百组数据的$ans$ $\begin{array}{rcl} ans & ...

  7. 19.7.29 NOIP模拟10

    话说这次三道考试题直接可以连成一个段子:我一个辣鸡,连模板都不会打,只能跪倒在大佬面前; T1 辣鸡 但是我实在是太辣鸡了,最后干的T1,时间不够用,连暴力都没打对,无奈之下交了一个qj程序,60分( ...

  8. C语言中的可变参数-printf的实现原理

    C语言中的可变参数-printf的实现原理 在C/C++中,对函数参数的扫描是从后向前的.C/C++的函数参数是通过压入堆栈的方式来给函数传参数的(堆栈是一种先进后出的数据结构),最先压入的参数最后出 ...

  9. PHP创建文件命名中文乱码解决的方法

    PHP创建文件命名中文乱码解决的方法 <pre>iconv('utf-8', 'gbk', $dir); </pre> 因为系统环境是gbk 所以里面的字符也要gbk 编码一致 ...

  10. JS 暴虐算法查找

      @dd|ad|fds|d@dd|ad|fds|d@dd|ad|fds|d@   var e = [];     window.onload = function () {         var ...