1. 程式人生 > >postgresql從入門到菜鳥(三)基本命令和視窗函式

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

以上就是一些對於視窗函式的理解,有不對的地方還請指正。