第十一章 - 模糊匹配(like)、正则匹配(REGEXP)、文本处理函数、时间处理函数

news2024/11/27 22:38:53

第十一章 - 模糊匹配(like)、正则匹配(REGEXP)、文本处理函数、时间处理函数

    • 模糊匹配和正则匹配
      • like
        • `%`通配符
        • `_`通配符
      • REGEXP 正则匹配
    • 文本拼接
      • concat()
      • substring()
      • substring_index()
      • 一些文本处理函数
    • 时间处理函数
        • from_unixtime()
        • adddate(日期,增加天数) 增加日期
        • datediff() 两个日期相差的天数
        • curdate() 获取当前日期
        • dayofweek()
        • year() 获取日期中的年分
        • month() 获取日期中的月份
        • day() 获取日期中的天
        • hour() 获取时间中的小时数
    • 偏移函数 lead() & lag()

模糊匹配和正则匹配

如何通过关键字来搜索出需要的数据来。用简单的比较操作或者用where来筛选是不行的。下面介绍两种匹配方法。

like

可以通过like操作符来使用通配符操作,从而实现模糊匹配的效果。
使用注意:
1.通配符搜索处理的时间要比一般搜索的时间要长。
2.如果其他操作符能达到相同的效果,应该使用其他操作符。
3.在需要使用通配符时,非必须的情况下,不要把他们用在搜索的开始处。
4.要注意通配符的位置,如果位置放错,返回的数据就不一定准确。

%通配符

%表示任何字符出现任意次数
%通配符是最经常使用的。
%在字符的右边如:ka%表示匹配所有以结尾的数据
%在字符的左边如:%ka表示匹配所有以结尾的数据
%在字符的两边如:%ka%表示匹配所有包含ka字符的数据

举个例子:找出以Ka开头的名字

select
	PassengerId,
	Name
from
	test.titanic
where
	Name like "ka%"

输出结果:
在这里插入图片描述

举个例子:找出所有包含Miss的名字

select
	PassengerId,
	Name
from
	test.titanic
where
	name like '%Miss%'

输出结果:
在这里插入图片描述
所有name列中包含Miss的数据

_通配符

_表示任何字符出现任意次数
_通配符是最经常使用的。
_在字符的右边如:ka_表示匹配所有以ka开头的三位字符
_在字符的左边如:_ka表示匹配所有以ka结尾的三位字符
_在字符的两边如:9_1表示匹配所有以9开头以1结尾的三位字符
举个例子: 找出所有以9开始以1结尾的三位数的用户ID

select
	PassengerId
from
	test.titanic
where
	PassengerId like '9_1'

输出结果:
在这里插入图片描述

REGEXP 正则匹配

正则表达式是用来匹配搜索文本的强大的工具,能够实现比like更复杂的文本匹配。比如需要匹配邮箱格式的数据,需要匹配电话号码,或者是匹配一个网址的链接等,都可以用正则表达式来实现。

下面通过几个案例来介绍MySQL中的正则匹配的用法:
举个例子:找出所有以M开头的人名

select
	*
from
	test.titanic
where
	Name regexp '^M'

输出结果:
在这里插入图片描述
举个例子:找出年龄为40岁或者50岁的数据

select
	*
from
	test.titanic
where
	age regexp '40|50'

在这里插入图片描述

举个例子:只匹配age年龄中有小数的数据

select
	age
from
	test.titanic
where
	# '^[0-9]*\\.'表示所有以数字开始的,且包含.的字符。
	age regexp '^[0-9]*\\.'

输出结果:
在这里插入图片描述
正则匹配中一些常用的匹配字符:

| 表示或的意思,使用效果同 or
^ 文本开始
$ 文本结尾
. 匹配任意一个字符
* 0个或多个匹配
? 0个或1个匹配,等同于{0,1}
+ 1个或多个匹配,等同于{1,}
{n} 指定数目的匹配
{n,} 不少于指定数目的匹配
{n,m} 匹配数目的范围 m不超过255
[0-9] 匹配任意数字
[A-Z] 匹配任意大写字母
[a-z] 匹配任意小写字母
[a-zA-Z] 匹配任意字母
[a-zA-Z0-9] 皮皮任意字母和数字

文本拼接

concat()

