SQL LIKE通配符 模糊查询

SQL LIKE &通配符简介

!无论什么类型,都可以使用LIKE +通配符来进行模糊筛选

LIKE 操作符

SQL 中LIKE 一般与通配符一起使用
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
语法:

SELECT MyName --列名
FROM MyTable--表明
WHERE MyName LIKE pattern; -- LIKE 指定模式为Pattern 在MyName内查找

通配符

在 SQL 中,通配符与 SQL LIKE 操作符一起使用,用于搜索表中的数据。
在 SQL 中,可使用以下通配符:

通配符描述使用方法
%替代0或多个字符LIKE 查询字符 前或后接 % 用于替代零到多个字符
_替代一个字符LIKE 查询字符 前或后接 _ 用于替代一个字符
[ charlist]字符列中的任何单一字符表示括号内所列字符中的一个(类似正则表达式)。指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。
[ ^charlis ]或 [ !charlist ]s不在字符列中的任何单一字符表示不在括号所列之内的单个字符。其取值和 [] 相同,但它要求所匹配对象为指定字符以外的任一个字符。

语法:

-- % 语法
SELECT MyName --列名
FROM MyTable--表明
WHERE MyName LIKE '林%'; -- 指定查询列中 林什么什么的 % 代表零到多个字符
-- _ 语法
SELECT MyName --列名
FROM MyTable--表明
-- 指定查询列中 林什么 _ 代表一个字符 当_位置处于林前面,就带表查询什么林的
WHERE MyName LIKE '林_'; 

通配符 %

% 替代0或多个字符
如下实例
% 实例
age 是int 类型 匹配2开头的不定长的字符串 当%在前面就是匹配2结尾的不定长字符串
在这里插入图片描述

需要注意的是,当我使用模糊查询的结果的是使用定长字符串类型来进行存储的时候如下图,
在这里插入图片描述
从第一个查询语句可以看到,明明原表是拥有以子结尾的Name字段,
可第二个 查询语句却没有查询到数据
这是因为,Name是使用定长字符串类型进行存储的,所以在存储的字符串不满足定义存储长度时,就会在字符串右边使用空格进行填充已满足定义的字符串存储长度
额,就是,当你定义name这个列的存储长度是五个时(nchar(5)),你存入,字段付子,付子只有两个字符串长度,不满足定义的存储长度5个,那数据库就会在付子后面添加三个空格,也就是说这个时候数据库中实际存储付子这个字段,不是存储喂
‘付子’
而是存储为
'付子 ’
所以说第二个查询语句模糊查询条件,是查询不到结果的,因为数据库中的’付子’后面还带了三个空格

WHERE Name lIKE '%子'--查询不到'付子   '

那怎么解决呢?
嗯,既然它后面还有三个空格,那我就在查询条件里加三个空格,
这样能,可以是可以,只不过当你不知道你要查询的字符串后面有多少字符串的时候,这样就很无力了
在这里插入图片描述如上图,当在后面加上数据库自动补全的空格之后,第二个查询就有结果了
但我们还有其他的办法
就是在子后面也加上通配符% 如下图
在这里插入图片描述
通配符 % ,匹配零个或多个字符,空格,也被当作字符
但是一般不推荐这样去查询,其实一般也不推荐直接使用模糊查询
因为模糊查询实在是太耗资源了,特别是数据量大了的时候
向上面的,如果知道年龄,一般会先使用年龄进行筛选,然后再在结果里面使用模糊筛选法筛选出需要的结果
如果不知道年龄一般也会使用函数Rtrim()去除 ,如下图
在这里插入图片描述

还有就是当你想查询比如说既有林 又有江的 那怎么查询呢?
SELECT *
FROM MyTables 
WHERE  Name Like '%江%涛%'

像上面的语句一样吗?,
不! 那样是不行的
那样只能查询出来诸如狗江涛,猪江涛,或是狗江狗涛狗,什么乱七八糟的,好像确实能查出好多东西出来
但万一有个人叫狗涛江呢???
那上面的查询语句就不能满足查询到了
所以当你要查询这种既有什么什么又有什么什么的,就是用关键字 ADN

SELECT *
FROM MyTables 
WHERE  Name Like '%江%' AND Name Like '%涛%'
还有就是当我要查询的字符内有%这个符号怎么办?

这个会在下面一起讲

通配符 _

通配符 _ 的使用方法和 % 的使用方法一样 所以这不再赘诉
区别是 _ 只能替代一个字符,而 % 能替代0~无数个字符

通配符 [ ]

表示括号内所列字符中的一个(类似正则表达式)。指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。
如下我想查找 林江猪,林江狗,林江涛

SELECT *
FROM MyTable
WHERE Name Like '林江[猪狗涛]'

将查询出 ,当然,因为这里使用的是定长说这里使用一下Rtrim函数去除一下Name列的右空格
在这里插入图片描述然后,回到上面的问题,当我们想要查询的结果里面有%这个符号怎么办,比如说我们要查找叫江%的人怎么办
有两种方法,一种是使用转义字符,还有一种就是向我下面这样,将它丢进通配符[]里面

SELECT *
FROM MyTable
WHERE Name Like '%江[%]' --查询叫什么什么江%的

如下图可以看到,我们查询到了一个叫林江%,( 因为 _ 的使用方法和 % 一样 所以就不做重复了)
在这里插入图片描述那如果我要查询林江1,林江2,林江3,林江3,林江涛,林江 鹅 狗 猫 怎么查呢?
一个一个吗?那样太麻烦了,可以缩写一下

	SELECT *
	FROM MyTables
	WHERE RTRIM(Name) like '林江[1-3涛鹅狗猫]' --当条件是连续的如12345可以使用1-5来替代,
	--当查询条件不是连续的时,就只能老老实实写了

在这里插入图片描述由于通配符的缘故,导致我们查询特殊字符“%”、“_”、“[”的语句无法正常实现,而把特殊字符用“[ ]”括起便可正常查询。据此我们写出以下函数:

r如查询林江%_[]可以这样写

SELECT MyName --列名
FROM MyTable--表明
WHERE MyName LIKE '林江[%_[]]';

照上面那样写的话,显然是错的,不信,你自己读读看那是什么意思,你自己都读不出来,计算机怎么读的出来,像这种情况,就只能老老实实使用转义字符了

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Qayrup

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值