3、函數 (SUM、MIN、MAX、COUNT、AVG)

第八章 使用數據處理函數
8.1 函數
SQL支持利用函數來處理數據。函數通常是在數據上執行的,給數據的轉換和處理提供了方便。
每個DBMS都有特定的函數。只有少數幾個函數被全部主要的DBMS等同的支持。
 
8.2 使用函數
大多數SQL實現支持如下類型的函數:
  用於處理文本串(如刪除或填充值,轉換值爲大寫或小寫)的文本函數
  用於在數值數據上進行算術操做(如返回絕對值,進行代數運算)的數值函數
  用於處理日期和時間值並從這些值中提取特定成分(如,返回兩個日期之差,檢查日期有效性等)的日期和時間函數
  返回DBMS正使用的特殊信息(如返回用戶登陸信息)的系統函數
 
  8.2.1 文本處理函數
  1.UPPER() 函數將文本轉換爲大寫
  SELECT member_name,UPPER(member_name) AS
  member_name_upcase
  FROM personal_appeal
  ORDER BY member_name;
 
列出兩列,第一列是表中存儲的值,第二列 member_name_upcase 轉換爲大寫
 
經常使用的文本函數:
 
SOUNDEX是一個將任何文本串轉換爲描述其語音表示的字母數字模式的算法。
SOUNDEX考慮了相似的發音字符和音節,使得能對串進行發音比較而不是字母比較,多數DBMS都提供了對SOUNDEX的支持。
 
使用SOUNDEX()函數進行搜索: 匹配全部發音相似於LV的聯繫名
SELECT member_name FROM personal_appeal WHERE SOUNDEX(member_name)= SOUNDEX('LV');
 
 
WHERE 子句使用 SOUNDEX()函數來轉換 member_name 列值和搜索串爲它們的 SOUNDEX 值。
 
8.2.2 日期和時間處理函數
日期和時間採用相應的數據類型存儲在表中,每種DBMS都有本身的變體。日期和時間值以特殊的格式存儲,以便能快速和有效地排序或過濾,而且節省物理存儲空間。
通常,應用程序不使用用來存儲日期和時間的格式,所以日期和時間函數老是被用來讀取、統計和處理這些值。
日期和時間函數在SQL中具備重要的做用。
SELECT member_name,time_add FROM personal_appeal WHERE YEAR(time_add) = 2017;
MYSQL 使用 YEAR 函數從日期中提取年份
 
DBMS提供的功能遠不止簡單的日期成分提取。大多數DBMS具備比較日期、執行基於日期的運算、選擇日期格式等的函數。
不一樣DBMS的日期-時間處理函數可能不一樣。詳見相應文檔
 
8.2.3 數值處理函數
數值處理函數僅處理數值數據。這些函數通常主要用於代數、三角或幾何運算,所以沒有串或日期-時間處理函數的使用那麼頻繁
經常使用的數值處理函數:
 
本章介紹如何使用SQL的數據處理函數。這些函數在格式化、處理和過濾數據中很是有用,但它們在各類SQL實現中很不一致。
 
第九章 彙總數據
  本章介紹什麼是SQL的彙集函數以及如何利用它們彙總表的數據。
9.1 彙集函數
常常須要彙總數據而不用實際檢索出來,SQL提供了專門的函數。使用這些函數,SQL查詢可用於檢索數據,以便分析和報表生成。
這種類型的檢索例子有:
  肯定表中行數(或者知足某個條件或包含某個特定值的行數)
  得到表中行組的和
  找出表列(或全部行或某些特定的行) 的最大、最小、平均值。
 
上述例子都須要對錶中數據彙總而不是檢索實際數據自己。所以,返回實際表數據是對時間和處理資源的一種浪費(更不用說帶寬)。
  爲方便這種類型的檢索,SQL給出了5個彙集函數。
  彙集函數:運行在行組上,計算和返回單個值的函數
 
 
9.1.1 AVG()函數
經過對錶中行數計數並計算特定列值之和,求得該列的平均值。
AVG()可用來返回全部列的平均值,也能夠用來返回特定列或行的平均值。
 
使用AVG()返回 member_jifen 表中全部用戶的平均總積分
 
 
AVG()函數只能用來肯定特定數值列的平均值,並且列名必須做爲函數參數給出。
NULL值:AVG()函數忽略列值爲NULL的行
 