在数据查询时,如果想把两个字段内的信息拼接为一个新的字段,这时候可以通过使用concat()来实现文本的拼接功能。
举个例子:把两列的数据合并为一个新的列
使用concat()函数,以逗号为分割符,把sex和age的数据拼接为新的一列数据sex&age

select
	select
	sex,
	age,
	concat(sex,',',age) as 'sex&age'
from
	test.titanic

输出结果:
在这里插入图片描述
concat()中可以用多个逗号,自定义设置不同的拼接样式。如下面所示:

select
	sex,
	age,
	concat(sex,'-年龄为','(',age,')') as 'sex&age'
from
	test.titanic

输出结果:
在这里插入图片描述

substring()

在SQL中不光能实现数据的拼接,还可以实现数据的截取。
substring()是可以通过设置实现从指定的位置截取指定位数的数据。

substring(字段名称,起始位数,截取位数)

举个例子:有时候会需要把日期和时间区分开如2014/9/18 15:03这种样式,当我们只需要其中的年月日的时候该如何提取?
通过观察2014/9/18 15:03数据可以看出,获取年月日的信息只需要提取前面9位字符就够了
可以通过substring()来截取需要的日期,下面例子表示截取vtime字段中,从第一位开始,截取前9位数字

select
	vtime,
	# 截取vtime字段,从第1个字符开始,截取9位字符。
	substring(vtime,1,9) as '日期'
from
	rectmall.log

输出结果:
在这里插入图片描述

substring_index()

前面截取的是日期格式,字符的位置是一致的,可以通过固定的位数进行截取。但是当我们遇到字符长短不一样的时候该怎么提取呢,如下面这样字段中包含多个信息,但是只需要提取前面的名字:
在这里插入图片描述

这个时候就不能用固定位数的方式来提取了,可以通过关键字来提取。

substring_index(字段名称,关键字,出现次数)

举个例子:

select
	name,
	# 当关键字 , 出现第一次的时候,截取前面的数据。如果写位-1就是截取关键字后面的数据
	substring_index(name,',',1)
from
	test.titanic

输出结果:
在这里插入图片描述

一些文本处理函数

upper() 将字符转换位大写
left() 截取左边的字符
lenght() 返回字符的长度
lower()将字符转换为小写
ltrim() 去除左边的空格
right()截取右边的字符
rtrim()去除右边的空格

时间处理函数

from_unixtime()

把 UNIX 时间戳转换为普通格式的日期时间值。在查询数据时,会遇到时间戳格式的时间,这时候就需要把时间戳转换为需要的日期。
举个例子:

select
	time_stamp,
	# '%Y-%m-%d %r'可以根据需要自己选择需要获取的时间,下面有不同的表示代码
	from_unixtime(time_stamp, '%Y-%m-%d %r' ) as "日期时间"
from 
	behavior_log

在这里插入图片描述
转换的日期格式代码

%M 月名字(January……December)
%W 星期名字(Sunday……Saturday)
%Y 年, 数字, 4 位 %y 年, 数字, 2 位
%d 月份中的天数, 数字(00……31)
%m 月, 数字(01……12)
%c 月, 数字(1……12)
%b 缩写的月份名字(Jan……Dec)
%j 一年中的天数(001……366)
%H 小时(00……23)
%h 小时(01……12)
%I 小时(01……12)
%l 小时(1……12)
%r 时间,12 小时(hh:mm:ss [AP]M)
%S 秒(00……59)
%s 秒(00……59)
%p AM或PM
%U 星期(0……52), 这里星期天是星期的第一天

adddate(日期,增加天数) 增加日期

select
	adddate('2022-01-01',3)

输出结果:
在这里插入图片描述

datediff() 两个日期相差的天数

datediff(日期1,日期2) #结果为 日期1 - 日期2 的天数

select
	datediff('2022-01-01','2022-01-05')

输出结果:
在这里插入图片描述

curdate() 获取当前日期

直接获取当天的日期。

select
	curdate()

输出结果:
在这里插入图片描述

dayofweek()

输入日期,返回日期是周几。默认1为周日,2为周一

select
	curdate() as '当前日期',
	dayofweek(curdate()) as '周几'

输出结果:
在这里插入图片描述

year() 获取日期中的年分

select
	vtime,
	year(vtime)
from
	rectmall.log

