每天一點資料庫之-----Day 6 資料分組與資料分頁,-----day分頁
每天一點資料庫之-----Day 6 資料分組與資料分頁
----轉載請註明出處:coder-pig
本節引言:
本節繼續來學習SQL中的資料查詢中的資料分組~
先建個表,錄幾條資料,順道複習下之前學的內容~
之前建立的T_Worker都用了幾天了,今天就來弄個新的表吧T_Product商品表:
建表SQL:
CREATE TABLE T_Product(PId INTEGER,PName VARCHAR(20),PKind VARCHAR(20),PCity VARCHAR(10),PPrice NUMERIC(10,2),FNum INTEGER,PRIMARY KEY(PId))
往裡面插入幾條記錄:
INSERT INTO T_Product (PId,PName,PKind,PCity,PPrice,FNum)VALUES(1,'德芙巧克力','糖果類','北京',33.80,100);INSERT INTO T_Product (PId,PName,PKind,PCity,PPrice,FNum)VALUES(2,'53度茅台飛天','酒水類','貴州',839.00,20);INSERT INTO T_Product (PId,PName,PKind,PCity,PPrice,FNum)VALUES(3,'伊利純牛奶*24','牛奶類','內蒙古',72.00,50);INSERT INTO T_Product (PId,PName,PKind,PCity,PPrice,FNum)VALUES(4,'潔柔抽紙','日用品類','廣州',17.90,100);INSERT INTO T_Product (PId,PName,PKind,PCity,PPrice,FNum)VALUES(5,'維達抽紙','日用品類','中山',13.90,100);INSERT INTO T_Product (PId,PName,PKind,PCity,PPrice,FNum)VALUES(6,'太陽捲紙','日用品類','中山',20.80,100);INSERT INTO T_Product (PId,PName,PKind,PCity,PPrice,FNum)VALUES(7,'費列羅巧克力','糖果類','意大利',89.00,100);INSERT INTO T_Product (PId,PName,PKind,PCity,PPrice,FNum)VALUES(8,'金龍魚玉米油1L','糧油副食類','廣州',59.90,100);
查詢下表中的所有記錄:
SELECT * FROM T_Product
最後結果:
恩,那麼素材就準備好了~
1.何為資料分組:
答:在前面我們已經學過COUNT這個彙總運算的函數了,要你查詢表中某個年齡段,比如公司
18歲的員工有多少,直接SELECT COUNT(*) FROM T_Worker WHERE FAge = 18;
但是假如你想看每個年齡段的人數,這樣的方法顯得效率很低,這個時候就是資料分組大顯神威
的時候了!
資料分組就是將表中的資料,按照個人需求,按表中的欄位來進行分組,然後再對這些分組進行彙總
運算,就是前面講的MIN,MAX,SUM,AVG,COUNT的計算~可以把這個分組看成一個臨時的結果集,
而在SQL中,我們可以使用GROUP BY子句來完成資料的分組!
當然,也不是說絕對要和彙總函式一起使用,不過分組的目的也是為了進行彙總運算,下面比較下,直接取資料與
資料分組
普通:
SELECT PCity FROM T_Product
按產地分組:
SELECT PCity FROM T_Product GROUP BY PCity
看一看運行後的結果:
或許看到這裡你有點眉目了,那麼,把這個SQL語句寫得複雜一點:
SELECT PCity,COUNT(PCity) AS '數量' FROM T_Product GROUP BY PCity
運行下:
相信看到這裡,你已經體會到了資料分組的便利了~
2.資料分組與彙總函式
①帶WHERE的分組
比如:我們要查詢表中"日用品"類所在城市的分組以及數目,只需要加上WHERE語句:
SELECT PCity,COUNT(PCity) AS '數量' FROM T_Product WHERE PKind = '日用品類' GROUP BY PCity
運行上述SQL:
如上述,很簡單,只需假如WHERE子句,但是有一點要注意的是:
GROUP BY子句需要放在SELECT語句後,還要放在WHERE語句後,不然可是會報錯的!
把上面的SQL語句將WHERE子句與GROUP BY子句交換,就會出現下述的錯誤!
②指定多個列
前面寫的都是按照一個列來分組,當然你可以i可以指定多個列,實現"組種組"的效果,
按順序,先按第一個分組列進行分組,接著到第二個...以此類推
比如以下的SQL
SELECT PCity,PKind,COUNT(*) AS '數目' FROM T_Product GROUP BY PCity,PKind
運行上述SQL:
假如調轉下PCity與PKind的位置
SELECT PCity,PKind,COUNT(*) AS '數目' FROM T_Product GROUP BY PKind,PCity
運行上述SQL:
另外,SELECT查詢的欄位,需要在彙總函式或者GROUP BY的子句中,比如上述SQL寫成這樣:
SELECT PCity,PKind,PPrice FROM T_Product GROUP BY PKind,PCity ORDER BY PPrice ASC
是會報下述錯誤的:
③執行個體:求出按產地分組,最大與最小值
SQL如下:
SELECT PCity,MAX(PPrice) AS '最大值',MIN(PPrice) AS '最小值'FROM T_Product GROUP BY PCity
運行SQL:
3.HAVING語句:
從上面兩點我們學會了將資料分組,接著下來再學習對分組進行過濾
使用到SQL中的HAVING語句!比如篩選記錄數大於1的分組
直接使用WHERE COUNT(*) > 1是錯誤的,因為彙總函式不能在WHERE語句中使用!
而要使用HAVING語句:
SELECT PCity FROM T_Product GROUP BY PCity HAVING COUNT(*) > 1
運行上述的SQL語句:
上述SQL的功能就是:先把表中資料按PCity來分組,然後篩選出記錄條數大於1的部分!
另外,使用HAVING語句,要注意的:
1.HAVING子句需要放在GROUP BY子句之後!
2.HAVING子句不能包含未分組的列名,就是沒寫在GROUP BY後面的~
如果你還是需要包含它的話,這個時候你可以用WHERE!
4.資料庫分頁
相信大家都聽過這個名詞吧,因為我們再查詢資料的時候,查詢的結果很多的時候,我們
通常會將查詢結果進行分頁,比如,每頁顯示10條記錄,使用者可以點擊"下一頁","上一頁"
等來查看不同的頁,實現原理就是限制查詢的結果集行數!鑒於不同DBMS實現資料分頁
的原理不同,這裡僅示範MYSQL限制結果集的示範,使用的是LIMIT關鍵字,而SQLITE也
支援這個關鍵字,所以,你懂的~,大體代碼如下:
//定義兩個變數:當前的頁碼與每頁顯示資料數目int goIndex = 0;int PageSize = 10;//定義一個顯示資料的方法private void ShowData(){//按自己的需求顯示資料}//計算表中總共有多少條資料private int GetCount(){ResultSet rs = ExecuteSQL("SELECT COUNT(*) AS ITEMCOUNT FROM T_Product");return rs.getInt("ITEMCOUNT");}//定義一個查詢當前頁中private void DoSearch(){//計算查詢頁的起始行數String beginIndex = (goIndex * PageSize).toString();String size = PageSize.toString();Result rs = ExecuteSQL("SELECT * FROM T_Product LIMIT" + startIndex + "," + size);ShowData();}//按鈕的事件處理class MyClick implements OnClickListener{private void OnClick(View v){switch(v.getId()){//點擊首頁case R.id.btnFirst:goIndex = 0;DoSearch();//點擊尾頁case R.id.btnLast:goIndex = GetCount()/PageSize;DoSearch();//下一頁case R.id.btnNext:goIndex = goIndex + 1;DoSearch();//上一頁case R.id.btnFirst:goIndex = goIndex - 1;DoSearch();}}}
分頁實現原理大體如上述代碼,看自己需求進行改進啦~
5.抑制資料重複
比如我們要檢索表中有哪些類別的商品,我們可以直接
SELECT PCity FROM T_Product
運行SQL:
這時候發現結果有重複的,這個時候就可以使用SQL提供的
DISTINCT即可,用法也很簡單,直接在SELECT後加上它就可以了!
SELECT DISTINCT PCity FROM T_Product
運行SQL語句:
另外要注意一點:
DISTINCT是針對整個結果集來進行資料重複抑制的,而不是針對每一個列!!!
比如:
SELECT DISTINCT PKind,PCity FROM T_Product
運行SQL: