pgsql官方文档学习笔记
2021/7/26 19:07:40
本文主要是介绍pgsql官方文档学习笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
pgsql学习
目录- pgsql学习
- 从头开始
- 安装
- 创建角色赋予权限
- 登陆权限
- 超级用户权限
- 创建数据库的权限
- 创建角色权限
- 启动复制权限
- 创建删除数据库
- 访问数据库
- sql语言
- 创建新表以及删除表
- 向表中添加行
- 查询一个表
- 在表间连接
- 聚合函数
- 更新
- 删除
- 高级特性
- 视图
- 外键
- 事务
- 窗口函数
- 继承
- 从头开始
从头开始
安装
本次是使用docker 拉取的pgsql的镜像来学习pgsql的
拉取镜像
docker pull postgres
查看镜像:
docker images
启动容器
docker run --name pg -e POSTGRES_PASSWORD=123456 -e POSTGRES_USER=postgres -p 5432:5432 -d postgres:latest
进入容器
docker exec -it 5ad99bf0c1d5 /bin/bash
连接postgresSql 命令
psql -h localhost -p 5432 -U postgres
创建角色赋予权限
一个数据库角色可以有一系列属性,这些属性定义他的权限,以及与客户认证系统的交互。
登陆权限
CREATE ROLE root LOGIN; CREATE USER name; # 默认就有登录权限
超级用户权限
默认的超级用户是 postgres ,密码是 123456 ,创建与初始超级用户权限一样的角色
CREATE ROLE root SUPERUSER;
创建数据库的权限
用户创建数据库也是需要权限的,拥有该权限才能创建数据库(对于超级用户是例外,因为他们超越所有权限检查)
CREATE ROLE name CREATEDB ;
创建角色权限
创建角色的权限也需要赋予 ,拥有该权限的角色,拥有更改和删除其他角色,以及给其他成员赋予或者撤销成员关系,不过,要创建、更改、删除一个超级用户角色的成员关系, 需要具有超级用户属性;只有CREATEROLE
还不够。
CREATE ROLE name CREATEROLE
启动复制权限
角色要想启动流复制,必须明确给出权限
CREATE ROLE name REPLICATION LOGIN
创建删除数据库
shell命令
创建数据库
$ createdb mydb -- 创建数据库
删除数据库
$ dropdb mydb -- 删除数据库
可能的报错
报错一
createdb: command not found
原因:那么就是PostgreSQL没有安装好:要么是就根本没装上、要么是搜索路径没有包含它。 尝试用绝对路径调用该命令试试:
$ /usr/local/pgsql/bin/createdb mydb
报错二
createdb: could not connect to database postgres: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
原因:这意味着服务器没有启动,或者没有在createdb
预期的地方启动。同样, 你也要检查安装指导或者找管理员。
报错三
createdb: could not connect to database postgres: FATAL: role "joe" does not exist
原因:
在这里提到了你自己的登陆名。如果管理员没有为你创建PostgreSQL 用户帐号,就会发生这些现像。
本次使用中,我出现了这种情况,但是我本身是有 postgres 角色的,使用命令更换用户就可以了
命令:
su postgres
备注
:PostgreSQL用户名 是和操作系统用户账号分开的。如果你与一个数据库连接,你可以指定以哪个 PostgreSQL用户名进行连接;如果你不指定,那么缺省 就是你当前的操作系统账号。如果这样,那么总有一个与操作系统用户同名的 PostgreSQL用户账号用于启动服务器,并且通常这个用 户都有创建数据库的权限。如果你不想以该用户身份登陆,那么你也可以在任何地方 声明一个
-U
选项来选择一个连接时使用的PostgreSQL用户名。
访问数据库
进入数据库的交互界面
$ psql mydb
返回
psql (14beta2 (Debian 14~beta2-1.pgdg100+1)) Type "help" for help. mydb=#
尝试使用sql命令进行交互
mydb=# select version() mydb-# ; -- 使用分号结束
mydb=# SELECT current_date; current_date -------------- 2021-07-26 (1 row)
select 2+2; ?column? ---------- 4 (1 row)
sql语言
创建新表以及删除表
你可以通过声明表的名字和所有字段的名字及其类型来创建表:
CREATE TABLE weather ( city varchar(80), temp_lo int, -- low temperature temp_hi int, -- high temperature prcp real, -- precipitation date date );
你可以在psql
里连换行符一起键入这些东西。psql
可以识别该命令直到分号才结束。
你可以在 SQL 命令中自由使用空白(空格,tab,换行符)。这意味着你可以用 和上面不同的对齐方式(甚至在同一行中)键入命令。双划线("--
") 引入注释,任何跟在它后面的东西直到该行的结尾都被忽略。
SQL 是对关键字 和标识符大小写不敏感的语言,只有在标识符用双引号包围时才能保留它们的 大小写属性(上面没有这么干)。
varchar(80)
声明一个可以存储最长 80 个字符的任意字符串的数据类型。 int
是普通的整数类型。real
是一种用于存储单精度浮点数 的类型。date
类型应该可以自解释。没错,类型为date
的字 段名字也是date
。这么做可能比较方便,也可能容易让人 混淆,你自己看啦。
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;
向表中添加行
-
方式一
INSERT
语句用于向表中添加行:INSERT INTO weather VALUES ('San Francisco', 46, 50, 0.25, '1994-11-27');
请注意所有数据类型都使用了相当明了的输入格式。那些不是简单数字值的常量必 需用单引号(
'
)包围,就像在例子里一样。date
类型实际上 对可接收的格式相当灵活,不过在本教程里,我们应该坚持使用这里显示的格式。 -
方式二
到目前为止使用的语法要求你记住字段的顺序。一个可选的语法允许你明确地列出字段:
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';
查询一个表
不知道表字段,查询表中所有行
SELECT * FROM weather;
知道表结构字段
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)
带算数表达式的查询
SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date FROM weather; -- as重命名字段
返回
city | temp_avg | date ---------------+----------+------------ San Francisco | 48 | 1994-11-27 San Francisco | 50 | 1994-11-29 Hayward | 45 | 1994-11-29 (3 rows)
带查询条件的查询
一个查询可以使用WHERE
子句进行"修饰",声明需要哪些行。 WHERE
子句包含一个布尔表达式(值为真),只有那些布尔表达式为 真的行才会被返回。允许你在条件中使用常用的布尔操作符(AND
, OR
,NOT
)。比如,下面的查询检索旧金山的下 雨天的天气:
SELECT * FROM weather WHERE city = 'San Francisco' AND prcp > 0.0;
排序操作(order by)
SELECT * FROM weather ORDER BY city, temp_lo;
消除重复数据(distinct)
SELECT DISTINCT city FROM weather;
备注一
虽然
SELECT *
对于即兴的查询是有用的,但我们普遍认为在生产代码中 这是很糟糕的风格,因为给表增加一个字段就改变了结果。
备注二
在一些数据库系统里,包括老版本的PostgreSQL,
DISTINCT
自动对行进行排序,因此ORDER BY
是多余的。但是这一点并不是 SQL 标准的要求,并且目前的PostgreSQL 并不保证DISTINCT
导致数据行被排序。
在表间连接
到目前为止,我们的查询一次只访问了一个表。查询可以一次访问多个表, 或者用某种方式访问一个表,而同时处理该表的多个行。一个同时访问同一个或 者不同表的多个行的查询叫连接查询。
举例来说,比如你 想列出所有天气记录以及这些记录相关的城市。要实现这个目标,我们需要拿 weather
表每行的city
字段和cities
表所有行的name
字段进行比较,并选取那些这些数值相匹配的行。
连接查询操作
SELECT * FROM weather, cities 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)
观察结果集的两个方面:
- 没有城市 Hayward 的结果行。这是因为在
cities
表里面没有与 Hayward 匹配的行,所以连接忽略了weather
表里的不匹配行。我们可以使用左连接来带上 Hayward 。 - 有两个字段包含城市名。这是正确的,因为
weather
和cities
表的字段是接在一起的。不过,实际上我们不想要这些, 因此你将可能希望明确列出输出字段而不是使用*
:
weather 表
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)
city表
select * from cities;
返回
name | location ---------------+----------- San Francisco | (-194,53) (1 row)
使用左连接
mydb=# SELECT * FROM weather left join cities on 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) Hayward | 37 | 54 | | 1994-11-29 | | (3 rows)
练习: 看看省略WHERE
子句的含义是什么。
SELECT * FROM weather from cities
返回
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) Hayward | 37 | 54 | | 1994-11-29 | (-194,53) (3 rows)
因为这些字段的名字都不一样,所以分析器自动找出它们属于哪个表,但是如果两个 表中有重复的字段名,你就必须使用字段全称限定你想要的字段:
SELECT weather.city, weather.temp_lo, weather.temp_hi, weather.prcp, weather.date, cities.location FROM weather, cities WHERE cities.name = weather.city;
一般认为在连接查询里使用字段全称是很好的风格,这样,即使在将来向其中一个 表里添加了同名字段也不会引起混淆。
where子句更类似一种内连接
SELECT city, temp_lo, temp_hi, prcp, date, location FROM weather, cities WHERE city = name; SELECT * FROM weather INNER JOIN cities ON (weather.city = cities.name);
这两者的更为相似
这个语法并非像上面那个那么常用,我们在这里写出来是为了让你更容易了解后面 的主题。
左外连接
SELECT * FROM weather LEFT OUTER JOIN cities ON (weather.city = cities.name); city | temp_lo | temp_hi | prcp | date | name | location ---------------+---------+---------+------+------------+---------------+----------- Hayward | 37 | 54 | | 1994-11-29 | | 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) (3 rows)
这个查询是一个左外连接,因为连接操作符(LEFT OUTER JOIN) 左边的表中的行在输出中至少出现一次,而右边的表只输出那些与左边的表中的某些行匹 配的行。如果输出的左表中的行没有右表中的行与其对应,那么右表中的字段将填充为 NULL 。
练习: 还有右连接和全连接。试着找出来它们能干什么。
右连接
SELECT * FROM weather right join cities on city = name; city | temp_lo | temp_hi | prcp | date | name | location ---------------+---------+---------+------+------------+---------------+----------- San Francisco | 43 | 57 | 0 | 1994-11-29 | San Francisco | (-194,53) San Francisco | 46 | 50 | 0.25 | 1994-11-27 | San Francisco | (-194,53) (2 rows)
全连接
SELECT * FROM weather FULL OUTER join cities on 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) Hayward | 37 | 54 | | 1994-11-29 | | (3 rows)
我们也可以把一个表和它自己连接起来。这叫自连接。 比如,假设我们想找出那些在其它天气记录的温度范围之外的天气记录。 这样我们就需要拿weather
表里每行的temp_lo
和temp_hi
字段与weather
表里其它行的temp_lo
和temp_hi
字段进行比较。我们可以用下面的查询实现这个目标:
SELECT W1.city, W1.temp_lo AS low, W1.temp_hi AS high, W2.city, W2.temp_lo AS low, W2.temp_hi AS high FROM weather W1, weather W2 WHERE W1.temp_lo < W2.temp_lo 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)
在这里我们把 weather 表重新标记为W1
和W2
以区分连接的左边和右边。 你还可以用这样的别名在其它查询里节约一些敲键,比如
SELECT * FROM weather w, cities c WHERE w.city = c.name;
聚合函数
更新
删除
高级特性
视图
外键
事务
窗口函数
继承
这篇关于pgsql官方文档学习笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-22项目:远程温湿度检测系统
- 2024-12-21《鸿蒙HarmonyOS应用开发从入门到精通(第2版)》简介
- 2024-12-21后台管理系统开发教程:新手入门全指南
- 2024-12-21后台开发教程:新手入门及实战指南
- 2024-12-21后台综合解决方案教程:新手入门指南
- 2024-12-21接口模块封装教程:新手必备指南
- 2024-12-21请求动作封装教程:新手必看指南
- 2024-12-21RBAC的权限教程:从入门到实践
- 2024-12-21登录鉴权实战:新手入门教程
- 2024-12-21动态权限实战入门指南