输出结果:
在这里插入图片描述

month() 获取日期中的月份

select
	vtime,
	month(vtime)
from
	rectmall.log

输出结果:
在这里插入图片描述

day() 获取日期中的天

select
	vtime,
	day(vtime)
from
	rectmall.log

输出结果:
在这里插入图片描述

hour() 获取时间中的小时数

select
	vtime,
	hour(vtime)
from
	rectmall.log

输出结果:
在这里插入图片描述

偏移函数 lead() & lag()

lead()是 把指定列的数据向上移动指定行数,空出来的行用null填充。
lag()是 把指定列的数据向下移动指定行数,空出来的行用null填充。
lead()lag()的参数设置是一样的,只是移动的方向不一样。

举个例子:把action列的数据向上移动两行。
over()中不设置参数,可实现使整列数据偏移指定的行数。

select
	action,
	lead(action,2) over()
from
	rectmall.log

输出结果:
在这里插入图片描述
举个例子:计算商品id为i161 的商品,两次点击之间的间隔时间。
步骤:

  1. 新建一列时间数据,把vitme的时间全部向上移动一行,实现,实现前后点击时间在同一行中,方便后续计算
  2. 在前面建立的查询结果上,在通过datediff()进行日期的计算,或者timediff()时间的计算
  3. 得出相差的天数(相差天数),或者相差的小时数(相差时间)
    当在over()中指定参数是,可以实现窗口函数的控制效果。
select
	*,
	datediff(vtime2,vtime) as '相差天数',
	timediff(vtime2,vtime) as '相差时间'
from
	(select
		item_id,
		vtime,
		lead(vtime,1) over(partition by item_id order by vtime) as vtime2
	from
		rectmall.log
	where
		item_id = 'i161') as temp

输出结果:
在这里插入图片描述

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

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

相关文章

Autosar MCAL-ADC配置PWM硬件触发采样

文章目录前言ADC配置AdcGroupRequestSourceAdcGroupTriggSrcAdcHwExtTrigSelectAdcHwGatePinAdcGeneral-AdcHwTriggerApiAdcHwGateSignalAdcHwTrigSignalAdcHwTrigTypeGtmGtmConnectionsPWM实际使用总结前言 在实际项目开发过程中,关于ADC采样,大部分使…

存储器与cpu的连接

1. 只读存储器 只读存储器中一般用于保存系统程序或者系统的配置信息; 早期的只读存储器, 在厂家就写好了内容改进1, 用户可以自己写, 一次性改进2, 可以多次写-- 要能对信息进行擦除;改进3,  电可擦…

【Leetcode 剑指Offer】第3天 字符串(简单)

