Skip to content

mysql模糊匹配

580字约2分钟

mysqlmysql模糊匹配like

2024-12-12

mysql模糊匹配 LIKE 、 RLIKE(或 REGEXP)、 INSTR 函数

like 模糊匹配

LIKE 操作符是最常用的模糊匹配方式,它允许使用通配符 % 和 _ 来匹配字符串中的任意字符。

  • %:代表零个、一个或多个任意字符。
  • _:代表单个任意字符。 示例

提示

SELECT * FROM users WHERE name LIKE '张%'; -- 匹配所有以 "张" 开头的名字
SELECT * FROM users WHERE name LIKE '_伟%'; -- 匹配所有第二个字为 "伟" 的名字

可以使用concat()函数将多个字段拼接成一个字符串进行模糊匹配

提示

SELECT * FROM users WHERE concat(fristname, secondname) LIKE '%张%'; -- 匹配所有包含 "张" 的名字和年龄

使用 RLIKE 或 REGEXP 进行正则表达式匹配

RLIKE 或 REGEXP 操作符可以用来执行正则表达式匹配,它们支持使用正则表达式中的特殊字符和运算符来匹配字符串。

提示

SELECT * FROM users WHERE name RLIKE '^[A-Z]'; -- 匹配所有以大写字母开头的名字
SELECT * FROM users WHERE name REGEXP '[0-9]+'; -- 匹配所有包含至少一个数字的字符串

使用 INSTR 函数进行字符串位置匹配

INSTR 函数用于返回子串在字符串中第一次出现的位置。如果子串不存在,则返回 0。因此,虽然它不是严格意义上的模糊匹配工具,但它可以用来检查一个字符串是否包含另一个字符串,从而实现类似的效果。

提示

SELECT * FROM users WHERE INSTR(name, '') > 0; -- 匹配所有包含 "张" 的名字
SELECT * FROM users WHERE INSTR(name, '') = 3; -- 匹配所有以 "张" 开头的名字

总结

-- 创建测试表
CREATE TABLE IF NOT EXISTS test_data (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    random_data VARCHAR(255),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

-- 插入一百万条数据的存储过程
-- 最终插入了17万条数据
DELIMITER //
CREATE PROCEDURE InsertTestData()
BEGIN
    DECLARE i INT DEFAULT 0;
    WHILE i < 1000000 DO
        INSERT INTO test_data (random_data) VALUES (CONCAT('Data ', i));
        SET i = i + 1;
    END WHILE;
END//
DELIMITER ;

-- 调用存储过程开始插入数据
CALL InsertTestData();
SELECT * FROM test_data WHERE random_data LIKE 'Data_01%';
SELECT * FROM test_data WHERE random_data REGEXP '^Data_01%';
SELECT * FROM test_data WHERE INSTR(random_data, '01') > 0;

总结

提示

instr 函数效率最高,like、regexp 这俩 没测出来