第八章 使用數據處理函數
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年添加的用戶的全部安全分數值
以上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子句用於標準的行級過濾。