MySQL使用函数处理数据

目录

1、函数

2、使用函数

(1)针对文本字符串的MySQL函数

(2)日期和时间处理函数

(3)数值处理函数(数学)

3、小结


博主用的是mysql8 DBMS,附上示例资料:

百度网盘链接: https://pan.baidu.com/s/1XaWi3Y7hpXbs_uHq2cPI6Q

提取码: fpnx

1、函数

与大多数其他计算机语言一样,SQL 也可以用函数来处理数据。函数一般是在数据上执行的,为数据的转换和处理提供了方便。前一课中用来去掉字符串尾的空格的 RTRIM()就是一个函数。

函数带来的问题

  • 与几乎所有 DBMS 都等同地支持 SQL 语句(如 SELECT)不同,每一个DBMS 都有特定的函数。事实上,只有少数几个函数被所有主要的 DBMS等同地支持。虽然所有类型的函数一般都可以在每个 DBMS 中使用,但各个函数的名称和语法可能极其不同。
  • 为了说明可能存在的问题,表 1列出了 3 个常用的函数及其在各个 DBMS 中的语法:
表1 DBMS函数的差异
函数语法
提取字符串的组成部分Access 使 用 MID() DB2 Oracle PostgreSQL SQLite 使 用SUBSTR();MySQLSQL Server使用SUBSTRING()
数据类型转换AccessOracle使用多个函数,每种类型的转换有一个函数;DB2和PostgreSQL使用CAST()MariaDBMySQLSQL Server使用CONVERT()
取当前日期Access 使 用 NOW() DB2 PostgreSQL 使 用 CURRENT_DATE ;MariaDB和MySQL使用CURDATE()Oracle使用SYSDATESQLServer使用GETDATE()SQLite使用DATE()

可以看到,与 SQL 语句不一样,SQL 函数不是可移植的。这意味着为特定 SQL 实现编写的代码在其他实现中可能不正常。

可移植(portable)

  • 所编写的代码可以在多个系统上运行。为了代码的可移植,许多 SQL 程序员不赞成使用特定于实现的功能。虽然这样做很有好处,但有的时候并不利于应用程序的性能。如果不使用这些函数,编写某些应用程序代码会很艰难。必须利用其他方法来实现DBMS 可以非常有效完成的工作。

提示:是否应该使用函数?

  • 现在,你面临是否应该使用函数的选择。决定权在你,使用或是不使用也没有对错之分。如果你决定使用函数,应该保证做好代码注释,以便以后你(或其他人)能确切地知道所编写的 SQL 代码的含义。

2、使用函数

(1)针对文本字符串的MySQL函数

表2 常用的文本处理函数
函数说明
LEFT(str,len)、RIGHT(str,len)、LENGTH(str)返回字符串左(右)边指定长度的子串、获取字符串的长度
TRIM(str)、RTRIM(str)、LTRIM(str)去掉字符串的空格(两边、右、左)
UPPER(str)、LOWER(str)返回大写的字符串或者小写
SOUNDEX(str)
返回字符串的 SOUNDEX

 其中SOUNDEX 是一个将任何文本串转换为描述其语音表示的字母数字模式的算法。

-- SOUNDEX(str)函数:将任何文本串转换为描述其语音表示的字母数字模式的算法
-- customers表中有位顾客的联系名为Jim Jones,但现实中是Jimi Jones,现在要找到该客户的信息,利用发音相似
SELECT *
FROM customers
WHERE SOUNDEX(cust_contact) = SOUNDEX('Jimi Jones');

-- 其他函数的使用 

/*
	针对文本字符串的mysql函数
*/

-- 计算字段是对列内容的计算或者修改,会有新的一列显示出来,但其实并没有列名,需要用AS指定列(字段)名
-- 这里使用concat函数、upper函数和lower函数
SELECT CONCAT(cust_name,' (concat)') AS cust_name , cust_email, UPPER(cust_name) AS upper_cust_name, LOWER(cust_name) AS lower_cust_name
FROM customers
WHERE cust_email LIKE '%@coyote.com';

