PostgreSQL的使用向导
文献参考:https://www.postgresql.org/docs/12/tutorial.html
这个文档,基本对PG的使用有一个感性认识。
数据库
创建数据库
[postgres@db ~]$ createdb zsddb
进入数据库
$ psql zsddb
查看版本
zsddb=# SELECT version();
version
---------------------------------------------------------------------------------------------------------
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
(1 row)
查看当前时间日期
zsddb=# SELECT current_date;
current_date
--------------
2019-12-02
(1 row)
简单的select
zsddb=# SELECT 2 + 2;
?column?
----------
4
(1 row)
获得帮助命令
zsddb=# \h
退出psql客户端
两种方式,如下:
zsddb=# quit
zsddb=# \q
创建表
weather和cities表的创建
CREATE TABLE weather (
city varchar(80),
temp_lo int, -- low temperature
temp_hi int, -- high temperature
prcp real, -- precipitation
date date
);
CREATE TABLE cities (
name varchar(80),
location point
);
删除表
DROP TABLE tablename;
插入数据
INSERT INTO weather VALUES ('San Francisco', 46, 50, 0.25, '1994-11-27');
The point type requires a coordinate pair as input, as shown here:
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);
数据库导出成csv文本文件
zsddb=# copy weather to '/home/postgres/weather.csv' delimiter ',' csv header;
COPY 3
zsddb=# exit
[postgres@db ~]$ cat /home/postgres/weather.csv
city,temp_lo,temp_hi,prcp,date
San Francisco,46,50,0.25,1994-11-27
San Francisco,43,57,0,1994-11-29
Hayward,37,54,,1994-11-29
查询表的语句
查询所有的数据
zsddb=# SELECT * FROM weather;
city | temp_lo | temp_hi | prcp | date
---------------+---------+---------+------+------------
San Francisco | 46 | 50 | 0.25 | 1994-11-27
San Francisco | 43 | 57 | 0 | 1994-11-29
Hayward | 37 | 54 | | 1994-11-29
(3 rows)
查看指定列
zsddb=# SELECT city, temp_lo, temp_hi, prcp, date FROM weather;
city | temp_lo | temp_hi | prcp | date
---------------+---------+---------+------+------------
San Francisco | 46 | 50 | 0.25 | 1994-11-27
San Francisco | 43 | 57 | 0 | 1994-11-29
Hayward | 37 | 54 | | 1994-11-29
(3 rows)
查看平均温度
zsddb=# SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date FROM weather;
city | temp_avg | date
---------------+----------+------------
San Francisco | 48 | 1994-11-27
San Francisco | 50 | 1994-11-29
Hayward | 45 | 1994-11-29
(3 rows)
查看城市是'San Francisco',降水率大于0的数据。
zsddb=# SELECT * FROM weather
zsddb-# WHERE city = 'San Francisco' AND prcp > 0.0;
city | temp_lo | temp_hi | prcp | date
---------------+---------+---------+------+------------
San Francisco | 46 | 50 | 0.25 | 1994-11-27
(1 row)
对城市排序
zsddb=# SELECT * FROM weather
zsddb-# ORDER BY city;
city | temp_lo | temp_hi | prcp | date
---------------+---------+---------+------+------------
Hayward | 37 | 54 | | 1994-11-29
San Francisco | 46 | 50 | 0.25 | 1994-11-27
San Francisco | 43 | 57 | 0 | 1994-11-29
(3 rows)
城市排序后,对温度再排序
zsddb=# SELECT * FROM weather
zsddb-# ORDER BY city, temp_lo;
city | temp_lo | temp_hi | prcp | date
---------------+---------+---------+------+------------
Hayward | 37 | 54 | | 1994-11-29
San Francisco | 43 | 57 | 0 | 1994-11-29
San Francisco | 46 | 50 | 0.25 | 1994-11-27
城市去重DISTINCT
zsddb=# SELECT DISTINCT city
zsddb-# FROM weather;
city
---------------
Hayward
San Francisco
(2 rows)
去重+排序
SELECT DISTINCT city
FROM weather
ORDER BY city;
表连接查询
查看zsddb数据库下的表名称
zsddb=# \dt
List of relations
Schema | Name | Type | Owner
--------+---------+-------+----------
public | cities | table | postgres
public | weather | table | postgres
(2 rows)
查看表结构
zsddb=# \d weather
Table "public.weather"
Column | Type | Collation | Nullable | Default
---------+-----------------------+-----------+----------+---------
city | character varying(80) | | |
temp_lo | integer | | |
temp_hi | integer | | |
prcp | real | | |
date | date | | |
zsddb=# \d cities
Table "public.cities"
Column | Type | Collation | Nullable | Default
----------+-----------------------+-----------+----------+---------
name | character varying(80) | | |
location | point | | |
weather.city和cities.name做表连接查询。
zsddb=# SELECT *
zsddb-# FROM weather, cities
zsddb-# WHERE city = name;
city | temp_lo | temp_hi | prcp | date | name | location
---------------+---------+---------+------+------------+---------------+-----------
San Francisco | 46 | 50 | 0.25 | 1994-11-27 | San Francisco | (-194,53)
San Francisco | 43 | 57 | 0 | 1994-11-29 | San Francisco | (-194,53)
(2 rows)
一般来说,你可能会输出你想要的列而不是"*"
zsddb=# SELECT city, temp_lo, temp_hi, prcp, date, location
zsddb-# FROM weather, cities
zsddb-# WHERE city = name;
city | temp_lo | temp_hi | prcp | date | location
---------------+---------+---------+------+------------+-----------
San Francisco | 46 | 50 | 0.25 | 1994-11-27 | (-194,53)
San Francisco | 43 | 57 | 0 | 1994-11-29 | (-194,53)
虽然pg的parser会自动分析city和name是属于哪个表的列。但是如果有同名的列话,还需手动指定,如下:
zsddb=# SELECT weather.city, weather.temp_lo, weather.temp_hi,
zsddb-# weather.prcp, weather.date, cities.location
zsddb-# FROM weather, cities
zsddb-# WHERE cities.name = weather.city;
city | temp_lo | temp_hi | prcp | date | location
---------------+---------+---------+------+------------+-----------
San Francisco | 46 | 50 | 0.25 | 1994-11-27 | (-194,53)
San Francisco | 43 | 57 | 0 | 1994-11-29 | (-194,53)
(2 rows)
上述的写法被广泛认为是good style ,还有一种替代写法如下:
zsddb=# SELECT *
zsddb-# FROM weather INNER JOIN cities ON (weather.city = cities.name);
city | temp_lo | temp_hi | prcp | date | name | location
---------------+---------+---------+------+------------+---------------+-----------
San Francisco | 46 | 50 | 0.25 | 1994-11-27 | San Francisco | (-194,53)
San Francisco | 43 | 57 | 0 | 1994-11-29 | San Francisco | (-194,53)
(2 rows)
其实为了说明,上面的连接其实是inner join的表连接。
现在我们要把 Hayward那条记录找回来,我们需要对weather 表中每条记录与cities的表的记录相匹配,如果
匹配不到,就用"empty value"来显示,这个就需要用到outer join。如下:
zsddb=# SELECT *
zsddb-# FROM weather LEFT OUTER JOIN cities ON (weather.city = cities.name);
city | temp_lo | temp_hi | prcp | date | name | location
---------------+---------+---------+------+------------+---------------+-----------
San Francisco | 46 | 50 | 0.25 | 1994-11-27 | San Francisco | (-194,53)
San Francisco | 43 | 57 | 0 | 1994-11-29 | San Francisco | (-194,53)
Hayward | 37 | 54 | | 1994-11-29 | |
(3 rows)
当然还有right outer joins and full outer joins,这里不演示了。
我们还可以对表自身做一个表连接,叫做self join,如下:
zsddb=# SELECT W1.city, W1.temp_lo AS low, W1.temp_hi AS high,
zsddb-# W2.city, W2.temp_lo AS low, W2.temp_hi AS high
zsddb-# FROM weather W1, weather W2
zsddb-# WHERE W1.temp_lo < W2.temp_lo
zsddb-# AND W1.temp_hi > W2.temp_hi;
city | low | high | city | low | high
---------------+-----+------+---------------+-----+------
San Francisco | 43 | 57 | San Francisco | 46 | 50
Hayward | 37 | 54 | San Francisco | 46 | 50
(2 rows)
当然,以后通过对表一个别名,减少select打query的数量,如下:
zsddb=# SELECT *
zsddb-# FROM weather w, cities c
zsddb-# WHERE w.city = c.name;
city | temp_lo | temp_hi | prcp | date | name | location
---------------+---------+---------+------+------------+---------------+-----------
San Francisco | 46 | 50 | 0.25 | 1994-11-27 | San Francisco | (-194,53)
San Francisco | 43 | 57 | 0 | 1994-11-29 | San Francisco | (-194,53)
Aggregate Functions 聚合函数
天气最大值
zsddb=# SELECT max(temp_lo) FROM weather;
max
-----
46
(1 row)
如果想知道temp_lo最大值对应的城市
zsddb=# SELECT city FROM weather
zsddb-# WHERE temp_lo = (SELECT max(temp_lo) FROM weather);
city
---------------
San Francisco
(1 row)
使用聚合函数,需要group by来进行分组。
zsddb=# SELECT city, max(temp_lo)
zsddb-# FROM weather
zsddb-# GROUP BY city;
city | max
---------------+-----
Hayward | 37
San Francisco | 46
(2 rows)
聚合函数,需要group by,再加where条件,挑选出小于40的。
zsddb=# SELECT city, max(temp_lo)
zsddb-# FROM weather
zsddb-# GROUP BY city
zsddb-# HAVING max(temp_lo) < 40;
city | max
---------+-----
Hayward | 37
(1 row)
update语句的应用
zsddb=# SELECT * FROM weather;
city | temp_lo | temp_hi | prcp | date
---------------+---------+---------+------+------------
San Francisco | 46 | 50 | 0.25 | 1994-11-27
San Francisco | 43 | 57 | 0 | 1994-11-29
Hayward | 37 | 54 | | 1994-11-29
(3 rows)
zsddb=# UPDATE weather
zsddb-# SET temp_hi = temp_hi - 2, temp_lo = temp_lo - 2
zsddb-# WHERE date > '1994-11-28';
UPDATE 2
zsddb=# SELECT * FROM weather;
city | temp_lo | temp_hi | prcp | date
---------------+---------+---------+------+------------
San Francisco | 46 | 50 | 0.25 | 1994-11-27
San Francisco | 41 | 55 | 0 | 1994-11-29
Hayward | 35 | 52 | | 1994-11-29
delete语句的应用
zsddb=# SELECT * FROM weather;
city | temp_lo | temp_hi | prcp | date
---------------+---------+---------+------+------------
San Francisco | 46 | 50 | 0.25 | 1994-11-27
San Francisco | 41 | 55 | 0 | 1994-11-29
Hayward | 35 | 52 | | 1994-11-29
(3 rows)
zsddb=# DELETE FROM weather WHERE city = 'Hayward';
DELETE 1
zsddb=# SELECT * FROM weather;
city | temp_lo | temp_hi | prcp | date
---------------+---------+---------+------+------------
San Francisco | 46 | 50 | 0.25 | 1994-11-27
San Francisco | 41 | 55 | 0 | 1994-11-29
(2 rows)
视图
CREATE VIEW myview AS
SELECT city, temp_lo, temp_hi, prcp, date, location
FROM weather, cities
WHERE city = name;
zsddb=# SELECT * FROM myview;
city | temp_lo | temp_hi | prcp | date | location
---------------+---------+---------+------+------------+-----------
San Francisco | 46 | 50 | 0.25 | 1994-11-27 | (-194,53)
San Francisco | 41 | 55 | 0 | 1994-11-29 | (-194,53)
(2 rows)
事务
PostgreSQL通过BEGIN和COMMIT这一对代表事务的开启。
BEGIN;
UPDATE accounts SET balance = balance - 100.00
WHERE name = 'Alice';
-- etc etc
COMMIT;
PostgreSQL的使用向导的更多相关文章
- DRDS和RDS主要用来存储用户交易信息,MongoDB主要用来存储商品维度信息
数据集成Data Integration-数加-大数据-阿里云 https://www.aliyun.com/product/cdp 数据集成支持的数据源 数据源类型 数据源 来源数据源被读取 目标数 ...
- 连接到 PostgreSQL 数据源(SQL Server 导入和导出向导)
本主题向你介绍如何从 SQL Server 导入和导出向导的“选择数据源”页或“选择目标”页连接到 PostgreSQL 数据源. 重要 连接到 PostgreSQL 数据库的详细需求和先决条件不在此 ...
- PostgreSQL:安装
官网地址:https://www.postgresql.org/ 安装文件下载地址:http://www.enterprisedb.com/products-services-training/pgd ...
- Navicat for PostgreSQL 必须知道的十大功能
Navicat for PostgreSQL 是一套易于使用的图形化 PostgreSQL 数据库管理工具.可使用强劲的 SQL 编辑器创建和运行查询.函数和使用多功能的数据编辑工具管理数据.Navi ...
- golang web实战之一(beego,mvc postgresql)
想写个小网站,听说MVC过时了,流行MVVM,但是看了一下gin+vue+axios方式,发现还有一堆知识点要掌握,尤其是不喜欢nodejs和javascript方式的写法.算了,还是用beego来写 ...
- Confluence 6 PostgreSQL 输入你的数据库细节
在 Confluence 的设置安装向导中,将会指导你 Confluence 如何连接到你的数据库.请确定选择 "My own database". 使用 JDBC 连接(默认) ...
- 在Windows中安装PostgreSQL
在Windows中安装PostgreSQL 虽然PostgreSQL是为类UNIX平台开发的,但它却是可以移植的.从7.1版本开始,PostgreSQL可以编译安装和作为一个PostgreSQL服务器 ...
- 【转帖】Windows下PostgreSQL安装图解
Windows下PostgreSQL安装图解 这篇文章主要为大家介绍了如果在Windows下安装PostgreSQL数据库的方法,需要的朋友可以参考下 现在谈起免费数据库,大多数人首先 ...
- PostgreSQL+pgpool-II复制方案
目录 PostgreSQL+pgpool-II复制方案 1. Pgpool-II介绍 2. pgpool-II安装 2.1 安装pgpool-II yum源,并安装pgpool-II 2.2 添加Pg ...
随机推荐
- deepin15.7挂载/home到单独的分区:
1.首先打开Gpart分区编辑器,找一个空闲的分区,调整好分区大小,格式化成ext4格式. 具体步骤为首先unmount所用到的盘,然后右击该盘选择'format to ext4',最后点击apply ...
- 通俗地说逻辑回归【Logistic regression】算法(一)
在说逻辑回归前,还是得提一提他的兄弟,线性回归.在某些地方,逻辑回归算法和线性回归算法是类似的.但它和线性回归最大的不同在于,逻辑回归是作用是分类的. 还记得之前说的吗,线性回归其实就是求出一条拟合空 ...
- MONGODB-LINUX 安装步骤
1.MongoDB 提供了 linux 各发行版本 64 位的安装包,你可以在官网下载安装包. 下载地址:https://www.mongodb.com/download-center#communi ...
- mysql分组和去重同时使用
这是我的数据结构: 这是我的统计SQL
- javascript创建一个基于数组的栈结构
栈是一种遵从后进先出(LIFO)原则的有序集合.新添加或待删除的元素都保存在栈的同 一端,称作栈顶,另一端就叫栈底.在栈里,新元素都靠近栈顶,旧元素都接近栈底. 栈拥有以下方法: push(eleme ...
- SpringBoot之集成MyBatis
引入工程依赖包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- SROP的一个实例
以前一直只是大概看过这种技术,没实践过,今天刚好遇到一道题,实践了一波,确实很方便 unmoxiao@cat ~/s/pd_ubuntu> r2 -A smallest 00:54:15 War ...
- 《吊打面试官》系列-Redis哨兵、持久化、主从、手撕LRU
你知道的越多,你不知道的越多 点赞再看,养成习惯 前言 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难.作为一个在互联 ...
- VueRouter爬坑第一篇-简单实践
VueRouter系列的文章示例编写时,项目是使用vue-cli脚手架搭建. 项目搭建的步骤和项目目录专门写了一篇文章:点击这里进行传送 后续VueRouter系列的文章的示例编写均基于该项目环境. ...
- 如何查看当前linux服务器是否支持虚拟化
[root@localhost ~]# grep -E '(svm|vmx)' /proc/cpuinfo 或者: [root@localhost ~]# cat /proc/cpuinfo 找到fl ...