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.rhkb.cn/news/85715.html

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

相关文章

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

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

ORA-04031

ORA-04031:unable to allocate 3264 bytes of shared memory 1、问题背景 修改SGA重启数据库后报错系统内存:8G 原SGA大小:3G 修改后SGA大小:5G数据库可以正常重启,但是trance日志一直在报错 2、解决办法 调整shared…

React入门学习笔记3

事件处理 通过onXxx属性指定事件处理函数(注意大小写) React使用的是自定义(合成)事件, 而不是使用的原生DOM事件——为了更好的兼容性 eg:οnclick》onClickReact中的事件是通过事件委托方式处理的(委托给组件最外层的元素)——为了更高效通过event.target得到发生…

ssh-keygen 做好免密登录后不生效

免密说明 通常情况下,我们ssh到其他服务器需要知道服务器的用户名和密码。对于需要经常登录的服务器每次都输入密码比较麻烦,因此我们可以在两台服务器上做免密登录,即在A服务器可以免密登录B服务器。 在A服务器上登录B服务器时,…

ssm+vue基于java的少儿编程网上报名系统源码和论文PPT

ssmvue基于java的少儿编程网上报名系统源码和论文PPT006 开发工具:idea 数据库mysql5.7(mysql5.7最佳) 数据库链接工具:navcat,小海豚等 开发技术:java ssm tomcat8.5 摘 要 在国家重视教育影响下,教育部门的密确配合下&#…

手动实现 Spring 底层机制 实现任务阶段一编写自己 Spring 容器-准备篇【2】

😀前言 手动实现 Spring 底层机制的第2篇 实现了任务阶段一编写自己 Spring 容器-准备篇【2】 🏠个人主页:尘觉主页 🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的…

HashMap 二十一问

1&#xff1a;HashMap 的数据结构&#xff1f; A&#xff1a;哈希表结构&#xff08;链表散列&#xff1a;数组链表&#xff09;实现&#xff0c;结合数组和链表的优点。当链表长度超过 8 时&#xff0c;链表转换为红黑树。transient Node<K,V>[] table; 2&#xff1a;…

c刷题(二)

目录 加减混合运算 计算n的k次方 计算非负整数各位之和 字符串逆序 双指针 递归 矩阵计算 矩阵转置 加减混合运算 题目&#xff1a;计算1 / 1 - 1 / 2 1 / 3 - 1 / 4 1 / 5 …… 1 / 99 - 1 / 100 的值&#xff0c;打印出结果。 一般情况我们可以写个循环然后在用条…

ROS Navigation Stack安装

Navigation导航包是做导航几乎都要用的&#xff0c;大家可以先去ROS Wiki上学习下 我们先Git下对应版本的软件包&#xff0c;我是Kinetic的&#xff0c;所以是Kinetic-devel 下载后发现目录下并没有CMakeLists.txt&#xff0c;所以直接在ROS工作目录下catkin_make并不会产生可…

并发编程面试题1

并发编程面试题1 一、原子性高频问题&#xff1a; 1.1 Java中如何实现线程安全? 多线程操作共享数据出现的问题。 锁&#xff1a; 悲观锁&#xff1a;synchronized&#xff0c;lock乐观锁&#xff1a;CAS 可以根据业务情况&#xff0c;选择ThreadLocal&#xff0c;让每个…

MuMu模拟器运行一段时间后Device.Present耗时突然上升

1&#xff09;MuMu模拟器运行一段时间后Device.Present耗时突然上升 2&#xff09;​如何在运行过程中获得温度信息 3&#xff09;Input System鼠标更换主按键的Bug 4&#xff09;如何禁止Unity向https://config.uca.cloud.unity3d.com发送设备信息 这是第347篇UWA技术知识分享…

【设计模式】模板模式

什么是模板模式&#xff1f; 模板方法模式&#xff08;Template Method Pattern&#xff09;&#xff0c;又叫模板模式(Template Pattern)&#xff0c;在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现&#xff0c;但调用将以抽象类中定义的方式进行…

Unity限制在一个范围内移动

Unity限制在一个范围内移动 这个例子中&#xff0c;我们学习Vector3.ClampMagnitude的用法&#xff0c;限制小球在范围内移动。 在地图上放了一个小球&#xff0c;让他移动&#xff0c;但是不想让他掉下去&#xff0c;限制在一个球星范围内&#xff0c;就好像绳子拴住了一样&…

【HTML】<input>

分类 text password number button reset submit hidden radio checkbox file image color range tel email&#xff08;火狐有校验&#xff0c;360浏览器无校验。&#xff09; url datetime&#xff08;火狐、360浏览器不支持&#xff09; search date、month、week、time、da…

1、Java简介+DOS命令+编译运行+一个简单的Java程序

Java类型&#xff1a; JavaSE 标准版&#xff1a;以前称为J2SE JavaEE 企业版&#xff1a;包括技术有&#xff1a;Servlet、Jsp&#xff0c;以前称为J2EE JavaME 微型版&#xff1a;以前称为J2ME Java应用&#xff1a; Android平台应用。 大数据平台开发&#xff1a;Hadoo…

自建机房还是选择云服务器?以腾讯云为例

大企业是选择自购服务器自建机房还是使用腾讯云服务器&#xff1f;都说企业上云是趋势&#xff0c;自建机房是一次性支出&#xff0c;上云租赁云服务器等产品需要年年续费&#xff0c;大型企业有必要把数据中心迁移上云吗&#xff1f;腾讯云服务器网想说&#xff0c;自建机房购…

为什么金鸣识别不做成离线版?

来百度APP畅享高清图片 在众多的用户咨询中&#xff0c;金鸣识别客服常常会被用户问及为何不做成离线版的问题&#xff0c;下面我就在这里跟大伙说说其中的原因吧。 离线版的OCR准确率相对于网络版可能会较低&#xff0c;主要有以下几个原因&#xff1a; 1. 数据量和模型更新…

[C++项目] Boost文档 站内搜索引擎(5): cpphttplib实现网络服务、html页面实现、服务器部署...

在前四篇文章中, 我们实现了从文档文件的清理 到 搜索的所有内容: 项目背景: &#x1fae6;[C项目] Boost文档 站内搜索引擎(1): 项目背景介绍、相关技术栈、相关概念介绍…文档解析、处理模块parser的实现: &#x1fae6;[C项目] Boost文档 站内搜索引擎(2): 文档文本解析模块…

游戏选香港主机会很卡吗?

​  经常会有用户问道&#xff1a;做游戏服务器&#xff0c;使用香港主机会很卡吗?要知道&#xff0c;游戏运营最看重的就是用户体验&#xff0c;而游戏流畅不流畅要看所使用香港服务器本身的稳定性。因此&#xff0c;卡不卡&#xff0c;这样的形式提问是比较笼统的&#xf…

放弃51单片机,直接学习STM32开发可能会面临的问题

学习51单片机并非仅仅是为了学习51本身&#xff0c;而是通过它学习一种方法&#xff0c;即如何仅仅依靠Datasheet和例程来学习一种新的芯片。51单片机相对较简单&#xff0c;是这个过程中最容易上手的选择&#xff0c;而AVR单片机则更为复杂。虽然您已经学习了大约十天的51单片…