SQL --Chater03 聚合與排序

来源:http://www.cnblogs.com/lyy-totoro/archive/2016/07/11/5661892.html
-Advertisement-
Play Games

數據說明: 對錶進行聚合查詢 聚合函數: COUNT:計算表中的記錄數(行數)。 SUM:計算表中數值列的數據合計值。 AVG:計算表中數值列的數據平均值。 MAX:求出表中任意列中數據的最大值。 MIN:求出表中任意列中數據的最小值。 COUNT函數的結果根據參數的不同而不同。COUNT(*)會得 ...


數據說明:

+-----------+------------+---------------+--------------+--------------+------------+
| shohin_id | shohin_mei | shohin_bunrui | hanbai_tanka | shiire_tanka | torokubi   |
+-----------+------------+---------------+--------------+--------------+------------+
| 0001      | T恤        | 衣服          |         1000 |          500 | 2009-09-20 |
| 0002      | 打孔器      | 辦公用品      |          500 |          320 | 2009-09-11 |
| 0003      | 運動T恤     | 衣服          |         4000 |         2800 | NULL       |
| 0004      | 菜刀        | 廚房用具      |         3000 |         2800 | 2009-09-20 |
| 0005      | 高壓鍋      | 廚房用具      |         6800 |         5000 | 2009-01-15 |
| 0006      | 叉子        | 廚房用具      |          500 |         NULL | 2009-09-20 |
| 0007      | 擦菜板      | 廚房用具      |          880 |          790 | 2008-04-28 |
| 0008      | 圓珠筆      | 辦公用品      |          100 |         NULL | 2009-11-11 |
+-----------+------------+---------------+--------------+--------------+------------+
8 rows in set (0.00 sec)

對錶進行聚合查詢

聚合函數:

COUNT:計算表中的記錄數(行數)。

SUM:計算表中數值列的數據合計值。

AVG:計算表中數值列的數據平均值。

MAX:求出表中任意列中數據的最大值。

MIN:求出表中任意列中數據的最小值。

 

COUNT函數的結果根據參數的不同而不同。COUNT(*)會得到包含NULL的數據行數,而COUNT(<列名>)會得到NULL之外的數據行數。

聚合函數會將NULL排除在外。但COUNT(*)例外,並不會排除NULL。

MAX/MIN函數幾乎適用所有數據類型的列。SUM/AVG函數只適用數字類型的列。

想要計算值得種類時,可以在COUNT函數的參數中使用DISTINCT。

在聚合函數的參數中使用DISTINCT,可以刪除重覆數據。

 

對錶進行分組

SELECT shohin_bunrui, COUNT(*)
  FROM Shohin
 GROUP BY shohin_bunrui;


+---------------+----------+
| shohin_bunrui | COUNT(*) |
+---------------+----------+
| 辦公用品      |        2 |
| 廚房用具      |        4 |
| 衣服          |        2 |
+---------------+----------+

GOOUP BY 就像切分表的一把刀。

子句的書寫順序:

SELECTàFROMàWHEREàGROUP BY

SQL子句的順序不能改變,也不能互相替換。

 

SELECT shiire_tanka, COUNT(*)
  FROM Shohin
 GROUP BY shiire_tanka;

+--------------+----------+
| shiire_tanka | COUNT(*) |
+--------------+----------+
|         NULL |        2 |
|          320 |        1 |
|          500 |        1 |
|          790 |        1 |
|         2800 |        2 |
|         5000 |        1 |
+--------------+----------+

 

聚合鍵中包含NULL時,在結果中會以“不確定”行(空行)的形式表現出來。

 

GROUP BY 和WHERE並用時, SELECT語句的執行順序如下:

FROM---WHERE---GROUP BY---SELECT

 

使用聚合函數時,SELECT字句中只能存在以下三種元素:

  • 常數
  • 聚合函數
  • GROUP BY字句中指定的列明(也就是聚合鍵)

 

GROUP BY子句中不能夠使用SELECT子句中定義的別名。

因為SELECT子句在GROUP BY子句之後執行。

 

GROUP BY子句結果的顯示是無序的。

只有SELECT和HAVING子句(以及ORDER BY字句)中能夠使用聚合函數。

 

 

為聚合函數結果指定條件

HAVING子句:

SELECT <列名1>, <列名2>, <列名3>, …

FROM <表名>

GROUP BY <列名1>, <列名2>, <列名3>, …

HAVING <分組結果對應的條件>

 

使用HAVING子句時SELECT語句的順序:

SELECT---FROM---WHERE---GROUP BY---HAVING

 

HAVING子句要寫在GROUP BY子句之後,在DBMS內部的執行順序也排在GROUP BY子句之後。

SELECT shohin_bunrui, COUNT(*)
  FROM Shohin
 GROUP BY shohin_bunrui
HAVING COUNT(*) = 2;

in_bunrui | COUNT(*) |
+---------------+----------+
| 辦公用品      |        2 |
| 衣服          |        2 |
+---------------+----------+

SELECT shohin_bunrui, AVG(hanbai_tanka)
  FROM Shohin
 GROUP BY shohin_bunrui
