头像图片

严颖的个人博客

Mysql必知必会(5):计算字段的使用

本文主要介绍Mysql中计算字段的使用方法

简介

在创建数据库表的时候,往往为了数据库的各种性能,我们需要将字段拆分或者按照特定的类型存储。而在读取数据库的时候,检索出来的数据往往不是我们直接需要使用的数据。举几个例子:

1、我们在存储省市区和街道信息时候会将他们单独分别存储在不同的列,而我们读取时候需要完整地址信息

2、订单表中,我们存储单价和购买数量。但是,读取信息往往需要用户所有付款金额

3、我们存储进数据库的所有单词都是大小写混合,而检索出来需要全部小写

这种情况下,就需要使用数据库的计算字段功能了。简单来说,就是在检索数据的时候对数据进行一定的操作。比如,格式化数据、拼接数据等操作。

计算字段是在`SELECT`检索过程中建立的虚拟字段,他们并不实际存在于数据库中。

字段

通常开发中,我们将数据库检索出来的列成为字段,他们在大部分情况下是一个意思。但是在使用计算字段时候,字段包含了虚拟出来的字段和数据库实际查询到的列。

计算字段和程序处理之间关系

数据库这种临时处理数据,格式化输出的结果,都可以使用编程语言来实现。但是,如果可以,请尽量使用Mysql来操作,毕竟,数据库的设计天生就是为了这些功能。简而言之,就是数据库处理比程序语言处理快,效率高。

演示操作

Concat拼接字段

下面先说说最常用的字段拼接。我们准备了一张用户姓名表

QQ截图20170209211312.png

可以看到其中的用户姓氏和名是分开存储的,现在我们进行常规检索

SELECT * FROM user_name;

QQ截图20170209211452.png

得到的结果也是用户的姓氏和名是分开的。

但是现在我们需要输出完整用户名字。这个时候,我们可以使用计算字段函数concat来使得这两个字段拼接起来,完整显示。

SELECT CONCAT(first_name,last_name) FROM user_name;

QQ截图20170209212656.png

结果如我们所愿。concat之间多个值使用都好分割。同理,我们还可以在concat函数中加入其他内容,比如短线。

SELECT CONCAT(first_name,'-',last_name) FROM user_name;

QQ截图20170209212830.png

这样就可以随心所欲的组合我们需要显示的数据

提醒:Mysql不同于其他数据库使用+号或者||来实现字段的拼接,Mysql使用函数concat来进行字段拼接。如果从别的数据库转换Mysql时候需要格外的注意。

trim过滤字段

上面使用concat来组合字段。假设,用户姓氏和名字段中有个字段前后包含了空格,而我并不想要该空格,应该如何解决?

办法很简单,在之前我们文章中曾经提到过使用Rtrim来去除字段右侧的空格。这里也同理可以使用

SELECT CONCAT(RTRIM(first_name),'-',last_name) FROM user_name;

这样,姓氏的右侧如果有空格,则会被过滤掉。同理,使用LTRIM可以过滤左侧的空格,如果使用TRIM则可以过滤两端的空格,更加省事。

使用别名

别名,如果用在人身上那么就相当于人的小名。比如我们国家领导人也有人叫他习大大。数据库中也是一样可以给查询的字段建立一个小名。

别名大概有两种用途,第一个是给没有名字的字段新建一个名字,或者给已经有名字的字段重新取一个名字。

新建名称

看下上面的一个例子结果:

这个是刚刚使用concat查询数据库得到的结果。我们仔细看下他最上面的一行名字:CONCAT(RTRIM(first_name),'-',last_name)。或者说这根本就不是一个名字,只是Mysql将那个表达式用到这里标识了一下。

在Mysql中直接看没什么大问题,但是如果到了程序语言中,根本无法引用该字段的内容。所以我们得给这个字段重新取一个名字。

Mysql中取别名需要一个关键字AS:

SELECT CONCAT(RTRIM(first_name),'-',last_name) AS `nickname` FROM user_name;

QQ截图20170209214139.png

现在再来看,名字是不是变得非常简洁了。该字段的名字nickname就是我们刚刚给取的位于AS后面的名字。

当然如果你写的特别熟练了之后,你也可以省略该AS关键字,直接这么写。

SELECT CONCAT(RTRIM(first_name),'-',last_name) `nickname` FROM user_name;

结果也是一样。

取一个别名

上面我们说的是给一个没有名字的字段取一个名字,当然Mysql还可以给已经有名字的字段重新取一个名字。当然这个也不是吃饱了撑的。

1、当数据库字段名字特别长时候,可以取一个简短的名字来缩短语句长度和书写复杂度

2、后面章节会讲到,当关联多个表查询的时候,如果遇到两张表具有相同字段时候,我们需要给每个字段前面加上一个数据库别名来区分字段

3、当数据库原本列名中包含不符合规范的字符,比如空格。检索数据时候,就需要重新命名

4、或者当原本数据库名不足以表达当前字段含义时候,就需要重新取名以防混淆

5、别名有时候也被成为导出列,意思是一样的

我们列几个例子:

假设一个数据库名叫yy_user_base_info。假设我们需要查询表中用户名称和年龄:

SELECT yy_user_base_info.`name`,yy_user_base_info.`age` FROM `yy_user_base_info`;

这样写起来很是繁琐,所以我们可以给数据库取个别名,用来简化查询语句。

SELECT u.`name`,u.`age` FROM `yy_user_base_info` AS u;

这样是不是就简化了许多?

算术运算

前面应用场景中我们还提到一个例子。就是订单表中我们保存了单价和购买数量,而我们需要直接输出订单总价。这个时候就需要我们的算术计算功能上线了。

我们先准备一个数据表:

QQ截图20170209220932.png

SELECT pro_id,quantity,item_price,quantity*item_price AS total_amount FROM orders;

QQ截图20170209221226.png

可以看到,原本只有3列的数据库,如今变为了4列,其中最后一个字段total_amount只是一个虚拟的字段,是我们使用item_price和quantity相乘得来的。这样我们就得到了所有我们需要的字段。

在编程语言中,你使用total_amount就和其他几个实际存在的字段一样引用。

Mysql中不仅仅可以使用乘号,还可以使用其他运算符,包含加减乘除所有运算符。

使用Mysql计算

Mysql其实和编程语言一样,也是可以做计算,直接处理函数,并且输出。

比如:

SELECT 3*2;

QQ截图20170209221841.png

直接返回了计算结果6

再比如:

SELECT NOW();

QQ截图20170209222129.png

直接返回了当前时间。

所以在Mysql中,如果直接使用SELECT后面跟上需要计算的内容,则可以直接返回的值。