postgresql從入門到菜鳥(三)基本命令和視窗函式
上一篇我們已經在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
以上就是一些對於視窗函式的理解,有不對的地方還請指正。