MySQL - LIKE 运算符
MySQL: 用于模式匹配的 LIKE 运算符
Section titled “MySQL: 用于模式匹配的 LIKE 运算符”MySQL 中的 LIKE 运算符是一个强大的工具,用于在 WHERE 子句中搜索字符串列中指定的模式。虽然简单的 = 运算符查找精确匹配,但 LIKE 允许使用通配符进行灵活搜索。
SELECT column_name(s)FROM table_nameWHERE column_name LIKE pattern;LIKE 通配符
Section titled “LIKE 通配符”MySQL 的 LIKE 运算符支持两种主要的通配符字符:
| Wildcard | Description |
|---|---|
| % | 百分号表示零个、一个或多个字符。 |
| _ | 下划线表示正好一个字符。 |
**重要提示:** 与其他一些 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');1. 模式在末尾 (%)
Section titled “1. 模式在末尾 (%)”查找所有名字以 ‘Be’ 开头的员工:
SELECT first_name, last_name FROM employees WHERE first_name LIKE 'Be%';| first_name | last_name |
|---|---|
| Ben | Carter |
2. 模式在开头 (%)
Section titled “2. 模式在开头 (%)”查找所有姓氏以 ‘er’ 结尾的员工:
SELECT first_name, last_name FROM employees WHERE last_name LIKE '%er';| first_name | last_name |
|---|---|
| Ben | Carter |
| David | Miller |
3. 模式在中间 (%)
Section titled “3. 模式在中间 (%)”查找所有姓氏包含 ‘is’ 的员工:
SELECT first_name, last_name FROM employees WHERE last_name LIKE '%is%';| first_name | last_name |
|---|---|
| Chloe | Davis |
4. 单字符通配符 (_)
Section titled “4. 单字符通配符 (_)”查找所有名字为三个字母长,并且以 ‘J’ 开头以 ‘n’ 结尾的员工:
SELECT first_name, last_name FROM employees WHERE first_name LIKE 'J_n';| first_name | last_name |
|---|---|
| Jon | Smith |
| Jen | Wilson |
使用 NOT LIKE
Section titled “使用 NOT LIKE”您可以使用 NOT 运算符来查找与模式不匹配的行。例如,查找所有名字不以 ‘J’ 开头的员工:
SELECT first_name, last_name FROM employees WHERE first_name NOT LIKE 'J%';搜索通配符字符
Section titled “搜索通配符字符”如果您需要搜索数据中字面上的 ’%’ 或 ’_’ 怎么办?您可以使用 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。
使用 REGEXP_LIKE() 进行高级匹配
Section titled “使用 REGEXP_LIKE() 进行高级匹配”对于更复杂的模式匹配需求,MySQL 8.0+ 提供了 REGEXP_LIKE() 函数,它使用强大的正则表达式。
-- 查找姓氏以 C 或 D 开头的员工SELECT first_name, last_nameFROM employeesWHERE REGEXP_LIKE(last_name, '^[CD]'); -- '^' 表示字符串开头,[CD] 表示 C 或 D输出:
| first_name | last_name |
|---|---|
| Ayla | Chen |
| Ben | Carter |
| Chloe | Davis |
在应用程序中使用 LIKE(Python 示例)
Section titled “在应用程序中使用 LIKE(Python 示例)”当 LIKE 与用户输入一起使用时,使用预处理语句对于防止 SQL 注入至关重要。这是一个用于构建简单员工搜索功能的 Python 示例。
import mysql.connectorimport osfrom 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']}")