⼀个questions表,字段有题⽬(TestSubject),选项(AnswerA,AnswerB,AnswerC,AnswerD,AnswerE) 要求字段不包含png,jpg,jpeg,gif 正常情况下会这么写
select * from questions where TestSubject not like '%png%' or TestSubject not like '%png%' or ......
总共需要写6 * 4 = 24个。
第⼀步优化,将字段拼接起来当做⼀个字段
select * from questions where concat(TestSubject,AnswerA,AnswerB,AnswerC,AnswerD,AnswerE) not like '%png%' or concat(TestSubject,AnswerA,AnswerB,AnswerC,AnswerD,AnswerE) not like '%jpg%' ......
总共需要重复写四遍
第⼆步优化,使⽤正则表达式。具体语法查看regexp语法
select * from questions where concat(TestSubject,AnswerA,AnswerB,AnswerC,AnswerD,AnswerE) NOT REGEXP 'png|jpg|jpeg|gif'
ok,⼀步到位。。。
再总结⼀下常⽤的正在表达式。
⼀下参考
这名字很是调⽪,在此基础上再做修改
-- ==============正则查询================/*
SQL默认是忽略⼤⼩写的
正则模式使⽤REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它们是同义词)。正则即字段值包含正则的内容即可. 匹配任何单个的字符,表⽰任意单字符
[...] 匹配包含⽅括号内某单个字符的字符串,[0-9]匹配0到9之间的某个数字* 匹配零个或多个在它前⾯的字符{n} 匹配n个在它前⾯的字符
如果希望⼤⼩写都匹配上可以这样写。[aA] 匹配⼤⼩写的 a,[a-zA-Z] 则匹配⼤⼩写的任何 a-z 单个字母。但默认是不区分⼤⼩写的 [b] 也可匹配上还有 B 的字符串要匹配的字符在字段起始处,使⽤ ^ ,在字段的结尾⽤ $如果是中⽂字符,可能在使⽤时需要注意⼀下。
*/
-- 字段name只有四个值,name_aA ,name_aB , name_⼈⼈ ,name_%好好_
SELECT * FROM `test_t` WHERE NAME REGEXP '[a-z]'; -- 包含a到z某个字符的字符串,能匹配到 name_aA 和 name_aB 和 name_⼈⼈ 和 name_%好好_SELECT * FROM `test_t` WHERE NAME REGEXP '^n.....b$'; -- 以n开头B结尾,7个字符长度的字符串,能匹配到 name_aB
SELECT * FROM `test_t` WHERE NAME RLIKE 'd*'; -- 包含0个或多个d的字符串,能匹配到该字段的所有值,因为 * 前的字符0个也匹配SELECT * FROM `test_t` WHERE NAME RLIKE 'B{1}$'; -- 结尾是⼀个B,能匹配到name_aB
-- ==============模糊查询================
-- MySql的like语句中的通配符:百分号、下划线和escape
-- % 表⽰任意个或多个任意字符。可匹配任意类型和长度的字符。
SELECT * FROM `test_t` WHERE NAME LIKE '%me_aB'; -- 查询结果 name_aB
-- 如果需要找出 name 中既有 b ⼜有 a 的记录,使⽤ and 条件
SELECT * FROM `test_t` WHERE NAME LIKE '%b%' AND NAME LIKE '%a%';
-- 若使⽤ SELECT * FROM `test_t` WHERE NAME LIKE '%b%a%'; 则找不到 name_aB。。。当然也可以使⽤正则where regexp 'b|a'
-- _ 表⽰任意单个字符。匹配单个任意字符,它常⽤来限制表达式的字符长度语句(可以代表⼀个中⽂字符)
SELECT * FROM `test_t` WHERE NAME LIKE '_______'; -- 能查询到 name_aA 和 name_aB 还有 name_⼈⼈ 这7个字符长度的值-- 如果要查字符 % 或者 _ 使⽤ ESCAPE,转义字符后⾯的 % 或 _ 就不作为通配符了,注意前⾯没有转义字符的%和_仍然起通配符作⽤SELECT * FROM `test_t` WHERE NAME LIKE 'name_/%%好/_' ESCAPE '/'; -- 查询结果 name_%好好_
因篇幅问题不能全部显示,请点此查看更多更全内容