1、LIKE 子句
用于进行字符串模糊匹配的操作符,通常与通配符配合在 WHERE 子句中使用。
通过指定匹配规则来筛选符合条件的数据记录。
语法:
SELECT 列名 FROM 表名 WHERE 列名 LIKE '模式';
-
%:匹配任意长度的字符序列(包括空序列),如LIKE 'N%'可筛选以 N 开头的字符串 前缀匹配 -
_:匹配任意单个字符,如LIKE '_am'可以匹配 "Tam"、"Mam" 等,精确位置匹配 []:用于匹配指定范围内的单个字符,例如LIKE '[A-C]%'会匹配以 A、B 或 C 开头的字符串
例子:
使用 % 通配符
-- 匹配以 'John' 开头的所有名字 SELECT * FROM users WHERE name LIKE 'John%'; -- 匹配: John, Johnny, Johnson -- 不匹配: MrJohn, ajohn-- 匹配以 'son' 结尾的所有名字 SELECT * FROM users WHERE name LIKE '%son'; -- 匹配: Johnson, Jackson, Wilson -- 不匹配: sonny, Andersonx-- 匹配包含 'admin' 的所有字符串 SELECT * FROM users WHERE role LIKE '%admin%'; -- 匹配: admin, administrator, sysadmin, admin_user-- 匹配以 'A' 开头,以 'Z' 结尾的字符串 SELECT * FROM products WHERE name LIKE 'A%Z'; -- 匹配: AMAZ, A123Z, AQuickZ -- 不匹配: AZB, A Z, A_-- 匹配包含 'data' 且以 'base' 结尾 SELECT * FROM systems WHERE name LIKE '%data%base'; -- 匹配: database, mydatabase, databasenamebase
使用 _ 通配符
-- 匹配正好5个字符的名字 SELECT * FROM users WHERE name LIKE '_____'; -- 匹配: Alice, Bob12, User1 -- 不匹配: Al, Bob, User123-- 匹配第二个字符是 'o' 的所有名字 SELECT * FROM users WHERE name LIKE '_o%'; -- 匹配: John, Robert, coding -- 不匹配: Bob, admin, root-- 匹配第一个字符任意,后面是 'at' 的所有单词 SELECT * FROM words WHERE word LIKE '_at'; -- 匹配: cat, bat, hat, rat -- 不匹配: at, chat, batch-- 复杂的模式匹配 SELECT * FROM products WHERE code LIKE 'A_B_C%'; -- 匹配: A1B2C3, AxByCzProduct, A-B-C-D -- 不匹配: ABC, A_B_C, A1C2B3
复杂模式匹配
-- 匹配以 'user' 开头,后面跟一个数字,然后任意字符 SELECT * FROM accounts WHERE username LIKE 'user_%'; -- 匹配: user1, user2admin, user_test -- 不匹配: user, users, adminuser1-- 匹配包含数字的电子邮件 SELECT * FROM users WHERE email LIKE '%[0-9]%@%'; -- 匹配: user123@gmail.com, john2023@company.com -- 不匹配: john@gmail.com, admin@test.org-- 匹配特定格式的电话号码 SELECT * FROM contacts WHERE phone LIKE '+1-___-___-____'; -- 匹配: +1-123-456-7890, +1-555-123-4567 -- 不匹配: 123-456-7890, +1-12-345-6789-- 匹配文件扩展名 SELECT * FROM files WHERE filename LIKE '%.pdf' OR filename LIKE '%.doc%'; -- 匹配: document.pdf, manual.doc, guide.docx -- 不匹配: image.png, data.txt
2、NOT LIKE 字句
排除特定模式
-- 排除所有以 'test' 开头的用户 SELECT * FROM users WHERE username NOT LIKE 'test%';-- 排除包含 'admin' 的角色 SELECT * FROM users WHERE role NOT LIKE '%admin%';-- 排除单个字符的缩写 SELECT * FROM products WHERE code NOT LIKE '_';-- 排除临时文件(以 ~ 或 .tmp 结尾) SELECT * FROM documents WHERE filename NOT LIKE '%~' AND filename NOT LIKE '%.tmp';-- 复杂的排除逻辑 SELECT * FROM logs WHERE message NOT LIKE '%ERROR%' AND message NOT LIKE '%FAILED%'AND message NOT LIKE '%CRITICAL%';