關於MYSQL的函數
函數沒有通用的SQL語句的可移植性強 能運行在多個系統上的代碼稱爲可移植的( portable)。相對來說,多數SQL語句是可移植的,在SQL實現之間有差異時,這些差異通常不那麼難處理。而函數的可移植性卻不強。幾乎每種主要的DBMS的實現都支持其他實現不支持的函數,而且有時差異還很大。
(也就是說在mysql中可以使用的函數,在其他比如oracle中有可能就不支持使用,函數是沒有普通SQL語句的可移植性強.)
函數使用注意事項:
- 1.關於函數的關鍵字使用,MySQL是不區分大小寫的.
- 2.低版本的MYSQL可能不支持高版本中部分聚集函數,具體的聚集函數的使用應根據MySQL的版本選擇支持的聚集函數使用.
常見函數分類:
- 1.用於處理文本串(如刪除或填充值,轉換值爲大寫或小寫)的文本函數.
- 2.用於在數值數據上進行算術操作(如返回絕對值,進行代數運算)的數值函數。
- 3.用於處理日期和時間值並從這些值中提取特定成分(例如,返回兩個日期之差,檢查日期有效性等)的日期和時間函數。
- 4.返回DBMS正使用的特殊信息(如返回用戶登錄信息,檢查版本細節)的系統函數。
1.關於文本處理函數
常用的文本處理函數
函數 | 說明 |
---|---|
Left() | 返回串左邊的字符 |
Length() | 返回串的長度 |
Locate() | 找出串的一個子串 |
Lower() | 將串轉換爲小寫 |
LTrim() | 去掉串左邊的空格 |
Right() | 返回串右邊的字符 |
RTrim() | 去掉串右邊的空格 |
Soundex() | 返回串的SOUNDEX值 |
SubString() | 返回子串的字符 |
Upper() | 將串轉換爲大寫 |
①使用UPPER函數的例子(其他文本函數使用方法類似):
這裏需要特別注意的是MYSQL中別名字段不能有-
,應該使用下劃線.
SELECT vend_name,UPPER(vend_name) vend_name_upcase FROM vendors ORDER BY vend_name ASC;
+----------------+------------------+
| vend_name | vend_name_upcase |
+----------------+------------------+
| ACME | ACME |
| Anvils R Us | ANVILS R US |
| Furball Inc. | FURBALL INC. |
| Jet Set | JET SET |
| Jouets Et Ours | JOUETS ET OURS |
| LT Supplies | LT SUPPLIES |
+----------------+------------------+12345678910
②特別的函數Soundex:
SOUNDEX函數一個將任何文本串轉換爲描述其語音表示的字母數字模式的算法。 SOUNDEX考慮了類似的發音字符和音節,使得能對串進行發音比較而不是字母比較。(也就是說Soundex()函數進行搜索,它匹配所有類似的發音文本.)
普通的全文本匹配:
SELECT customers.cust_name,customers.cust_contact FROM customers WHERE cust_contact = 'Y.Lie';
執行沒有數據返回.
使用Sounddex函數:
SELECT customers.cust_name,customers.cust_contact FROM customers WHERE SOUNDEX(cust_contact) = SOUNDEX('Y.Lie');
執行結果如下:
+-------------+--------------+
| cust_name | cust_contact |
+-------------+--------------+
| Coyote Inc. | Y Lee |
+-------------+--------------+
123456
2.日期和時間處理函數
常用日期和時間處理函數
函數 | 說明 |
---|---|
AddDate() | 增加一個日期(天、周等) |
AddTime() | 增加一個時間(時、分等) |
CurDate() | 返回當前日期 |
CurTime() | 返回當前時間 |
Date() | 返回日期時間的日期部分 |
DateDiff() | 計算兩個日期之差 |
Date_Add() | 高度靈活的日期運算函數 |
Date_Format() | 返回一個格式化的日期或時間串 |
Day() | 返回一個日期的天數部分 |
DayOfWeek() | 對於一個日期,返回對應的星期幾 |
Hour() | 返回一個時間的小時部分 |
Minute() | 返回一個時間的分鐘部分 |
Month() | 返回一個日期的月份部分 |
Now() | 返回當前日期和時間 |
Second() | 返回一個時間的秒部分 |
Time() | 返回一個日期時間的時間部分 |
Year() | 返回一個日期的年份部分 |
MySQL中關於日期函數的使用:
首先需要注意的是MySQL使用的日期格式。無論你什麼時候指定一個日期,不管是插入或更新表值還是用WHERE子句進行過濾,日期必須包含格式yyyy-mm-dd.
說明:比如:2005年9月1日,給出爲2005-09-01。雖然其他的日期格式可能也行,但這是首選的日期格式,因爲它排除了多義性(如,04/05/06是2006年5月4日或2006年4月5日或2004年5月6日或……
對比不使用時間函數和使用使用MySQL的時間函數效果:
orders表結構:
+------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+----------+------+-----+---------+----------------+
| order_num | int(11) | NO | PRI | NULL | auto_increment |
| order_date | datetime | NO | | NULL | |
| cust_id | int(11) | NO | MUL | NULL | |
+------------+----------+------+-----+---------+----------------+
orders表中所有數據:
+-----------+---------------------+---------+
| order_num | order_date | cust_id |
+-----------+---------------------+---------+
| 20005 | 2005-09-01 00:00:00 | 10001 |
| 20006 | 2005-09-12 00:00:00 | 10003 |
| 20007 | 2005-09-30 00:00:00 | 10004 |
| 20008 | 2005-10-03 00:00:00 | 10005 |
| 20009 | 2005-10-08 00:00:00 | 10001 |
+-----------+---------------------+---------+12345678910111213141516171819
不使用時間函數使用基本語法:(兩條語句等價)
SELECT * FROM orders WHERE order_date ='2005-09-01';
SELECT * FROM orders WHERE order_date ='2005-09-01 00:00:00';
這樣也就有一個問題,當數據庫中的數據不恰好是0點0分0秒時,上面的SQL語句就匹配不到結果.比如修改一下第一條記錄爲一下上午10點時,上面的SQL語句就不能匹配到結果了.
+-----------+---------------------+---------+
| order_num | order_date | cust_id |
+-----------+---------------------+---------+
| 20005 | 2005-09-01 10:00:00 | 10001 |
+-----------+---------------------+---------+12345
爲了解決上面說的這個問題,MySQL提供了Date函數來解決這個問題.Date(order_date)指示MySQL僅提取列的日期部分,更可靠的SELECT語句爲:
SELECT * FROM orders WHERE DATE(order_date) ='2005-09-01';
同樣道理對應的函數Time() 只返回一個日期時間的時間部分.其他時間函數用法類似.
關於對日期的其他操作一樣了,比如:查詢2005年9月份的訂單記錄(不用單行月份的天數,需要注意的是函數不能加引號)
SELECT * FROM orders WHERE YEAR(order_date) = 2005 AND MONTH(order_date) = 9;
3.數值處理函數
數值函數是最一致最統一的函數,也就是說不同個數據庫廠商對着類函數的兼容性最好,這類函數通用性最強.
常用數值處理函數
函數 | 說明 |
---|---|
Abs() | 返回一個數的絕對值 |
Cos() | 返回一個角度的餘弦 |
Exp() | 返回一個數的指數值 |
Mod() | 返回除操作的餘數 |
Pi() | 返回圓周率 |
Rand() | 返回一個隨機數 |
Sin() | 返回一個角度的正弦 |
Sqrt() | 返回一個數的平方根 |
Tan() | 返回一個角度的正切 |
4.系統函數
省略.
聚集函數
聚集函數( aggregate function): 運行在行組上,計算和返回單個值的函數.(與普通的函數最主要的區別聚集函數值返回一條結果,這當然是使用分組語句的情況下)
當我們只需要彙總數據而不用把它們實際數據檢索出來時,可以使用聚集函數.在只需要返回彙總數據時,返回實際表數據是對時間和處理資源的一種浪費,比如帶寬.
(通常都是對數值進行聚集返回一條數據.但是min和max函數除了可以對數值型數據進行計算還支持時間類型和文本類型的計算,具體見相關函數的詳情用法.)
SQL聚集函數
函數 | 說明 |
---|---|
AVG() | 返回某列的平均值 |
COUNT() | 返回某列的行數 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SUM() | 返回某列值之和 |
聚集函數注意事項:
- 1.所有的聚集函數在對指定的列進行計算時,會忽略列值爲NULL的行.
- 2.特別的COUNT函數在對所有的列進行計算時允許使用
*
, 對行進行計數時,不會忽略一行數據中每個列爲null值的行.(聚集函數除了COUNT函數有COUNT(*)
用法,其他的聚集函數沒有此用法.) - 3.所有聚集函數都可以在多個列上進行計算,利用標準的算術操作符,所有聚集函數都可用來執行多個列上的計算。
(eg: SELECT SUM(item_price*quantity) AS total_price FROM orderitems WHERE order_num = 20005;)
聚集函數優缺點:
- 1.聚集函數用來彙總數據。 MySQL支持一系列聚集函數,可以用多種方法使用它們以返回所需的結果。這些函數是高效設計的,它們返回結果一般比你在自己的客戶機應用程序中計算要快得多.
- 2.聚集函數的可移植性不強,取決於不同的數據庫廠商和不同的版本.
①AVG()函數用法:
只用於單個列 AVG()只能用來確定特定數值列的平均值,而且列名必須作爲函數參數給出。爲了獲得多個列的平均值,必須使用多個AVG()函數。
關於空值: NULL值 AVG()函數忽略列值爲NULL的行。
EG:SELECT AVG(prod_price) AS avg_price FROM products;
②COUNT()函數用法:
進行計數。可利用COUNT()確定表中行的數目或符合特定條件的行的數目。
COUNT()函數有兩種使用方式:
①使用COUNT(*)
對錶中行的數目進行計數, 不管表列中包含的是空值( NULL)還是非空值。 (對行進行計數時,不會忽略一行數據中每個列爲null值的行)
②使用COUNT(column)對特定列中具有值的行進行計數,忽略NULL值。
關於空值: column如果指定列名,則指定列的值爲空的行被COUNT()
函數忽略,但如果COUNT()
函數中用的是星號(*)
,則不忽略。
EG:
SELECT COUNT(*) AS num_cust FROM products;
SELECT COUNT(cust_email) AS num_cust FROM customers;
③MAX()函數用法:
MAX()返回指定列中的最大值.對非數值數據使用MAX() 雖然MAX()一般用來找出最大的數值或日期值,但MySQL允許將它用來返回任意列中的最大值,包括返回文本列中的最大值。在用於文本數據時,如果數據按相應的列排序,則MAX()返回最後一行。
關於空值: NULL值 MAX()函數忽略列值爲NULL的行。
EG: SELECT MAX(prod_price) AS max_price FROM products;
④MIN()函數用法:
MIN()的功能正好與MAX()功能相反,它返回指定列的最小值。與MAX()一樣, MIN()要求指定列名.對非數值數據使用MIN() MIN()函數與MAX()函數類似,MySQL允許將它用來返回任意列中的最小值,包括返回文本列中的最小值。在用於文本數據時,如果數據按相應的列排序,則MIN()返回最前面的行。
關於空值: MIN()函數忽略列值爲NULL的行
EG:SELECT MIN(prod_price) AS min_price FROM products;
⑤SUM()函數用法:
SUM()用來返回指定列值的和(總計)。
關於空值: NULL值 SUM()函數忽略列值爲NULL的行。
EG:
SELECT SUM(quantity) AS items_ordered FROM orderitems WHERE order_num = 20005;
SELECT SUM(item_price*quantity) AS total_price FROM orderitems WHERE order_num = 20005;
聚集不同-用法:
以上5個聚集函數都可以如下使用:(在MYSQL5版本中有小在5以下無效)
①對所有的行執行計算,指定ALL參數或不給參數(因爲ALL是默認行爲);
②只包含不同的值,指定DISTINCT參數。
EG:
SELECT AVG(DISTINCT prod_price) AS avg_price FROM products WHERE vend_id = 1003;
解釋: 計算平均值時,去除價格相同的記錄(也就是prod_price列值相同的值)後再計算平均值.
組合聚集-用法
EG:
SELECT COUNT(*) AS num_items, MIN(prod_price) AS price_min, MAX(prod_price) AS price_max, AVG(prod_price) AS price_avg FROM products;
注意: 聚集函數一般是使用在數值類型列上(類型爲int,double…),也就是說這些記錄中如果沒有設置值,不會存在爲null情況,mysql系統會默認值爲0.