MySQL必知必会:创建计算字段与使用函数处理数据

一,计算字段

1,什么是计算字段

存储在数据库表中的数据一般不是应用程序所需要的使用格式,需要直接从数据库中检索出转换、计算或格式化过的数据;而不是检索出数据,然后再在客户机应用程序或报告程序中重新格式化。
这就是计算字段发挥作用的所在了。
计算字段并不实际存在于数据库表中。计算字段是运行时在SELECT语句
内创建的。

2,拼接字段

1,简单拼接:
需求:需要以"name (country )"格式获取供应商表单。
在这里插入图片描述
解决办法:把两个列拼接起来。在MySQL的SELECT语句中,可使用Concat()函数来拼接两个列。

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)                       |
+-----------------------------------------+
6 rows in set (0.07 sec)

2,使用别名完善拼接:
SELECT语句拼接地址字段工作得很好,可它只是一个值。如果仅在SQL查询工具中查看一下结果,这样没有什么不好。但是,一个未命名的列不能用于客户机应用中,因为客户机没有办法引用它。
为了解决这个问题, SQL支持列别名。 别名( alias) 是一个字段或值的替换名。别名用AS关键字赋予。


mysql> select concat(rtrim(vend_name),' (',rtrim(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)       |
+-------------------------+
6 rows in set (0.03 sec)

3,执行算术计算

计算字段的另一常见用途是对检索出的数据进行算术计算。
如汇总物品的价格(单价 * 订购数量):
在这里插入图片描述

mysql> select prod_id,quantity,item_price from orderitems where order_num = 20005;
+---------+----------+------------+
| prod_id | quantity | item_price |
+---------+----------+------------+
| ANV01   |       10 | 5.99       |
| ANV02   |        3 | 9.99       |
| TNT2    |        5 | 10.00      |
| FB      |        1 | 10.00      |
+---------+----------+------------+
4 rows in set (0.03 sec)


mysql> select prod_id,quantity,item_price,quantity * item_price as expanded_price
from orderitems where order_num = 20005;  # 计算总价expanded_price
+---------+----------+------------+----------------+
| 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          |
+---------+----------+------------+----------------+
4 rows in set (0.13 sec)

二,使用数据处理函数

1,SQL中的函数

SQL支持利用函数来处理数据。函数一般是在数据上执行的,它给数据的转换和处理提供了方便。

  • 函数没有SQL的可移植性强,如果你决定使用函数,应该保证做好代码注释。

2,使用函数

1,文本处理函数:

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

使用Soundex()根据读音过滤出正确联系人:
在这里插入图片描述

假设出现了一个拼写错误:
mysql> select cust_name,cust_contact from customers where cust_contact = 'Y. Lie';  # 无返回 
Empty set

使用Soundex()
mysql> 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.15 sec)

2,日期和时间处理函数:
日期和时间采用相应的数据类型和特殊的格式存储,以便能快速和有效地排序或过滤,并且节省物理存储空间。
一般,应用程序不使用用来存储日期和时间的格式,因此日期和时间函数总是被用来读取、统计和处理这些值。

  • AddDate() 增加一个日期(天、周等)
  • AddTime() 增加一个时间(时、分等)
  • CurDate() 返回当前日期
  • CurTime() 返回当前时间
  • Date() 返回日期时间的日期部分
  • DateDiff() 计算两个日期之差
  • Date_Add()高度灵活的日期运算函数
  • Date_Format() 返回一个格式化的日期或时间串
  • Day() 返回一个日期的天数部分
  • DayOfWeek() 对于一个日期,返回对应的星期几
  • Hour() 返回一个时间的小时部分
  • Minute() 返回一个时间的分钟部分
  • Month() 返回一个日期的月份部分
  • Now() 返回当前日期和时间
  • Second() 返回一个时间的秒部分
  • Time()返回一个日期时间的时间部分
  • Year() 返回一个日期的年份部分

在日期格式方面,yyyy-mm-dd是首选的日期格式。因此, 2005年9月1日,给出为2005-09-01:
在这里插入图片描述

mysql> select cust_id,order_num from orders where order_date = "2005-09-01";
+---------+-----------+
| cust_id | order_num |
+---------+-----------+
|   10001 |     20005 |
+---------+-----------+
1 row in set (0.03 sec)

关于日期数据的重要补充:
order_date的数据类型为datetime。这种类型存储日期及时间值。样例表中的值全都具有时间值00:00:00,但实际中很可能并不总是这样。比如,存的 order_date 值 为2005-09-01 11:30:05,则WHERE order_date = '2005-09-01’过滤具体日期的数据就会失败。
解决办法是指示MySQL仅将给出的日期与列中的日期部分进行比较,而不是将给出的日期与整个列值进行比较。为此,必须使用Date()函数。Date(order_date)指示MySQL仅提取列的日期部分。

mysql> 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.03 sec)

如果你想检索出2005年9月下的所有订单,简单的相等测试不行,因为它也要匹配月份中的天数。
有几种解决办法:

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 |
+---------+-----------+
3 rows in set (0.04 sec)

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 |
+---------+-----------+
3 rows in set (0.03 sec)

关于MySQL中日期类型及处理函数可以参考这篇文章

3,数值处理函数

数值处理函数仅处理数值数据。这些函数一般主要用于代数、三角或几何运算等。
Abs() 返回一个数的绝对值
Cos() 返回一个角度的余弦
Exp() 返回一个数的指数值
Mod() 返回除操作的余数
Pi() 返回圆周率
Rand() 返回一个随机数
Sin() 返回一个角度的正弦
Sqrt() 返回一个数的平方根
Tan() 返回一个角度的正切

猜你喜欢

转载自blog.csdn.net/dangfulin/article/details/108341259
今日推荐