一、創建計算字段
1.1 計算字段
字段(field) 基本上與列( column) 的意思相同,經常互換使用,不過數據庫列一般稱爲列,而術語字段通常用在計算字段的連接上。
1.2 拼接字段
**拼接:**將值聯接到一起構成單個值。
在mysql的SELECT語句中,可使用Concat()函數來拼接兩個列。多數DBMS使用+或||來實現拼接,mysql則使用Concat()函數來實現。示例如下:
SELECT Concat(phone, '(', home, ')') FROM table1;
結果如下:
Concat()拼接串,即把多個串連接起來形成一個較長的串。
Concat()需要一個或多個指定的串,各個串之間用逗號分隔。上面的SELECT語句連接以下4個元素:
- 存儲在phone列中的字符串;
- 包含一個空格和一個左圓括號的串;
- 存儲在home列中的字符;
- 包含一個右圓括號的串。
若需要刪除數據右側多餘的空格來整理數據,可以使用MySQL的RTrim()函數來完成,如下所示:
SELECT Concat(RTrim(phone), '(', RTrim(home), ')') FROM table1;
RTrim()函數去掉值右邊的所有空格。通過使用RTrim(),各個列都進行了整理。
Trim函數 MySQL除了支持RTrim()(正如剛纔所見,它去掉串右邊的空格),還支持LTrim()(去掉串左邊的空格)以及Trim()(去掉串左右兩邊的空格)。
1.3 執行算術計算
計算字段的另一常見用途是對檢索出的數據進行算術計算,例如計算總的銷售額:
SELECT name,id, quantity*pric AS total_price FROM table1;
mysql算術操作符:
操作符 | 說明 |
---|---|
+ |
加 |
- |
減 |
* |
乘 |
/ |
除 |
二、使用數據處理函數
2.1 使用函數
大多數SQL實現支持以下類型的函數:
- 用於處理文本串(如刪除或填充值,轉換值爲大寫或小寫)的文本函數。
- 用於在數值數據上進行算術操作(如返回絕對值,進行代數運算)的數值函數。
- 用於處理日期和時間值並從這些值中提取特定成分(例如,返回兩個日期之差,檢查日期有效性等)的日期和時間函數。
- 返回DBMS正使用的特殊信息(如返回用戶登錄信息,檢查版本細節)的系統函數。
2.2 文本處理函數
使用Upper()函數,Upper()的作用是將文本轉換爲大寫。
SELECT name,id,home, Upper(home) FROM table1;
結果如下:
下表列出了某些常用的文本處理函數:
函數 | 說明 |
---|---|
Left() |
返回串左邊的字符 |
Length() |
返回串的長度 |
Locate() |
找出串的一個子串 |
Lower() |
將串轉換爲小寫 |
LTrim() |
去掉左邊的空格 |
RTrim() |
去掉串右邊的空格 |
Right() |
返回串右邊的字符 |
Soundex() |
返回串的SOUNDEX值 |
SubString() |
返回子串的字符 |
Upper() |
將串轉換爲大寫 |
其中:SOUNDEX是一個將任何文本串轉換爲描述其語音表示的字母數字模式的算法。
2.3 時間和日期處理函數
下表列出了某些常用的時間和日期處理函數:
函數 | 說明 |
---|---|
AddDate() |
增加一個日期(天、周等) |
AddTime() |
增加一個時間(時、分等) |
CurDate() |
返回當前日期 |
CurTime() |
返回當前時間 |
Date() |
返回日期時間的日期部分 |
DateDiff() |
計算兩個日期之差 |
Date_Add() |
高度靈活的日期運算函數 |
Date_Format() |
返回一個格式化的日期或時間串 |
Day() |
返回一個日期的天數部分 |
DayofWeek() |
對於一個日期,返回對應的星期幾 |
Hour() |
返回一個時間的小時部分 |
Minute() |
返回一個時間的分鐘部分 |
Month() |
返回一個日期的月份部分 |
Now() |
返回當前日期和時間 |
Second() |
返回一個時間的秒部分 |
Time() |
返回一個日期時間的時間部分 |
Year() |
返回一個日期的年份部分 |
首先需要注意的是mysql使用的日期格式。無論你什麼時候指定一個日期,不管是插入或更新表值還是用WHERE子句進行過濾,日期必須爲 格式yyyy-mm-dd。例如,2019年5月30日,給出爲2019-05-30
示例如下:
SELECT name,id,home FROM table1 WHERE Date(order_date) BETWEEN '2019-05-10' AND '2019-05-25';
2.4 數值處理函數
下表列出了某些常用的數值處理函數:
函數 | 說明 |
---|---|
Abs() |
返回一個數的絕對值 |
Cos() |
返回一個角度的餘弦 |
Exp() |
返回一個數的指數值 |
Mod() |
返回除操作的餘數 |
Pi() |
返回圓周率 |
Rand() |
返回一個隨機數 |
Sin() |
返回一個角度的正弦 |
Sqrt() |
返回一個數的平方根 |
Tan() |
返回一個角度的正切 |
三、彙總數據
3.1 聚集函數
mysql提供了專門的檢索函數,使用這些函數,可用於分析和報表生成。這種類型的檢索例子有以下幾種:
- 確定表中行數(或者滿足某個條件或包含某個特定值的行數)。
- 獲得表中行組的和。
- 找出表列(或所有行或某些特定的行)的最大值、最小值和平均值。
SQL聚集函數
函數 | 說明 |
---|---|
Abs() |
返回某列的平均值 |
Cos() |
返回某列的行數 |
Exp() |
返回某列的最大值 |
Mod() |
返回某列的最小值 |
Pi() |
返回某列之和 |
以下說明各函數的使用
3.1.1 AVG()函數
AVG()通過對錶中行數計數並計算特定列值之和,求得該列的平均值。 AVG()可用來返回所有列的平均值,也可以用來返回特定列或行的平均值,示例如下:
SELECT AVG(price) FROM table1;
只用於單個列 AVG()只能用來確定特定數值列的平均值,而且列名必須作爲函數參數給出。爲了獲得多個列的平均值,必須使用多個AVG()函數。
3.1.2 COUNT()函數
COUNT()函數進行計數。可利用COUNT()確定表中行的數目或符合特定條件的行的數目。使用示例如下:
COUNT()函數有兩種使用方式:
- 使用COUNT(
*
)對錶中行的數目進行計數, 不管表列中包含的是空值(NULL)還是非空值。 - 使用COUNT(column)對特定列中具有值的行進行計數,忽略NULL值。
SELECT COUNT(*) FROM table1;
3.1.3 MAX()函數
MAX()返回指定列中的最大值, MAX()要求指定列名,如下所示:
SELECT COUNT(price) FROM table1;
3.1.4 MIN()函數
MIN()返回指定列中的最小值,MIN()要求指定列名,如下所示:
SELECT COUNT(price) FROM table1;
3.1.5 MIN()函數
SUM()用來返回指定列值的和(總計),MIN()要求指定列名,如下所示:
SELECT COUNT(price) FROM table1;
3.2 聚集不同值
以上5個聚集函數都可以如下使用:
- 對所有的行執行計算,指定ALL參數或不給參數(因爲ALL是默認
行爲); - 只包含不同的值,指定DISTINCT參數
ALL爲默認 ALL參數不需要指定,因爲它是默認行爲。如果不指定DISTINCT,則假定爲ALL。
SELECT AVG(DISTINCT price) AS avg_price FROM table1;
注意 如果指定列名,則DISTINCT只能用於COUNT()。DISTINCT不能用於COUNT(*
),因此不允許使用COUNT( DISTINCT),否則會產生錯誤。類似地, DISTINCT必須使用列名,不能用於計算或表達式。
將DISTINCT用於MIN()和MAX() 雖然DISTINCT從技術上可用於MIN()和MAX(),但這樣做實際上沒有價值。一個列中的最小值和最大值不管是否包含不同值都是相同的。
四、分組數據
4.1 創建分組
分組是在SELECT語句的GROUP BY子句中建立的。GROUP BY子句指示MySQL分組數據,然後對每個組而不是
整個結果集進行聚集。
在使用GROUP BY子句前,需要知道一些重要的規定:
GROUP BY子句可以包含任意數目的列。這使得能對分組進行嵌套,
爲數據分組提供更細緻的控制。
如果在GROUP BY子句中嵌套了分組,數據將在最後規定的分組上
進行彙總。換句話說,在建立分組時,指定的所有列都一起計算
(所以不能從個別的列取回數據)。
GROUP BY子句中列出的每個列都必須是檢索列或有效的表達式
(但不能是聚集函數)。如果在SELECT中使用表達式,則必須在
GROUP BY子句中指定相同的表達式。不能使用別名。
除聚集計算語句外, SELECT語句中的每個列都必須在GROUP BY子
句中給出。
如果分組列中具有NULL值,則NULL將作爲一個分組返回。如果列
中有多行NULL值,它們將分爲一組。
GROUP BY子句必須出現在WHERE子句之後, ORDER BY子句之前。
4.2 過濾分組
MySQL爲此目的提供了另外的子
句,那就是HAVING子句。 HAVING非常類似於WHERE。事實上,目前爲止所有類型的WHERE子句都可以用HAVING來替代。唯一的差別是WHERE過濾行,而HAVING過濾分組。
HAVING和WHERE的差別:這裏有另一種理解方法,WHERE在數據分組前進行過濾, HAVING在數據分組後進行過濾。這是一個重要的區別, WHERE排除的行不包括在分組中。這可能會改變計算值,從而影響HAVING子句中基於這些值過濾掉的分組。
4.3 SELECT子句順序
SELECT子句及其順序
子句 | 說明 | 是否必須使用 |
---|---|---|
SELECT | 要返回的列或表達式 | 是 |
FROM | 從行中檢索數據的表 | 僅在從表選擇數據時使用 |
WHERE | 行級過濾 | 是 |
GROUP BY | 分組說明 | 僅在按組計算聚集時使用 |
HAVING | 組級過濾 | 否 |
ORDER BY | 輸出的排序順序 | 否 |
LIMIT | 要檢索的行 | 否 |