SQL | 使用函数处理数据

8-使用函数处理数据

8.1-函数

SQL可以用函数来处理数据。函数一般是在数据上执行的,为数据的转换和处理提供了方便。

8.1.1 函数带来的问题

每种DBMS都有特定的函数,只有很少一部分函数,是被所有主要的DBMS等同的支持。

虽然所有的类型的函数一般都可以在每个DBMS中使用,但每个函数的名称和语法可能及其不同。

下面是三个常用的函数以及其在各个数据库中的语法:

可以看到,与SQL不一样,SQL函数是不可移植的。许多SQL程序员不赞成使用特定的函数实现特定的功能。虽然这么做有好处,但是有时候不利于应用的性能。

8.2-使用函数

大多数SQL都实现支持以下类型的函数。

  • 用于处理文本字符串(如删除、填充值,转换大小写)的函数。

  • 用于在数值数据上进行算术操作(如返回绝对值,进行代数运算)的数值函数。

  • 用于处理日期和时间,并从这些值中提取某些我们想要的成分(如返回两个日期之差,检查日期的有效性)的日期和时间函数。

  • 用于生成可读性比较好的格式化函数(如用语言形式表达出日期,用货币符号和千分位表示金额)。

  • 返回DBMS正使用的特殊信息(如返回用户登录信息)的系统函数。

8.2.1 文本处理函数

上述内容中有一个文本处理函数,RTRIM()用来去除某列值右边的空格。

这次我们使用UPPER() 将英文字符串全部转换为大写。

select vend_name,UPPER(vend_name) as vend_name_upcase
from vendors
order by vend_name;

 

由上述输出结果我们可以看到,左边列是原始数据,右边列是我们使用文本处理函数后得到的数据。

大写、小写、大小写混合

SQL函数不区分大小写,因此,upper()、UPPER()、Upper()三个函数是同一个作用。

substr()、SUBSTR()、Substr()也是同样的道理。

虽然不区分大小写,但是还是要有自己的风格,不要变来变去,使得编写的代码可读性较差。

常用的文本处理函数:

函数说明
left() (或使用子字符串函数)返回字符串左边的字符
lenfth() (也可以使用datalength() 或者 len())返回字符串的长度
lower()将字符串转换为小写
ltrim()去掉字符串左边的空格
rtrim()去掉字符串右边的空格
right() (或使用子字符串函数)返回字符串右边的字符
substr()或者substring()提取字符串的组成部分
soundex()返回字符串的soundex值
upper()将字符串转换为大写

soundex是一个将任何文本串转换为描述其语音表示的字母数字模式的算法。soundex考虑了类似的发音字符和音节,使得能对字符串进行发音比较而不是字母比较。

虽然soundex不是SQL概念,但大多数DBMS都提供了对soundex的支持。

soundex支持 PostgreSQL不支持soundex(),因此以下的例子不适用于这个DBMS。另外,如果在创建SQLite时使用了SQLITE_SOUNDEX编译时选项,那么soundex()在SQLite中就可用。因为SQLITE_SOUNDEX不是默认的编译时选项,所以多数SQLite实现不支持soundex()。

例如:Customers表中有一个顾客Kids Place,其联系名为Michelle Green。但如果这是错误的输入,此联系名实际上应该是Michael Green,该怎么办呢?

如果按照正确的联系名搜索不会返回数据,如下所示:

select cust_name,cust_contact
from customers
where cust_contact = "Michael Green";

显然,输出的行为0。

如果使用soundex()函数进行搜索,他匹配所有发音类似于Michael Green的联系名。

select cust_name,cust_contact
from customers
where soundex(cust_contact) = soundex('Michael Green');

WHERE子句使用SOUNDEX()函数把cust_contact列值和搜索字符串转换为它们的SOUNDEX值。因为Michael Green和Michelle Green发音相似,所以它们的SOUNDEX值匹配,因此WHERE子句正确地过滤出了所需的数据。

8.2.2 日期和时间处理函数

日期和时间值以特殊格式存储,以便能快速有效的排序或者过滤,并且节省物理存储空间。

应用程序一般不使用日期和时间的存储格式,因此日期和时间函数总是用来读取、统计和处理这些值。由于这个原因,日期和时间函数在SQL中具有重要的作用。但是每个DBMS几乎都不一样。

例子:Orders表中包含的订单都带有订单日期。要检索出某年的所有订单,需要按订单日期去找,但不需要完整日期,只要年份即可。

在SQL Server中检索2020年所有订单

select order_num
from orders
where datepart(yy,order_date) = 2020;

在本机的MySQL环境下执行上述语句,会出现:ERROR 1305 (42000): FUNCTION databases.datepart does not exist

提示我们该函数不存在。

