每天一點資料庫之-----Day 6 資料分組與資料分頁,-----day分頁

來源:互聯網
上載者:User

每天一點資料庫之-----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:








聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.