隨便玩玩之PostgreSQL(第二章)單表數據查詢
隨便玩玩之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(第二章)單表數據查詢