mysql学习-字符串相关函数01

所有的字符串函数
函数名称作 用
LENGTH计算字符串长度函数,返回字符串的字节长度
CONCAT合并字符串函数,返回结果为连接参数产生的字符串,参数可以使一个或多个
INSERT替换字符串函数
LOWER将字符串中的字母转换为小写
UPPER将字符串中的字母转换为大写
LEFT从左侧字截取符串,返回字符串左边的若干个字符
RIGHT从右侧字截取符串,返回字符串右边的若干个字符
TRIM删除字符串左右两侧的空格
REPLACE字符串替换函数,返回替换后的新字符串
SUBSTRING截取字符串,返回从指定位置开始的指定长度的字符换
REVERSE字符串反转(逆序)函数,返回与原始字符串顺序相反的字符串
常用的字符串函数
1.concat 字符串拼接
select concat('aa','-','cc') as aa,concat_ws('-','aa','bb','cc') as bb;

在这里插入图片描述

1.2 group_concat 多行数据合并

group_concat 函数实现对分组后的数据根据指定的分隔符,来将一个分组中的多个数据合并成一个数据。
注意:使用 GROUP_CONCAT()函数必须对源数据进行分组(使用 group by),否则所有数据会被合并成一行
案例:
表:

CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL,
  `add_time` datetime DEFAULT NULL,
  `ruuid` varchar(255) DEFAULT NULL COMMENT 'uuid去掉-后结果值大写',
  `address` varchar(255) DEFAULT NULL COMMENT '用户住址',
  PRIMARY KEY (`id`),
  KEY `name` (`name`(250)) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

insert into user(name,add_time,ruuid,address) values('aaa',now(),upper(replace(uuid(),'-','')),'北京');
insert into user(name,add_time,ruuid,address) values('afuck',now(),upper(replace(uuid(),'-','')),'北京');
insert into user(name,add_time,ruuid,address) values('aaa',now(),upper(replace(uuid(),'-','')),'上海');
insert into user(name,add_time,ruuid,address) values('afuck',now(),upper(replace(uuid(),'-','')),'上海');
insert into user(name,add_time,ruuid,address) values('bbb',now(),upper(replace(uuid(),'-','')),'深圳');
insert into user(name,add_time,ruuid,address) values('bbb',now(),upper(replace(uuid(),'-','')),'广州');
insert into user(name,add_time,ruuid,address) values('aaa',now(),upper(replace(uuid(),'-','')),'深圳');
insert into user(name,add_time,ruuid,address) values('afuck',now(),upper(replace(uuid(),'-','')),'深圳');

数据库中的数据量:
在这里插入图片描述

需求:将每个人的行程地址汇聚成一行。

select name as '姓名', group_concat(address) as '曾到达地方',--  默认用逗号分隔开。
group_concat(address separator '|')
from user group by name; 

在这里插入图片描述

2.字符串截取
2.1 substring

substring(col_name, start, length)函数: col_name列名(必选),start从第几个开始(必选 为整数 从1开始),length截去长度

当start >0 即 start为正整数的时候:

select 'aa-bb-cc-dd' as oo,
substring('aa-bb-cc-dd',1) as pp,
substring('aa-bb-cc-dd',3) as aa, --  截取从第三个字符开始的字符串(包含第三个字符串) 
substring('aa-bb-cc',3,4) as bb; --  截取从第三个字符开始长度为4的字符串

在这里插入图片描述
当start为负整数的时候 :

select 'aa-bb-cc-dd' as oo,
substring('aa-bb-cc-dd',-1) as pp,
substring('aa-bb-cc-dd',-3) as aa, --  截取从倒数第三个字符开始的字符串(包含第三个字符串) 
substring('aa-bb-cc-dd',-3,2) as bb; --  截取从倒数第三个字符开始长度为2的字符串

在这里插入图片描述

2.1.2 substr

substr() 函数 :截取字符串
substr( )与substring( )意思相等

1、substr(str,pos);
截取从pos位置开始到最后的所有str字符串
2、substr(str from pos);

3、substr(str,pos,len);//str:字符串,pos:起始位置,len:截断长度
参数说明:
str为列名/字符串;
pos为起始位置;mysql中的起始位置pos是从1开始的;如果为正数,就表示从正数的位置往下截取字符串(起始坐标从1开始),反之如果起始位置pos为负数,那么 表示就从倒数第几个开始截取;
len为截取字符个数/长度。
4、substr(str from pos len);

select 'aa-bb-cc-dd' as oo,
SUBSTR('aa-bb-cc-dd',4) as aa, -- 从第四个字符开始截取之后的字符串,包括第四个字符
SUBSTR('aa-bb-cc-dd' from 4) as ab,   -- 和上面没加from实现一样 
SUBSTR('aa-bb-cc-dd',-4) as ac,       -- 从倒数第四个字符开始截取之后的字符串,包括倒数第四个字符。
SUBSTR('aa-bb-cc-dd',4,3) as ba,      -- 从第四个字符开始截取字符,包括第四个字符,截取字符串的长度为3。
substr('aa-bb-cc-dd',-4,3) as bb;     -- 从倒数第四个字符开始截取字符,包括倒数第四个字符,截取字符串的长度为3。

在这里插入图片描述

