Skip to content

MySQL - LIKE 运算符

MySQL: 用于模式匹配的 LIKE 运算符

Section titled “MySQL: 用于模式匹配的 LIKE 运算符”

MySQL 中的 LIKE 运算符是一个强大的工具,用于在 WHERE 子句中搜索字符串列中指定的模式。虽然简单的 = 运算符查找精确匹配,但 LIKE 允许使用通配符进行灵活搜索。

SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern;

MySQL 的 LIKE 运算符支持两种主要的通配符字符:

WildcardDescription
%百分号表示零个、一个或多个字符。
_下划线表示正好一个字符。
**重要提示:** 与其他一些 SQL 方言不同,标准的 MySQL `LIKE` 运算符不支持方括号样式的通配符,如 `[abc]` 或 `[^abc]`。为了实现那种级别的模式匹配,您应该使用 MySQL 的正则表达式函数,例如 `REGEXP_LIKE()`。

让我们使用前一章节中的 employees 表。如果您没有该表,可以使用此脚本创建并填充它:

-- 创建 employees 表
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
department VARCHAR(50),
salary DECIMAL(10, 2)
);
-- 插入示例数据
INSERT INTO employees (first_name, last_name) VALUES
('Ayla', 'Chen'), ('Ben', 'Carter'), ('Chloe', 'Davis'),
('David', 'Miller'), ('Jon', 'Smith'), ('Jen', 'Wilson');

查找所有名字以 ‘Be’ 开头的员工:

SELECT first_name, last_name FROM employees WHERE first_name LIKE 'Be%';
first_namelast_name
BenCarter

查找所有姓氏以 ‘er’ 结尾的员工:

SELECT first_name, last_name FROM employees WHERE last_name LIKE '%er';
first_namelast_name
BenCarter
DavidMiller

查找所有姓氏包含 ‘is’ 的员工:

SELECT first_name, last_name FROM employees WHERE last_name LIKE '%is%';
first_namelast_name
ChloeDavis

查找所有名字为三个字母长,并且以 ‘J’ 开头以 ‘n’ 结尾的员工:

SELECT first_name, last_name FROM employees WHERE first_name LIKE 'J_n';
first_namelast_name
JonSmith
JenWilson

您可以使用 NOT 运算符来查找与模式不匹配的行。例如,查找所有名字不以 ‘J’ 开头的员工:

SELECT first_name, last_name FROM employees WHERE first_name NOT LIKE 'J%';

如果您需要搜索数据中字面上的 ’%’ 或 ’_’ 怎么办?您可以使用 ESCAPE 子句来指定一个转义字符。在模式中紧跟转义字符的字符将被视为字面字符。

-- 假设有一个名为 'products' 的表,其中包含 'discount_code' 列
-- 要查找字面包含 '50%' 的代码,我们可以这样做:
SELECT product_name FROM products WHERE discount_code LIKE '%50\%%' ESCAPE '\';

数据库索引可以极大地加快查询速度。然而,LIKE 查询只有在模式不以通配符开头时才能有效地使用索引。

  • 好(可以使用索引): WHERE name LIKE 'Smith%'
  • 差(不能使用索引,需要全表扫描): WHERE name LIKE '%Smith%'

对于大型文本字段的全文搜索功能,请考虑使用 MySQL 的全文搜索函数而不是 LIKE。

对于更复杂的模式匹配需求,MySQL 8.0+ 提供了 REGEXP_LIKE() 函数,它使用强大的正则表达式。

-- 查找姓氏以 C 或 D 开头的员工
SELECT first_name, last_name
FROM employees
WHERE REGEXP_LIKE(last_name, '^[CD]'); -- '^' 表示字符串开头,[CD] 表示 C 或 D

输出:

first_namelast_name
AylaChen
BenCarter
ChloeDavis

在应用程序中使用 LIKE(Python 示例)

Section titled “在应用程序中使用 LIKE(Python 示例)”

当 LIKE 与用户输入一起使用时,使用预处理语句对于防止 SQL 注入至关重要。这是一个用于构建简单员工搜索功能的 Python 示例。

import mysql.connector
import os
from dotenv import load_dotenv
load_dotenv()
def search_employees_by_last_name(search_term):
"""根据姓氏搜索包含给定搜索词的员工。"""
results = []
try:
with mysql.connector.connect(
host=os.getenv('DB_HOST'),
user=os.getenv('DB_USER'),
password=os.getenv('DB_PASSWORD'),
database=os.getenv('DB_NAME')
) as conn:
with conn.cursor(dictionary=True) as cursor:
# 模式被构建以查找包含搜索词的任何匹配项
pattern = f"%{search_term}%"
query = "SELECT id, first_name, last_name FROM employees WHERE last_name LIKE %s"
# 将模式作为参数传递
cursor.execute(query, (pattern,))
results = cursor.fetchall()
except mysql.connector.Error as e:
print(f"数据库错误: {e}")
return None
return results
if __name__ == "__main__":
user_search = 'er' # 模拟用户输入
employees_found = search_employees_by_last_name(user_search)
if employees_found is not None:
print(f"找到 {len(employees_found)} 名员工匹配 '{user_search}':")
for emp in employees_found:
print(f"- ID: {emp['id']}, 姓名: {emp['first_name']} {emp['last_name']}")