HAVING AVG(hanbai_tanka) >= 2500;

ohin_bunrui | AVG(hanbai_tanka) |
+---------------+-------------------+
| 廚房用具      |         2795.0000 |
| 衣服          |         2500.0000 |
+---------------+-------------------+

 

HAVING字句中能夠使用的3種要素如下:

  • 常數
  • 聚合函數
  • GROUP BY子句中指定的列名(即聚合鍵)

WHERE子句 = 指定行所對應的條件

HAVING子句 = 指定組所對應的條件

對查詢結構進行排序

ORDER BY子句:

SELECT <列名1>, <列名2>, <列名3>, …

FROM <表名>

ORDER BY <排序基準列1>, <排序基準列1>,…

 

不論何種情況,ORDER BY子句都需要寫在SELECT語句的末尾。這是因為對數據進行排序的操作必須在結果即將返回時執行。

子句的書寫順序:

SELECT---FROM---WHERE---GROUP BY ---HAVING---ORDER BY

 

未指定ORDER BY子句中排序時會預設使用升序進行排序。ASC升序,DESC降序。

 

排序鍵中包含NULL時,會在開頭或末尾進行彙總。(MySQL中,升序會在開頭彙總,降序會在末尾彙總)

 

使用HAVING子句時SELECT語句的執行順序:

FROM---WHERE---GROUP BY---HAVING---SELECT---ORDER BY

SELECT子句的執行順序在GROUP BY子句之後,ORDER BY子句之前。因此在執行GROUP BY子句時,SELECT語句中定義的別名無法別識別。對於SELECT子句之後執行GROUP BY子句來說,就沒有這樣的問題了。

 

 

在ORDER BY子句中可以使用SELECT子句中為使用的列和聚合函數.

 

SELECT shohin_mei, hanbai_tanka, shiire_tanka
  FROM Shohin
ORDER BY shohin_id;

+------------+--------------+--------------+
| shohin_mei | hanbai_tanka | shiire_tanka |
+------------+--------------+--------------+
| T恤        |         1000 |          500 |
| 打孔器     |          500 |          320 |
| 運動T恤    |         4000 |         2800 |
| 菜刀       |         3000 |         2800 |
| 高壓鍋     |         6800 |         5000 |
| 叉子       |          500 |         NULL |
| 擦菜板     |          880 |          790 |
| 圓珠筆     |          100 |         NULL |
+------------+--------------+--------------+


SELECT shohin_bunrui, COUNT(*)
  FROM Shohin
 GROUP BY shohin_bunrui
ORDER BY COUNT(*);

+---------------+----------+
| shohin_bunrui | COUNT(*) |
+---------------+----------+
| 辦公用品      |        2 |
| 衣服          |        2 |
| 廚房用具      |        4 |
+---------------+----------+

  

 

 

 

 

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 生成1到300個數字的方法 方法一 cross join 方法二 while迴圈 方法三 CTE遞歸 ...
  • PLAN_TABLE PLAN_TABLE is automatically created as a global temporary table to hold(保存) the output of an EXPLAIN PLAN statement for all users.PLAN_TABL ...
  • 數據的插入(INSERT語句的使用方法) 原則上,執行一次INSERT語句會插入一行數據。 對錶進行全列INSERT時,可以省略表名後的列清單。 省略INSERT語句中的列名,就會自動設定為該列的預設值(沒有預設值時會設定為NULL)。 從其他表中複製數據:INSERT …SELECT。 INSER ...
  • 1,很奇怪,控制面板找不到SQL的卸載程式,後來在網上查知需要修複windows卸載/安裝程式,官網下載網址: 1.1 下載雙擊打開後,直接選next 1.2 根據你的情況選擇,我這裡選擇“卸載” 1.3 這裡可以看到你電腦中所有安裝程式,選中你所需要修複的卸載程式,點擊next(我這圖是卸載完再截 ...
  • 第一招、mysql服務的啟動和停止 net stop mysql net start mysql 第二招、登陸mysql 語法如下: mysql -u用戶名 -p用戶密碼 鍵入命令mysql -uroot -p, 回車後提示你輸入密碼,輸入12345,然後回車即可進入到mysql中了,mysql的提 ...
  • 為什麼我也要說SQL Server的並行: 這幾天園子里寫關於SQL Server並行的文章很多,不管怎麼樣,都讓人對並行操作有了更深刻的認識。 我想說的是:儘管並行操作可能(並不是一定)存在這樣或者那樣的問題,但是我們不能否認並行,仍然要利用好並行。 但是,實際開發中,某些SQL語句的寫法會導致用 ...
  • extent--最小空間分配單位 --tablespace managementblock --最小i/o單位 --segment managementcreate tablespace jamesdatafile '/export/home/oracle/oradata/james.dbf'siz ...
  • 註: sql server 2005 及以上支持. 版本估計是不支持(工作環境2005,2008). 工作需要, 需要向SQL Server 現有表中添加新列並添加描述. 從而有個如下存儲過程. (先附上存儲過程然後解釋) 代碼 /********調用方法********** 作用: 添加列並添加列 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...