1. 程式人生 > 實用技巧 >MySQL基礎之MySQL必知必會(十一)使用資料處理函式

MySQL基礎之MySQL必知必會(十一)使用資料處理函式

函式

SQL支援利用函式來處理資料。函式一般是在資料上執行的。它給資料的轉換和處理提供了方便

函式沒有SQL的可移植性強

能執行在多個系統上的程式碼稱為可移植的, 相對來說, 多數SQL語句是可移植的, 在SQL實現之間有差異時, 這些差異通常不難處理。

而函式的可移植性卻不強, 幾乎每種DBMS的實現都支援其他實現不支援的函式。而且有時差異還很大。

為了程式碼的可移植性, 不贊成使用特殊實現的功能。

使用函式

大多少SQL實現支援以下型別的函式

  • 用於處理文字(如刪除或填充, 轉換值的大小寫)的文字函式
  • 用於在數值資料上進行算術運算(如返回絕對值、進行代數運算)的數值函式
  • 用於處理日期和時間值並從這些值中提取特定成分(例如, 返回兩個日期之差, 檢查日期有效性等)的日期和時間函式
  • 返回DBMS正使用的特殊資訊(如返回使用者登入資訊、檢查版本細節)的系統函式

文字處理函式

使用RTrim()函式來去除列值右邊的空格, 這是已經介紹過的文字函式。

下面是另一個例子, 使用Upper()函式。

MariaDB [crashcourse]> SELECT vend_name, Upper(vend_name) AS vend_name_upcase FROM vendors ORDER BY vend_name;
+----------------+------------------+
| 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 | +----------------+------------------+
6 rows in set (0.004 sec) MariaDB [crashcourse]>

Upper()可以將文字轉換成大寫。

表中列出了某些常用的文字處理函式。

SOUNDEX是一個將任何文字串轉換為描述其語言表示的字母數字模式的演算法。SOUNDEX考慮了類似的發音字元和音節, 使得能對串進行發音比較而不是字母比較。如下所示:

MariaDB [crashcourse]> SELECT cust_name, cust_contact FROM customers WHERE Soundex(cust_contact) = Soundex('Y Lie');
+-------------+--------------+
| cust_name   | cust_contact |
+-------------+--------------+
| Coyote Inc. | Y Lee        |
+-------------+--------------+
1 row in set (0.001 sec)

MariaDB [crashcourse]> 

因為Y.Lee和Y.Lie的發音相似, 所以他們的SOUNDEX值匹配。因此WHERE子句能正確的過濾出所需的資料。

日期和時間處理函式

日期和時間採用相應的資料型別和特殊的格式儲存, 以便能快速和有效的排序或過濾, 並且節省物理儲存空間

一般,應用程式不使用用來儲存日期和時間的格式,因此日期和時間函式總是被用來讀取、統計和處理這些值。

一些常用的日期和時間處理函式

首先需要注意的是MySQL使用的日期格式。無論什麼時候指定了一個日期, 不管是插入或是更新表值還是使用WHERE子句進行過濾。日期必須為格式yyy-mm-dd。

基本的日期比較很簡單

MariaDB [crashcourse]> SELECT cust_id, order_num FROM orders WHERE order_date = '2005-09-01';
+---------+-----------+
| cust_id | order_num |
+---------+-----------+
|   10001 |     20005 |
+---------+-----------+
1 row in set (0.002 sec)

MariaDB [crashcourse]> 

但是使用"WHERE order_date = '2005-09-01'"這種比較是不可靠的, 如果order_date的值為"order_date = '2005-09-0 11:30:05' "則不會被匹配出來。

解決辦法是使用Date()函式, Date函式(order_date)指示MySQL僅提取列的日期部分, 更可靠的SELECT語句為:

MariaDB [crashcourse]> SELECT cust_id, order_num FROM orders WHERE Date(order_date) = '2005-09-01';
+---------+-----------+
| cust_id | order_num |
+---------+-----------+
|   10001 |     20005 |
+---------+-----------+
1 row in set (0.001 sec)

MariaDB [crashcourse]> 

還有一種日期比較的方法, 如果想檢索出2005年9月下的所有訂單。

方法一: 使用BETWEEN將2005-09-01和2005-09-30定義成一個要匹配的日期範圍

MariaDB [crashcourse]> SELECT cust_id, order_num FROM orders WHERE Date(order_date) BETWEEN '2005-09-01' AND '2005-09-30';
+---------+-----------+
| cust_id | order_num |
+---------+-----------+
|   10001 |     20005 |
|   10003 |     20006 |
|   10004 |     20007 |
+---------+-----------+
3 rows in set (0.001 sec)

MariaDB [crashcourse]> 

方法二: 使用函式

MariaDB [crashcourse]> SELECT cust_id, order_num FROM orders WHERE Year(order_date)=2005 AND Month(order_date)=9;
+---------+-----------+
| cust_id | order_num |
+---------+-----------+
|   10001 |     20005 |
|   10003 |     20006 |
|   10004 |     20007 |
+---------+-----------+
3 rows in set (0.000 sec)

MariaDB [crashcourse]> 

數值處理函式

數值處理函式僅處理數值資料,這些函式一般主要用於代數、三角或幾何運算。

在主要的DMBS中, 數值函式是最一致最統一的函式。如下列舉出常用的數值處理函式