-- LEFT(str,len)函数、RIGHT(str,len)函数、LENGTH(str)函数
SELECT cust_name, cust_email, LEFT(cust_name, 5) AS left5, RIGHT(cust_name, 5) AS right5, LENGTH(cust_name) AS name_length
FROM customers
WHERE cust_email LIKE '%@coyote.com';

(2)日期和时间处理函数

日期和时间函数的差移植性

  • 日期和时间采用相应的数据类型存储在表中,每种 DBMS 都有自己的特殊形式。日期和时间值以特殊的格式存储,以便能快速和有效地排序或过滤,并且节省物理存储空间。
  • 应用程序一般不使用日期和时间的存储格式(可能直接使用的字符串),因此日期和时间函数总是用来读取、统计和处理这些值。由于这个原因,日期和时间函数在 SQL中具有重要的作用。遗憾的是,它们很不一致,可移植性最差。

我们举个简单的例子,来说明日期处理函数的用法。Orders 表中包含的订单都带有订单日期。为在 MySQL 中检索 2005 年的所有订单,可如下进行:

-- 各家DBMS的日期和时间格式各不相同,具体看各家的情况
-- 返回2005年的订单
-- MySQL 具有各种日期处理函数,但没有 DATEPART()。MySQL用户可使用名为 YEAR()的函数从日期中提取年份:
SELECT order_num 
FROM orders 
WHERE YEAR(order_date) = 2005;

使用BETWEEN关键字获取时间范围的数据,要先将字符串转换为日期时间格式,使用 STR_TO_DATE函数进行转换。

-- STR_TO_DATE(str,format)函数可将字符串转换为日期格式,从而利用between关键字依旧可以实现相应功能
/*
	%Y:代表 4 位年份,例如 2025。
	%y:代表 2 位年份,例如 25(代表 2025)。
	%m:代表月份,范围是 01 - 12。
	%d:代表一个月中的第几天,范围是 01 - 31。
	%H:代表小时(24 小时制),范围是 00 - 23。
	%h:代表小时(12 小时制),范围是 01 - 12。
	%i:代表分钟,范围是 00 - 59。
	%s:代表秒,范围是 00 - 59。
*/
SELECT * 
FROM orders 
WHERE order_date BETWEEN STR_TO_DATE('2005-09-01','%Y-%m-%d') AND STR_TO_DATE('2005-09-30','%Y-%m-%d');

(3)数值处理函数(数学)

数值处理函数仅处理数值数据。这些函数一般主要用于代数、三角或几何运算,因此不像字符串或日期--时间处理函数使用那么频繁。

具有讽刺意味的是,在主要 DBMS 的函数中,数值函数是最一致、最统一的函数。

函数说明
ABS()返回一个数的绝对值
COS()、SIN()、TAN()返回一个数的余弦值、正弦值、正切值
EXP()返回一个数的指数值
PI()、SQRT()返回PI值、取一个数的平方根
/*
	数值处理函数
	具有讽刺意味的是,在主要 DBMS 的函数中,数值函数是最一致、最统一的函数。
	ABS(X)、COS(X)、PI()、EXP(X)、SQRT(X)
*/
SELECT PI();
SELECT ABS(-5);
SELECT SIN(PI()/6), COS(PI()),TAN(PI()/4);

3、小结

  1. 函数并不像SQL语句那样各家通用,不同DBMS的函数各不相同,只有少部分函数通用(数值处理)
  2. 对于文本字符串处理函数,常用的有大小写、去掉空格、获取子串、获取字符串长度等函数
  3. 对于日期和时间函数,各家DBMS对于日期和时间的特殊格式不不相同,MySQL 常对某日期进行提取年份、月份等、将文本字符串转换为日期的函数是STR_TO_DATE。
  4. 使用BETWEEN关键字也可以求取指定时间范围的值
  5. 对于数值处理函数,各家DBMS基本一致。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值