MySQL基础——计算字段及数据处理函数

计算字段

字段(field) 基本上与列的意思相同,经常互换使用,不过数据库列一般称为列,而术语字段通常用在计算字段的连接上。
拼接(concatenate) 将值联结到一起构成单个值。
可以用Concat()函数来实现两个列的拼接。(多数DBMS使用+或||来实现拼接,当把SQL语句转换成MySQL语句时一定要把这个区别铭记在心。)

# 生成一个供应商报表,格式:名字(地址),SELECT语句返回包含4个列(计算字段)
mysql> SELECT Concat(vend_name,'(',vend_country,')')
    -> FROM vendors
    -> ORDER BY vend_name;
+----------------------------------------+
| Concat(vend_name,'(',vend_country,')') |
+----------------------------------------+
| ACME(USA)                              |
| Anvils R Us(USA)                       |
| Furball Inc.(USA)                      |
| Jet Set(England)                       |
| Jouets Et Ours(France)                 |
| LT Supplies(USA)                       |
+----------------------------------------+

Trim函数:支持RTrim()和LTrim(),分别是去掉数据右侧和左侧的空格,可以用来整理数据。
别名(alias) 一个字段或值得替换名。
可以看到,新计算列的名字没有意义,为了让客户机引用查询结果,SQL支持列别名。别名用AS关键字赋予。

mysql> SELECT Concat(vend_name,'(',vend_country,')') AS vend_title
    -> FROM vendors
    -> ORDER BY vend_name;
+------------------------+
| vend_title             |
+------------------------+
| ACME(USA)              |
| Anvils R Us(USA)       |
| Furball Inc.(USA)      |
| Jet Set(England)       |
| Jouets Et Ours(France) |
| LT Supplies(USA)       |
+------------------------+

算数计算 对检索出的数据进行算数计算

# 检索订单号20005中的所有物品并汇总价格
mysql> SELECT prod_id,quantity,item_price,
    -> quantity*item_price AS expanded_price
    -> FROM orderitems
    -> WHERE order_num = 20005;
+---------+----------+------------+----------------+
| prod_id | quantity | item_price | expanded_price |
+---------+----------+------------+----------------+
| ANV01   |       10 |       5.99 |          59.90 |
| ANV02   |        3 |       9.99 |          29.97 |
| TNT2    |        5 |      10.00 |          50.00 |
| FB      |        1 |      10.00 |          10.00 |
+---------+----------+------------+----------------+


此外,圆括号可用来区分优先顺序。

数据处理函数

函数没有SQL的可移植性强,如果决定使用函数,应该保证做好代码注释。大多数SQL实现支持以下类型的函数:

  • 用于处理文本串(如删除或填充值,转换值为大写或小写)的文本函数。
  • 用于在数值数据上进行算数操作(如返回绝对值,进行代数运算)的数值函数。
  • 用于处理日期和时间值并从这些值中提取特定成分(例如,返回两个日期之差,检查日期有效性等)的日期和时间函数。
  • 返回DBMS正使用的特殊信息(如返回用户登录信息,检查版本细节)的系统函数。

文本处理函数

函数说明
Left()返回串左边的字符
Right()返回串右边的字符
Length()返回串的长度
Locate()找出串的一个子串
Lower()将串转换为小写
LTrim()去掉串左边的空格
RTrim()去掉串右边的空格
Soundex()返回串的SOUNDEX值
SubString()返回子串的字符
Upper()将串转换为大写

其中SOUNDEX是一个将任何文本串转换为描述其语音表示的字母数字模式的算法。举例:顾客中有一个顾客Coyote Inc.,其联系名为Y.Lee。但如果这是记录错误,这个联系名实际应该是Y.Lie,怎么办?

mysql> SELECT cust_name, cust_contact
    -> FROM customers
    -> WHERE cust_contact = 'Y.Lie';
Empty set (0.00 sec)

mysql> SELECT cust_name, cust_contact
    -> FROM customers
    -> WHERE Soundex(cust_contact) = Soundex('Y.Lie');
+-------------+--------------+
| cust_name   | cust_contact |
+-------------+--------------+
| Coyote Inc. | Y Lee        |
+-------------+--------------+

日期和时间处理函数

日期和时间采用响应的数据类型和特殊的格式存储,以便能快速和有效地排序或过滤,并且节省物理存储空间。
在这里插入图片描述
MySQL使用的日期格式必须为yyyy-mm-dd,因此2020年3月30日应该为2020-03-30。

# 基本的日期比较很简单,检索一个2005年3月1日的订单记录。
mysql> SELECT cust_id, order_num
    -> FROM orders
    -> WHERE order_date = '2005-09-01';
+---------+-----------+
| cust_id | order_num |
+---------+-----------+
|   10001 |     20005 |
+---------+-----------+

但这样有时并不可靠,因为表中存储日期的列的数据类型为datetime,同时存储了日期和时间值,

mysql> SELECT order_date FROM orders;
+---------------------+
| order_date          |
+---------------------+
| 2005-09-01 00:00:00 |
| 2005-09-12 00:00:00 |
| 2005-09-30 00:00:00 |
| 2005-10-03 00:00:00 |
| 2005-10-08 00:00:00 |
+---------------------+

若时间不为0,则不会匹配,此时使用Date()函数更可靠:

mysql> SELECT cust_id, order_num
    -> FROM orders
    -> WHERE Date(order_date) = '2005-09-01';
+---------+-----------+
| cust_id | order_num |
+---------+-----------+
|   10001 |     20005 |
+---------+-----------+

如果想检索2015年9月的所有订单的话,需要BETWEEN操作符,或者AND操作符:

mysql> 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 |
+---------+-----------+
mysql> 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 |

数值处理函数

在这里插入图片描述


版权声明:本文为weixin_41966900原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。