DB2,MySQL和MariaDB具有各种日期处理函数,但没有DATEPART()。DB2,MySQL和MariaDB用户可使用名为YEAR()的函数从日期中提取年份:

select order_num
from orders
where year(order_date) = 2020;

在SQLite中有一个小技巧:

select order_num
from orders
where strftime('%Y',order_date) = '2020';

上述SQL语句用来提取和使用日期的年。按月份过滤,可以进行相同的处理。

DBMS提供的功能远不止简单的日期成分提取。大多数DBMS具有比较日期、执行日期的运算、选择日期格式等的函数。但是,可以看到,不同DBMS的日期−时间处理函数可能不同。

8.2.3 数值处理函数

数值处理函数,主要用来处理数值数据,这些函数主要用来处理代数、三角和几何,所以,一般情况下,数值处理函数不像日期和时间处理函数使用那么频繁。

但是,数值处理函数是各个DBMS最统一的函数。

练习

  1. 我们的商店已经上线了,正在创建顾客账户。所有用户都需要登录名,默认登录名是其名称和所在城市的组合。编写SQL语句,返回顾客ID(cust_id)、顾客名称(cust_name)和登录名(user_login),其中登录名全部为大写字母,并由顾客联系人的前两个字符(cust_contact)和其所在城市的前三个字符(cust_city)组成。例如,我的登录名是BEOAK(Ben Forta,居住在Oak Park)。提示:需要使用函数、拼接和别名。

    select cust_id,cust_name,upper(Concat(substring(cust_contact,1,2),substring(cust_city,1,3))) as user_login
    from customers;

     

  2. 编写SQL语句,返回2020年1月的所有订单的订单号(order_num)和订单日期(order_date),并按订单日期排序。你应该能够根据目前已学的知识来解决此问题,但也可以开卷查阅DBMS文档。

    select order_num,order_date
    from orders
    order by order_date;

    我见青山多妩媚,料青山间我应如是。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/32797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】C++异常

文章目录 1. C语言传统处理错误的方式2. C异常的概念3. 异常的使用3.1 异常的抛出和捕获3.2 异常的重新抛出3.3 异常安全3.4 异常规范 4. C标准库的异常体系5. 自定义的异常体系6. 异常的优缺点 1. C语言传统处理错误的方式 C语言传统的错误处理机制有两个: 终止程…

v-md-editor自定义锚点(生成目录)数组转树结构

接前两篇博文,最终方案终于定了,也把之前做的编辑器模式给否决了,原因是系统中有老的文档需要平替,因此就不能通过编辑器这种模式了,太麻烦了。 最终方案:线下手动pandoc word转markdown,然后将…

使用Java根据表名导出与导入Sql

前言 很粗糙啊,有很多可以优化的地方,而且也不安全,但是临时用还是OK的,我这个是公司里面的单机软件,不联网。 嗨!我是一名社交媒体增长黑客,很高兴能帮助您优化和丰富关于批量作业导出和导入…

pycharm离线安装依赖包

一、对于单个下载离线包,然后安装 1、先去https://pypi.org/网站下载离线包,下载到本地; 2、从磁盘中找到刚刚下载包,点击确定就可以安装了 二、将本地项目所有依赖包全部下载下来,然后批量在另一个项目&#xff…

模型、策略和算法

模型(model)、策略(strategy)和算法(algorithm)是统计学习的所有内容. 模型是统计学习的最终结果,即决策函数(decision function) 或条件概率函数 ,它被⽤来预测特定问题下,将来未知输⼊的输出结果. 策略是统计学习过程中的产⽣最优模型的评…

Redis的常用命令

Redis常用命令 1、字符串string操作命令 Redis中字符串类型常用命令: 命令含义SET key value设置指定key的值GET key获取指定key的值SETEX key seconds value设置指定key的值,并将key的过期时间设为seconds秒SETNX key value只有在key不存在时设置key的值 更多命…

微软杀入Web3:打造基于区块链的AI产品

作者:秦晋 2023年1月,微软向 ChatGPT 创建者 OpenAI 投资 100 亿美元,在AI业界引发格外关注。此举也让微软在AI的战略探索上提前取得有利位置。 2023年3月,微软软件工程师 Albacore 披露微软正在为Edge 浏览器测试内置的非托管加密…

【OpenCV常用函数:轮廓检测+外接矩形检测】cv2.findContours()+cv2.boundingRect()

