1. 匹配:like 關鍵字
#假設存在表 my_test_copy select * from my_test_copy;

則使用like關鍵詞匹配:注意下划線 '_'和百分號 '%'
# 下划線'_'匹配任意單個字符 # 百分號'%'匹配任意數目的字符 select * from my_test_copy where name_people like '_滿_'; #有值 select * from my_test_copy where name_people like '%滿%'; #有值,百分號可以匹配任意數目的字符 select * from my_test_copy where name_people like '%樓'; #有值,百分號可以匹配任意數目的字符 select * from my_test_copy where name_people like '_樓'; #為空,因為下划線只能代表一個字符 select * from my_test_copy where name_people like '_滿樓'; #有值
2. 正則表達式:'rlike' 和 'regexp'同義,用於標識正則表達式模式
(1)'rlike' 和 'regexp'
select 'abc' regexp 'ab'; # regexp左操作數是要匹配的字符串,右操作數是匹配模式 select * from my_test_copy where name_people regexp '花'; select * from my_test_copy where name_people rlike '花';

(2)直接匹配
select 'abc' regexp 'b'; #返回1 select * from my_test_copy where name_people regexp '滿'; #有值
(3)'^'符號,匹配開頭,從字符串開始進行匹配
select * from my_test_copy where name_adress regexp '^天壇'; #為空,用於查詢以....開頭的字符串,而沒有以'天壇'開頭的字符串 select * from my_test_copy where name_adress regexp '^北'; #有值,用於查詢以....開頭的字符串

(4)'$'符號,匹配結尾
select * from my_test_copy where name_adress regexp '北$'; #為空,用於查詢以....結尾的字符串 select * from my_test_copy where name_adress regexp '京$'; #有值
(5)點號 '.' 符號,匹配任意一個字符
select * from my_test_copy where name_adress regexp '北.'; #有值 select * from my_test_copy where name_adress regexp '.京$'; #有值
(6)'+'符號,+前面的模式至少出現1次或以上
select * from my_test_copy where name_adress regexp 'beijing+'; #有值 select * from my_test_copy where name_adress regexp '京+'; #有值
(7)'*'符號,*前面的模式出現0次或以上
select * from my_test_copy where name_adress regexp '北京*'; #有值,'北'出現,且'京'接着'北'出現0次以上 select * from my_test_copy where name_adress regexp '人*'; #有值,出現0次
(8)'?'符號,'?'前面的模式出現0次或1次
select 'abc' regexp '^(ab)?c$'; #有值 select 'aaabc' regexp '^a*b?c$'; #有值 select 'ababc' regexp '^(ab)+c$'; #有值 select * from my_test_copy where name_adress regexp '人?'; #有值,出現0次 select * from my_test_copy where name_adress regexp '京?'; #有值,出現1次 select * from my_test_copy where name_adress regexp '(山庄)?'; #有值,出現0次或1次(山庄) select * from my_test_copy where name_adress regexp '山庄?'; #有值,出現了'山'和1次'庄'
(9)'()'符號,表示一個整體
select '33123400' regexp '(34)1'; #返回0:表示沒找到 select 'ac' regexp '^(ab)?c$'; #為0,表示未找到 select 'ababc' regexp '^(ab)?c$'; # 結果為0,'?'表示出現0次或1次 開頭'(ab)',而這個句子中出現了2次'ab',不符合條件,可以寫成 select 'ababc' regexp '^(ab){1,3}c$'; # {1,3}表示(ab)出現的次數在1-3次都可以
(10)'[]'符號,表示對其中的任意一個字符進行匹配,且僅能匹配一個字符
select 'heo' regexp '^h[abcde]o$'; #為1 select 'hello' regexp '^h[abcde]o$'; #為0,,雖然能匹配'e',但是兩個'l'沒有匹配 select 'hello' regexp '^h[abcdehijklmn]o$'; #為0,,雖然能匹配'e'和'l',但是'[]'每次只能匹配其中一個字符 select * from my_test_copy where name_adress regexp '萬梅[山庄陣]'; #有值,匹配到'萬梅山'
(11)'[]'中可以使用'-'表示區間,表示該區間的任意一個字符,my_test是另一個表
select 'abcde' regexp '^a[a-k]'; select 'abcde' regexp '[a-k]'; #查找是否存在字母 select * from my_test where phone_number regexp '[0-9]'; #有值,匹配到數字 select * from my_test where phone_number regexp '12[a-z]'; #為空
(12)若'[]'需要匹配']',則']'必須緊跟在'['之后
select 'aacc' regexp 'a[]a-z]'; #有值 select 'aa]cc' regexp 'a[]]'; #有值 select 'aa]cc' regexp 'a[bcc]dd]'; #為0,因為']'不是緊跟着'[' select 'aa]cc' regexp 'a[]bcac]'; #為1 select 'aa]cc' regexp 'a[bc]]'; #為0,']'放在末尾也不行
(13)若'[]'需要匹配'-',則'-'需要放在'[]'兩端,放在中間可能會報錯:[Err] 3697 - The regular expression contains an [x-y] character range where x comes after y.
select 'aaa-ccc-ddd' regexp 'a[-]'; #有值 select 'aaa-ccc-ddd' regexp 'a[-cdf]'; #有值,匹配到'a-' select 'aaa-ccc-ddd' regexp 'a[d-a]'; #[Err] 3697 - The regular expression contains an [x-y] character range where x comes after y.
(14)[^]表示不含'[]'中的任意字符
#例如:不含數字 select 'aaabbb' regexp '[^0-9]'; #為1 select 'aaabbb' regexp '[^0-9]$'; #為1,不以數字結尾 select 'aaabbb233' regexp '[^0-9]$'; #為0 select 'aaabbb' regexp '^[^0-9]'; #為1,不以數字開頭 select '23aaabbb' regexp '^[^0-9]'; #為0 select * from my_test_copy where name_adress regexp '[^北京]'; #表示不能只有'北京' select * from my_test_copy where name_adress regexp '^[^北]'; #表示開頭不含'北' select * from my_test_copy where name_adress regexp '萬梅[^山]'; #表示不含'萬梅山'
(15)'|' 匹配分隔的任意一個字符
select 'abc' regexp 'b|a|c'; select * from my_test_copy where name_adress regexp '北京|南京'; #表示含有'北京'或'南京'的
(16)'{t}' 匹配前面的字符t次
select 'ababc' regexp '^(ab){2}c$'; #為1 select 'ababc' regexp '^ab{2}c$'; #為0,因為'b'沒有出現2次 select 'abbbc' regexp '^ab{3}c$'; #為1
(17)'{t,s}'匹配前面的字符t-s次均可,t<=s
select 'abbbc' regexp '^ab{2,4}c$'; #為1,因為'b'出現3次 select 'abc' regexp '^ab{2,4}c$'; #為0,因為'b'出現1次,不在2-4之間 select 'abbbbbbc' regexp '^ab{1,}c$'; #為1,{1,}缺省,表示出現1次及以上
(18){t,s}中不能出現空格,否則報錯:[Err] 3692 - Incorrect description of a {min,max} interval.
select 'aoe' regexp '^ao{0 , 1}c$'; # [Err] 3692 - Incorrect description of a {min,max} interval.
#歡迎交流
參考:
https://www.cnblogs.com/liuwei6/p/7279542.html
https://blog.csdn.net/a1311010193/article/details/101388446
https://www.runoob.com/mysql/mysql-regexp.html