2.2 substring_index

substring_index(col, a, num)函数:从第num个a来分割col,
当num为正整数时,从左往右分割并左往右取;
num为负整数时,从右往左分割并从右往左取。

案例:

select substring_index('aa-bb-cc-dd-ee-ff','-',3) as aa,
	substring_index('aa-bb-cc-dd-ee-ff','-',-2) as bb;

在这里插入图片描述

3 replace

replace(colName,search,replace)
意思:把colName中出现search的全部替换为replace

update table_name set col_name=replace(col_name,'#','') where col_name like '%#%';
update `news` set `content`=replace(`content`,' ',''); -- 清除news表中content字段中的空格

select 'abcd###' as aa ,replace('abcd###','#','*') as bb;

在这里插入图片描述

3.1 uuid()

用mysql的uuid()函数 ,生成的uuid是36位的,其中包含32个字符以及4个分隔符(-),往往这个分隔符对我们来说是没有用的,可以使用mysql自带的replace函数去掉分隔符

select uuid() as aa,
	replace(uuid(),'-','') as bb, -- 去掉uuid()生成的36位字符串中的横杠-
	upper(replace(uuid(),'-','')) as cc -- 将去掉横杠的32位字符串转换成大写;

在这里插入图片描述
uuid() 拓展:
在 MySQL 中,可以有如下3种途径实现唯一值:
1.自增序列
2.UUID() 函数
3.程序自定义
UUID 基于 16 进制,由 32 位小写的 16 进制数字组成,
比如123e4567-e89b-12d3-a456-426655440000就是一个典型的 UUID。
MySQL 实现了 UUID,并且提供 UUID() 函数方便用户生成 UUID。在 MySQL 的 UUID() 函数中,前三组数字从时间戳中生成,第四组数字暂时保持时间戳的唯一性,第五组数字是一个 IEEE 802 节点标点值,保证空间唯一。
使用 UUID() 函数,可以生成时间、空间上都独一无二的值。
据说只要是使用了 UUID,都不可能看到两个重复的 UUID 值。当然,这个只是在理论情况下。

同一个 SQL 语句中,多处调用 UUID() 函数得到的值不相同,多次调用或执行得到的后两组值相同。
同一台服务器,重启 MySQL 前后的 UUID() 第四组值发生变化,第五组值不变;
MySQL 中,utf8 字符集下,生成的 UUID 长度为 36 位;
不同机器生成的 UUID 不同,包括第五组值;
在复制环境中,使用到 UUID() 函数,则一定要使用基于行或者基于混合模式复制方式。
学习链接

3.2replace into函数(拓展)

为什么会接触到replace into函数,是因为业务需要向数据库中插入数据,前提是重复的不能再次插入。以前用where解决的,今天才知道还有一个更简洁的方法replace。
replace具备替换拥有唯一索引或者主键索引重复数据的能力,也就是如果使用replace into插入的数据的唯一索引或者主键索引与之前的数据有重复的情况,将会删除原先的数据,然后再进行添加。
语法:replace into table( col1, col2, col3 ) values ( val1, val2, val3 )
语义:向table表中col1, col2, col3列replace数据val1,val2,val3。

4 insert

insert 也是用来替换字符串的
insert(str,pos,len,newstr)
str:指定字符串
pos:开始被替换的位置
len:被替换的字符串长度
newstr:新的字符串
总结:替换掉 str 范围为 [ pos, pos+len ] 的字符串
注意:如果 pos > str 长度以内,则返回 str 不会被替换;如果 len > str 剩余字符串的长度,则将 str 剩下所有字符都替换成 newstr
案例:

select 'aa-bb-cc-dd' as aa ,
insert('aa-bb-cc-dd',3,4,'####') as bb,
insert('aa-bb-cc-dd',-3,2,'####') as cc;-- 无效,不进行字符串替换

在这里插入图片描述

5 instr

instr(str,substr) 在一个字符串(str)中搜索指定的字符(substr),返回发现指定的字符的位置(index);
str 被搜索的字符串
substr 希望搜索的字符串
结论:在字符串str里面,字符串substr出现的第一个位置(index),index是从1开始计算,如果没有找到就直接返回0,没有返回负数的情况。

案例:实现对用户名称
1.创建一个用户基础信息表

create table user(
	id int(11) unsigned not null auto_increment,
	name varchar(255) character set utf8mb4 default null,
	add_time datetime default null,
	primary key (id),
	key `name` (`name`(250)) using btree 
);

2.添加一个列属性;

alter table user add column ruuid varchar(255) default null comment 'uuid去掉-后结果值大写';

3.插入数据

insert into user(name,add_time,ruuid) values('cfuck',now(),upper(replace(uuid(),'-','')));
......

在这里插入图片描述
4.实现需求:

4.1 返回用户的所有信息,并对用户表洪用户名称是否包含敏感词 fuck 做标记。
如果返回结果为0 则说明不包含;如果返回结果大于0,则说明包含敏感词。

select *, instr(name,'fuck')  as '敏感词返回结果,为0则说明不包含敏感词' from user;

在这里插入图片描述
4.2 筛选出用户名中含有关键词的数据。

select * from user where instr(name,'fuck') >0;

在这里插入图片描述

6 regexp 正则表达式查询
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值