9.1.2 COUNT()函數
COUNT()函數進行計數。可用COUNT()肯定表中行的數目或符合特定條件的行的數目。
COUNT()函數有兩種使用方式:
  使用COUNT(*)對錶中行的數目進行計數,無論表列中包含的是空值(NULL)仍是非空值。
  使用COUNT(column)對特定列中具備值的行進行計數,忽略NULL值。
 

利用 COUNT(*)對全部行計數,無論行中各列有什麼值。計數值在num_member中返回。
 
 
只對綁定了郵箱的客戶計數
NULL值:若是指定列名,指定列的值爲空的行被COUNT()函數忽略,但若是 COUNT()函數中用的是星號*,則不忽略
 
9.1.3 MAX()函數
  MAX()返回指定列中的最大值。MAX()要求指定列名。
返回member_id值最大的用戶名和member_id
NULL值:MAX()函數忽略列值爲NULL的行

 

9.1.4 MIN()函數
MIN()函數返回指定列的最小值。與MAX()同樣,MIN()要求指定列名
用法同 MAX()
 
9.1.5 SUM()函數
SUM()用來返回指定列值的和(總計)。

 

列出2017年添加的用戶的全部安全分數值
 
 
9.2 彙集不一樣值
以上5個彙集函數均可以以下使用:
  對全部的行執行計算,指定ALL參數或不給參數(由於ALL是默認行爲)
  只包含不一樣的值,指定DISTINCT參數
  ALL爲默認:ALL參數不須要指定,由於它是默認行爲。若是不指定DISTINCT,則假定爲ALL
9.3 組合彙集函數
SELECT語句能夠根據須要包含多個彙集函數
 
用單條SELECT語句執行了4個彙集計算,返回4個值。
 
取別名:在指定別名以包含某個彙集函數的結果時,不該該使用表中實際的列名。雖然這樣作並不是不合法,但許多SQL實現不支持,可能會產生模糊的錯誤消息。
 
彙集函數用來彙總數據。SQL支持5個彙集函數,能夠用多種方法使用它們以返回所需的結果。
這些函數是高效設計的,它們返回結果通常比你在本身的客戶機應用程序中計算要快得多。
 
第十章 分組數據
本章介紹如何分組數據,以便能彙總表內容的子集。
設計兩個新SELECT語句子句,分別是:GROUP BY 子句和 HAVING 子句
 
10.1 數據分組
分組容許把數據分爲多個邏輯組,以便能對每一個組進行彙集計算
 
建立分組
分組是在SELECT語句的GROUP BY 子句中創建的。
 
上面的SELECT子句指定了兩個列,num_item爲計算字段,表示當前積分數的總個數,
GROUP BY子句指示DBMS按tota_jf 排序並分組數據
GROUP BY子句指示DBMS分組數據,而後對每一個組而不是整個結果集進行彙集
使用GROUP BY子句前,須要知道一些重要規定:
  1.GROUP BY子句能夠包含任意數目的列。這使得能對分組進行嵌套,爲數據分組提供更細緻的控制。
  2.若是在GROUP BY子句中嵌套了分組,數據將在最後規定的分組上進行彙總
  3.GROUP BY子句中列出的每一個列都必須是檢索列或有效地表達式(但不能是彙集函數)。
  在SELECT中使用表達式,必須在GROUP BY 子句中指定相同的表達式,不能使用別名。
  4.大多數SQL實現不容許GROUP BY列帶有長度可變的數據類型(如文本或備註型字段)
  若是分組列中具備NULL值,則NULL將做爲一個分組返回。若是列中有多行NULL值,它們將分爲一組。
  5.GROUP BY子句必須出如今WHERE子句以後,ORDER BY子句以前。
 
 
10.2 過濾分組
除了能用GROUP BY分組數據外,SQL還容許過濾分組,規定包括哪些分組,排除哪些分組。
列出至少有兩個相同總積分的會員,爲得出這種數據,必須基於完整的分組而不是個別的行進行過濾。
WHERE過濾指定的是列而不是分組。WHERE沒有分組的概念
HAVING相似於WHERE,目前爲止學過的全部類型的WHERE子句均可以用HAVING來替代。惟一的差異是WHERE過濾行,HAVING過濾分組。
HAVING支持全部的WHERE操做符
 
 
HAVING和WHERE的差異:
WHERE在數據分組前進行過濾,HAVING在數據分組後進行過濾。
WHERE排除的行不包括在分組中。這可能會改變計算值,從而影響HAVING子句中基於這些值過濾掉的分組。
 
應該僅在與GROUP BY子句結合時才使用HAVING,而WHERE子句用於標準的行級過濾。
 
10.3 分組和排序
 

相關文章
相關標籤/搜索