文章目录 1、cv2.findContours()2、cv2.boundingRect() 1、cv2.findContours() 对具有黑色背景的二值图像寻找白色区域的轮廓,因此一般都会先经过cvtColor()灰度化和threshold()二值化后的图像作为输入。 cv2.findContous(image, mode, method[, contours[, hiera…

网神 SecGate 3600 防火墙任意文件上传漏洞复现(HW0day)

0x01 产品简介 网神SecGate3600下一代极速防火墙(NSG系列)是基于完全自主研发、经受市场检验的成熟稳定网神第三代SecOS操作系统 并且在专业防火墙、VPN、IPS的多年产品经验积累基础上精心研发的高性能下一代防火墙 专门为运营商、政府、军队、教育、大型…

cmake扩展(1)——VS+CMake创建Qt项目

创建项目 创建CMakeLists #cmake最低版本 cmake_minimum_required(VERSION 3.10) #项目名 project(regextool)#查找所有*.h,*.ui,*.cpp文件,并存入SOURCES中 file(GLOB SOURCES "*.cpp" "*.ui" "*.h")#开启moc set(CMAKE_AUTOMOC O…

Transformer(一)简述(注意力机制,NLP,CV通用模型)

目录 1.Encoder 1.1简单理解Attention 1.2.什么是self-attention 1.3.怎么计算self-attention 1.4.multi-headed 1.5.位置信息表达 2.decorder(待补充) 参考文献 1.Encoder 1.1简单理解Attention 比方说,下图中的热度图中我们希望专注于…

『赠书活动 | 第十七期』《Python网络爬虫:从入门到实战》

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 『赠书活动 | 第十七期』 本期书籍:《Python网络爬虫:从入门到实战》 赠书规则:评论区:点赞|收…

shell脚本之正则表达式

目录 一.常见的管道命令1.1sort命令1.2uniq命令1.3tr命令1.4cut命令1.5实例1.5.1统计当前主机连接状态1.5.2统计当前主机数 二.正则表达式2.1正则表达式的定义2.2常见元字符(支持的工具:find,grep,egrep,sed和awk&…

RabbitMQ 安装教程

RabbitMQ 安装教程 特殊说明 因为RabbitMQ基于Erlang开发,所以安装时需要先安装Erlang RabbitMQ和Erlang版本对应关系 查看地址:www.rabbitmq.com/which-erlan… 环境选择 Erlang: 23.3及以上 RabbitMQ: 3.10.1Windows 安装 1. 安装Erlang 下载地…

taro Swiper组件--异形滚动

效果 <SwiperindicatorDots{false}previousMargin50pxnextMargin50pxautoplay{false}interval100onChange{onChangeSwiper} >{[1,2,3].map((item, index) > {return (<SwiperItemkey{item-${index}}><View className{demo-item ${currentIndex index ? ac…

国产航顺HK32F030M: 内部参考电压

HK32F030MF4P6 用户手册 内部参考电压 adc.c #include "bsp_adc.h"/*** brief ADC GPIO 初始化* param 无* retval 无*/ static void ADCx_GPIO_Config(void) {GPIO_InitTypeDef GPIO_InitStructure;// 打开 ADC IO端口时钟ADC_GPIO_AHBxClock_FUN ( ADC_GPIO_C…

《Zookeeper》源码分析(七)之 NIOServerCnxn的工作原理

目录 NIOServerCnxnreadPayload()handleWrite(k)process() NIOServerCnxn 在上一节IOWorkRequest的doWork()方法中提到会将IO就绪的key通过handleIO()方法提交给NIOServerCnxn处理&#xff0c;一个NIOServerCnxn代表客户端与服务端的一个连接&#xff0c;它用于处理两者之间的…

Postman如何做接口测试

目录 Postman如何做接口测试1&#xff1a;如何导入 swagger 接口文档 Postman如何做接口测试2&#xff1a;如何切换测试环境 Postman如何做接口测试3&#xff1a;什么&#xff1f;postman 还可以做压力测试&#xff1f; Postman如何做接口测试4&#xff1a;如何自动添加请求…

HTML+JavaScript构建一个将C/C++定义的ANSI字符串转换为MASM32定义的DWUniCode字符串的工具

公文一键排版系统基本完成&#xff0c;准备继续完善SysInfo&#xff0c;增加用户帐户信息&#xff0c;其中涉及到Win32_Account结构&#xff0c;其C定义如下&#xff1a; [Dynamic, Provider("CIMWin32"), UUID("{8502C4CC-5FBB-11D2-AAC1-006008C78BC7}"…

Docker安装ElasticSearch/ES

目录 前言安装ElasticSearch/ES步骤1&#xff1a;准备1. 安装docker2. 搜索可以使用的镜像。3. 也可从docker hub上搜索镜像。4. 选择合适的redis镜像。 步骤2&#xff1a;拉取ElasticSearch镜像1 拉取镜像2 查看已拉取的镜像 步骤3&#xff1a;创建容器创建容器方式1&#xff…