字符串剑指 Offer 05. 替换空格字符串构造函数和析构函数操作函数剑指 Offer 58 - II. 左旋转字符串剑指 Offer 05. 替换空格 题:实现一个函数,把字符串 s 中的每个空格替换成"%20"。 class Solution { public:string replaceSpace(string s…

华为OD机试真题 用 C++ 实现 - 单词反转

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

Springcloud-Seata分布式事务

目录 一、什么是Seata? 二、Seata的执行流程 三、搭建Seata服务器 四、配置微服务客户端 分布式事务的解决办法: 使用消息中间件手写代码解决分布式事务使用第三方组件--->Seata阿里巴巴的产品 这里只介绍通过第三方插件-----Seata解决分布式事务的问题 一、什…

说说 React 中 fiber、DOM、ReactElement、实例对象之间的引用关系

原生组件 fiber 原生组件 fiber,指的就是 type 为 “span”、“div” 的 fiber。 1.fiber.stateNode 指向真实 DOM 节点;2.node["__reactFiber$" randomKey] 指向对应 fiber,使用随机数是防止和业务代码的属性名冲突,…

【系统设计】攻击技术

一、跨站脚本攻击 概念 跨站脚本攻击(Cross-Site Scripting, XSS),是指恶意攻击者在Web页面中插入恶意javascript代码(也可能包含html代码),当用户浏览网页之时,嵌入其中Web里面的javascript代…

python | 第八、九章考试题

本篇文章是对北京理工大学嵩天老师的《Python语言程序设计》第八章:程序设计方法学、第九章:Python计算生态纵览考试题的学习记录。 目录 一、第八章考试题 1、英文字符的鲁棒输入 2、数字的鲁棒输入 二、第九章考试题 1、系统基本信息获取 2、二…

JavaScript学习第2天:JS内置对象、简单数据类型与复杂类型

一、内置对象 JavaScript 中的对象分为3种:自定义对象 、内置对象、 浏览器对象 前面两种对象是JS 基础内容,属于 ECMAScript; 第三个浏览器对象属于JS 独有的 1、内置对象 内置对象就是指 JS 语言自带的一些对象。 JavaScript 提供了多个…

关于java8的List的stream流的foreach()方法问题探究(坑)与替代方案

一、起因 今天发现线上系统出现了一个bug&#xff0c; 我有一个“定时任务”每天凌晨触发&#xff0c;任务内容&#xff1a; ① 定时调用的系统暴漏的接口&#xff0c;来定时获取List<Object>数据。 ② 然后我会筛选出该List中符合条件的Object&#xff0c;对筛选出来的…

数组类模板

要求&#xff1a;设计一个数组模板类&#xff08;MyArray&#xff09;&#xff0c;完成对不同类型元素的管理操作步骤设计头文件在 qtcreate下先创建03_code的项目&#xff0c;然后右键点击03_code添加新文件&#xff0c;点击头文件&#xff0c;点击Choose命名为 myarry.hpp&am…

产品运营︱用户活跃度低的解决方法

app用户活跃度低&#xff0c;产品拉新变现效率慢&#xff0c;这是运营app时难免会遇到的情况。要想解决这类问题&#xff0c;就要从可能的原因下手&#xff0c;进行产品的优化改进&#xff0c;记录下改变后的关键数据变化&#xff0c;定期做好复盘工作进行调整。 一、app用户量…

117.Android 简单的拖拽列表+防止越界拖动(BaseRecyclerViewAdapterHelper)

//1.第一步 导入依赖库和权限&#xff1a; //依赖库&#xff1a; //RecyclerView implementation com.android.support:recyclerview-v7:28.0.0//RecyclerAdapter implementation com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.28 //用到的权限&#xff1a; <!…

【华为OD机试模拟题】用 C++ 实现 - 求最大数字

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

优思学院:六西格玛管理的优势有哪些?

六西格玛的优势有哪些呢&#xff1f;以下我们来探讨一下。 一・降低企业整体成本 对企业而言&#xff0c;不良品要么被废弃&#xff0c;要么需要重新加工&#xff0c;或者需要在客户现场维修或更换&#xff0c;这些都会增加企业成本。根据美国的统计数据&#xff0c;执行3σ管…

搭建Scala集成开发环境

文章目录前言搭建Scala集成开发环境&#xff08;一&#xff09;启动IDEA&#xff08;二&#xff09;安装Scala插件&#xff08;四&#xff09;创建Scala项目1、创建Scala项目 - ScalaDemo012、创建Scala类 - HelloWorld3、创建Scala单例对象 - TestHelloWorld&#xff08;五&am…

HIVE 基础(四)

目录 分桶&#xff08;Bucket&#xff09; 设定属性 定义分桶 案例 建表语句 表数据 上传到数据 创建分桶语句 加载数据 分桶抽样&#xff08;Sampling&#xff09; 随机抽样---整行数据 随机抽样---指定列 随机抽样---百分比 随机抽样---抽取行数 Hive视图&#…

计算机基础知识——认识寄存器

下面我们就来介绍一下关于寄存器的相关内容。我们知道&#xff0c;寄存器是 CPU 内部的构造&#xff0c;它主要用于信息的存储。除此之外&#xff0c;CPU 内部还有运算器&#xff0c;负责处理数据&#xff1b;控制器控制其他组件&#xff1b;外部总线连接 CPU 和各种部件&#…

【软件测试】自动化测试的科幻大片,揭开面纱的后背......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 只要一听到 “自动化…

Solon v2.1.4 发布。支持 java、kotlin、groovy!

本次发布&#xff0c;重点测试和验证了在 java、kotlin、groovy 三种 jvm 语言里&#xff0c;开箱即用的特性。并发布 Solon Initializr&#xff1a; https://solon.noear.org/start/ &#xff08;也即将发布 idea 插件&#xff09; 最近&#xff0c;与小诺开源团队合作发布了…