1. 程式人生 > >隨便玩玩之PostgreSQL(第二章)單表數據查詢

隨便玩玩之PostgreSQL(第二章)單表數據查詢

兩種 fse 排序。 可能 結束 三個班 image sel div

隨便玩玩之PostgreSQL(第二章)單表數據查詢

未經授權不得轉載


第二章 單表數據查詢
數據庫的基本功能就是數據增查改刪,倘若不可以,要她還有什麽意義。數據查詢功能不僅僅是查詢,而且還能篩選,並且格式化顯示。
數據查詢使用SELECT語句,本章介紹如何使用SELECT查詢(列出)數據庫中的數據。


2.1查詢數據庫cj表中全部信息
方法一:使用“*”通配符查詢所有數據(所有字段數據)。

SELECT * FROM cj;

結果如圖。

技術分享

方法二:制定所有字段(列名)。每個字段用逗號(,)隔開。

SELECT id,kc,bj,xm,yw,sx,yy FROM cj;

結果如圖。

技術分享


2.2查詢數據庫中指定字段信息(只顯示出想要的列)。
字段不限制數量,只要是表內的字段,不限制個數,重復也可以。

SELECT xm,yw FROM cj;

結果列出所有學生的姓名和語文成績。

技術分享


2.4查詢指定記錄(只顯示想要的行)。
數據庫的信息本來就包含了各種信息,如cj表中包括一班、二班、三班的每一個學生的考試成績。倘若查詢一班所有人的成績,可以查出所有人的成績,然後在EXCEL中刪掉二班、三班的。數據量少的時候可以這樣,數據量多的時候速度就會下降。不過,我們可以通過限制查詢條件進行查詢,按條件查詢(列出)數據。

SELECT * FROM cj WHERE bj=‘一班‘;

結果如圖。
技術分享
語句中的等號(=)表示只查詢bj字段為一班的學生的成績。等號為判斷符,其他判斷符為<>(或者!=,表示不等於),<(表示左邊數值小於右邊數值),<=(表示小於等於右邊數值),>(表示大於右邊數值),>=(表示大於等於右邊數值),BETWEEN AND(表示介於兩個數值之間)。
如:

 1 --查詢語文成績大於60的學生。
 2 SELECT * FROM cj WHERE yw > 60;
3 --查詢語文成績在60到69之間的學生。 4 SELECT id,bj,xm,yw FROM cj WHERE yw BETWEEN 60 AND 69; 5 --或者 6 SELECT id,bj,xm,yw FROM cj WHERE yw>=60 AND yw<69; --結果與第四行語句相同。
7 --查詢語文成績不是60到69的學生。 8 SELECT * FROM cj WHERE yw NOT BETWEEN 60 AND 69;
9 --查詢英語成績等60的學生。
10 SELECT * FROM cj WHERE yy=60
11 --查詢英語成績等於60且必須等於70的學生(無意義,沒結果且不合邏輯)。 12 SELECT * FROM cj WHERE yy=60 AND yy=70;
13 --查詢張三的成績。 14 SELECT * FROM cj WHERE xm=’張三’;
15 --查詢張三其中考試的成績。 16 SELECT * FROM cj WHERE xm=張三 AND kc=期中考試;
17 --查詢語文成績大於80和(或)小於65的學生。 18 SELECT * FROM cj WHERE yw > 80 OR yw<65;

2.4多條件查詢
多條件查詢使用AND或OR操作符,可以指定2個及以上的條件。

AND操作符限定滿足所有條件才會有記錄返回。
如:查詢期中考試三班語文成績大於80的學生。

SELECT * FROM cj WHERE kc=期中考試 AND bj=三班 AND yw>80;

OR操作符只需所有條件中滿足一個條件即可。
如:查詢語文成績大於80或一班的學生。

SELECT * FROM cj WHERE yw>80 OR bj=一班;

用IN操作符實現OR操作符功能。
如:查詢英語成績等於60和(或)70的學生。

--OR操作符
SELECT * FROM cj WHERE yy=60 OR yy=70;
--IN操作符
SELECT * FROM cj WHERE yy in (60,70);

2.5 去掉查詢結果中的重復記錄。
cj表中共有18個學生的信息,每一個信息都有一個班級。想要從表中得到有多少個班級,只有查詢出所有班級字段,然後去掉重復的,只保留一個,即可得到班級數量。使用DISTINCT關鍵字即可去掉重復記錄,只保留一個記錄值。

SELECT DISTINCT bj FROM cj;

結果如圖。

技術分享

結果把所有的班級只列出一個,只需要數一數有多少行即可得出有三個班級。

也有不想數行的方法,使用count()函數即可實現。

SELECT  count(DISTINCT bj)  FROM cj;

結果如圖。

技術分享


2.6對查詢結果排序
默認查詢結果沒有排序,有可能每次的查詢結果順序都不一樣。使用ORDER BY子句可以對結果進行排序。
如:從低到高列出所有學生的語文成績。

SELECT xm,yw,bj,kc FROM cj ORDER BY yw;

結果如圖。
技術分享

如:先分期中考試、期末考試,在從低到高列出所有學生語文成績。

SELECT kc,yw,bj,xm FROM cj ORDER BY kc,yw;

結果如圖。

