上一篇我们已经在rhel上创建了数据库,并且建立的一张成绩表。之后通过通过客户端连接上服务器端。
这一篇将会写一些关于数据库的操作,首先是一些基本的操作的操作如选择数据库,查看表等等。
连接至服务器端后可以通过以下命令查看数据库的基本信息
\l:查看所有数据库。
\c:选择数据库 。 \c+dbname+username可以选择某用户进入数据库。
\dt;查看所有的表。
\d:查看表结构 \d+tablename
\q:退出psql指令。
sql方面采用标准sql即可。这里提一个和mysql对比,postgresql多出的一个函数,窗口函数。
先来看一下这个函数能干什么。
以上一篇文章中新建的成绩表为例,查询各科的平均分。
这个sql在mysql中可以以以下语句实现
select subject,avg(score) from score group by subject;
subject | avg
---------+------------------
语文 | 90
化学 | 86.6666666666667
物理 | 93.3333333333333
数学 | 92.3333333333333
英语 | 84
上面是使用聚集函数实现各科平均分查询,下面看下如何使用窗口函数来实现各科平均分的查询。
select distinct subject,avg(score) over(PARTITION BY subject) from score;
subject | avg
---------+------------------
英语 | 84
物理 | 93.3333333333333
数学 | 92.3333333333333
语文 | 90
化学 | 86.6666666666667
可以看到,在使用窗口函数进行查询的时候添加了distinct 去重,这是因为,当使用窗口函数进行查询时,表内有多少记录,窗口函数就会打印多少条。
由此可见,窗口函数其实主要适用于进行原始数据和分类后的数据对比。
上面的这个例子可能不明显,下面再看一个对比功能的sql,查询所有人的分数,并和该科的平均分进行对比。
在聚集函数中查询列必须存在于group by中,所以要实现该功能较为困难。而窗口函数则可以轻而易举的实现。
select *,avg(score) over (PARTITION BY subject) from score order by id;
id | name | subject | score | avg
----+------+---------+-------+------------------
1 | wang | 数学 | 99 | 92.3333333333333
2 | wang | 语文 | 80 | 90
3 | wang | 物理 | 99 | 93.3333333333333
4 | wang | 化学 | 98 | 86.6666666666667
5 | wang | 英语 | 79 | 84
6 | liu | 数学 | 89 | 92.3333333333333
7 | liu | 语文 | 99 | 90
8 | liu | 物理 | 89 | 93.3333333333333
9 | liu | 化学 | 69 | 86.6666666666667
10 | liu | 英语 | 79 | 84
11 | zan | 数学 | 89 | 92.3333333333333
12 | zan | 语文 | 91 | 90
13 | zan | 物理 | 92 | 93.3333333333333
14 | zan | 化学 | 93 | 86.6666666666667
15 | zan | 英语 | 94 | 84
以上就是一些对于窗口函数的理解,有不对的地方还请指正。