MySQL命令學習筆記(三)

一、創建計算字段

1.1 計算字段

字段(field) 基本上與列( column) 的意思相同,經常互換使用,不過數據庫列一般稱爲列,而術語字段通常用在計算字段的連接上。

1.2 拼接字段

**拼接:**將值聯接到一起構成單個值。
在mysql的SELECT語句中,可使用Concat()函數來拼接兩個列。多數DBMS使用+或||來實現拼接,mysql則使用Concat()函數來實現。示例如下:

SELECT Concat(phone, '(', home, ')') FROM table1;

結果如下:
SELECT Concat
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;

結果如下:
upper
下表列出了某些常用的文本處理函數:

函數 說明
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 要檢索的行
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章