技術分享
默認排序為1-9,A-Z,逆序排列只需要在字段後加DESC關鍵字即可,DESC約束其前的字段,如果對所有排序條件逆序,需在所有關鍵字後加DESC。
如:列出從高到低列出所有學生期中考試語文成績。

SELECT kc,yw,bj,xm FROM cj WHERE kc=期中考試 ORDER BY kc,yw DESC;

結果如圖。

技術分享


2.7查詢結果分組
分組排序使用GROUP BY子句。
但是分組之後組字段顯示的值是什麽?做班級成績匯報時,一般說一班有多少個人,語文平均分是多少,語文最高分是多少,最低分是多少,不會說出每個人的成績,也不會隨便說一個人的成績。所以分組之後顯示的是計算的結果,計算使用聚合函數。常用的聚合函數有:計數量count(),求最大值max(),求最小值min(),計總和sum(),求平均avg()。
如:計算出各班的期中考試平均。

SELECT bj,avg(yw),avg(sx),avg(yy) FROM cj WHERE kc=期中考試 GROUP BY bj;

結果如圖。

技術分享
小數點太多?可以用round()函數截取。

SELECT bj,round(avg(yw),2),avg(sx),avg(yy) FROM cj WHERE kc=期中考試 GROUP BY bj;

結果如圖。
技術分享
一行的SQL語句太長?可以分行寫SQL語句,只要在最後有一個分號就可以。

SELECT     bj,
         round(avg(yw),2),
         avg(sx),avg(yy)
    FROM cj
    WHERE kc=期中考試
    GROUP BY bj;

結果如圖。

技術分享

語句換行不影響查詢結果。


表頭都是AVG,不美觀?使用AS關鍵字設置別名即可。

SELECT     bj AS "班級",
         round(avg(yw),2) AS "語文平均分",
         avg(sx)  AS "數學平均分",
         avg(yy)  AS "英語平均分"
    FROM cj
    WHERE kc=期中考試
    GROUP BY bj;

結果如圖。
技術分享
AS的功能是給字段或表起一個別名。


數據沒有排序,看起來不方便?分組之後再排序。

SELECT     bj AS "班級",
         round(avg(yw),2) AS "語文平均分",
         avg(sx)  AS "數學平均分",
         avg(yy)  AS "英語平均分"
    FROM cj
    WHERE kc=期中考試
    GROUP BY bj
    ORDER BY avg(yw);

結果如圖。
技術分享
註:最後的ORDER BY指定的不是字段本身,而是使用聚合函數計算後的字段。已經給avg(yw)設置了別名,那麽ORDER BY 能使用別名作為排序條件嗎?當然可以。

SELECT     bj AS "班級",
         round(avg(yw),2) AS "語文平均分",
         avg(sx)  AS "數學平均分",
         avg(yy)  AS "英語平均分"
    FROM cj
    WHERE kc=期中考試
    GROUP BY bj
    ORDER BY "語文平均分";

結果如圖。

技術分享


2.8查詢結果分組排序後再篩選
使用WHERE關鍵字可以篩選過濾數據,但是WHERE的篩選只能是指定選擇記錄的條件,請記住:WHERE關鍵字是用在記錄上的。對於分組之後的組有該如何篩選?HAVING關鍵字用來篩選分組之後的數據。
如:篩選出期中考試語文平均分大於70的班級。

SELECT   bj AS "班級",
             round(avg(yw),2) AS "語文平均分",
             avg(sx)  AS "數學平均分",
             avg(yy)  AS "英語平均分"
    FROM cj
    WHERE kc=期中考試
    GROUP BY bj
    HAVING avg(yw)>70;        

結果如圖。

技術分享


2.9限制查詢結果數量。
SELECT將返回所有匹配的行,可能是表中的所有行,如僅僅需要返回第一行或前幾行,使用LIMIT關鍵字。
如:查詢cj前3行的數據。

SELECT * FROM cj LIMIT 3;

結果如圖。

技術分享
也可以查詢從第4行開始的3條記錄。

SELECT * FROM cj LIMIT 3 OFFSET 4;

結果如圖。

技術分享
數據庫本身的記錄(行)從0開始計算,第4行應理解為數據庫的第5個記錄。


2.10 使用聚合函數實現分類匯總
count()函數計算表內行的總數。方法有兩種:count(*)計算表內行的總數,包括空值。Count(字段名)計算指定列行的總數,忽略空值。
sum()函數計算一個列的所有記錄累計總和。
avg()函數計算一個列的所有記錄的平均值。
Max()函數返回一個列的所有記錄中的最大值。
Min()函數返回一個列的所有記錄中的最小值。
如:實現EXCEL中的分類匯總功能。

 1 SELECT     
 2          bj                          AS "班級",
 3          count(bj)                   AS "人數",
 4          sum(yw)                     AS "語文總分",
 5          round(sum(yw)/count(bj),2)  AS "語文(除)",
 6          round(avg(yw),2)            AS "語文(返回)",
 7          round(avg(sx),2)            AS "數學平均分",
 8          round(avg(yy),2)            AS "英語平均分"
 9     FROM cj
10     WHERE kc = 期中考試
11     GROUP BY bj
12     ORDER BY avg(yw);    

結果如圖。
技術分享

得出的結果比EXCEL中的分類匯總更合理,使用方法也非常靈活。

至此,第二章結束,簡單介紹了單表查詢,語句都很簡單,但是很神奇。

隨便玩玩之PostgreSQL(第二章)單表數據查詢