Skip to content

MySQL - NOT LIKE 运算符

本教程解释了如何在 MySQL 中使用 `NOT LIKE` 运算符来过滤不匹配指定字符串模式的数据。我们将涵盖其语法、通配符的使用以及与其他逻辑运算符的组合。您还将学习如何在客户端应用程序中安全地使用它。

NOT LIKE 运算符是 LIKE 运算符的逻辑非。LIKE 用于查找匹配特定模式的行,而 NOT LIKE 则用于查找所有不匹配该模式的行。它对于基于排除的过滤至关重要。

与其对应物一样,NOT LIKE 依赖于通配符(wildcard characters)来定义匹配模式。

SELECT column1, column2, ...
FROM table_name
WHERE column_name NOT LIKE 'pattern';

NOT LIKE 的强大之处来自于这两个标准 SQL 通配符:

通配符描述
%百分号代表零个、一个或多个字符。
_下划线代表正好一个字符。

关于高级模式的说明: 对于更复杂的模式匹配,例如字符范围或重复,MySQL 的正则表达式运算符(REGEXP 或 RLIKE,以及它们的否定形式 NOT REGEXP / NOT RLIKE)功能更强大,更灵活。

让我们在示例中使用 CUSTOMERS 表。

-- 假设 CUSTOMERS 表已按之前的教程创建并填充数据。
SELECT * FROM CUSTOMERS;
IDNAMEAGEADDRESSSALARY
1Ramesh32Ahmedabad2000.00
2Khilan25Delhi1500.00
3Kaushik23Kota2000.00
4Chaitali25Mumbai6500.00
5Hardik27Bhopal8500.00
6Komal22Hyderabad4500.00
7Muffy24Indore10000.00

要查找所有名字不以字母 ‘K’ 开头的客户:

SELECT * FROM CUSTOMERS WHERE NAME NOT LIKE 'K%';

这将排除 ‘Khilan’、‘Kaushik’ 和 ‘Komal’。

要查找所有地址不以 ‘bad’ 结尾的客户:

SELECT * FROM CUSTOMERS WHERE ADDRESS NOT LIKE '%bad';

这将排除 ‘Ahmedabad’ 和 ‘Hyderabad’。

要查找所有名字不包含子字符串 ‘al’ 的客户:

SELECT * FROM CUSTOMERS WHERE NAME NOT LIKE '%al%';

这将排除 ‘Chaitali’ 和 ‘Komal’。

要查找所有地址的第二个字母不是 ‘o’ 的客户:

SELECT * FROM CUSTOMERS WHERE ADDRESS NOT LIKE '_o%';

这将排除 ‘Kota’、‘Bhopal’ 和 ‘Komal’(地址 ‘Hyderabad’)。

您可以通过将 NOT LIKE 与 AND 和 OR 等其他运算符结合使用来创建更复杂的过滤逻辑。

让我们查找名字不以 ‘K’ 开头且地址不以 ‘M’ 开头的客户。

SELECT * FROM CUSTOMERS
WHERE NAME NOT LIKE 'K%'
AND ADDRESS NOT LIKE 'M%';

此查询首先过滤掉所有以 ‘K’ 开头的名字,然后从该结果中进一步过滤掉所有以 ‘M’ 开头的地址。

您也可以在不带 FROM 子句的 SELECT 语句中使用 NOT LIKE 来直接测试模式。如果模式不匹配,它返回 1(真);如果匹配,则返回 0(假);如果任一操作数为 NULL,则返回 NULL。

SELECT 'Hello World' NOT LIKE 'Hello%'; -- Result: 0 (because it does match)
SELECT 'Hello World' NOT LIKE 'Bye%'; -- Result: 1 (because it does not match)
SELECT 'Hello World' NOT LIKE NULL; -- Result: NULL

当从应用程序中使用 NOT LIKE 时,请务必使用预处理语句安全地传递模式,特别是当它包含用户提供的数据时。这可以防止 SQL 注入。

require('dotenv').config();
const mysql = require('mysql2/promise');
async function findCustomers(namePattern) {
let connection;
try {
connection = await mysql.createConnection(process.env.DATABASE_URL || 'mysql://root:password@localhost/your_database');
const query = 'SELECT ID, NAME FROM CUSTOMERS WHERE NAME NOT LIKE ?';
const [rows] = await connection.execute(query, [namePattern]);
console.log(`Customers whose name does NOT match '${namePattern}':`);
console.log(rows);
} catch (error) {
console.error('Database query failed:', error.message);
} finally {
if (connection) await connection.end();
}
}
// Find customers whose names do not start with 'K'
findCustomers('K%');
import mysql.connector
import os
def find_customers(name_pattern):
connection = None
try:
connection = mysql.connector.connect(
host=os.getenv('DB_HOST', 'localhost'),
user=os.getenv('DB_USER', 'root'),
password=os.getenv('DB_PASSWORD', 'password'),
database=os.getenv('DB_NAME', 'your_database')
)
cursor = connection.cursor(dictionary=True)
query = "SELECT ID, NAME FROM CUSTOMERS WHERE NAME NOT LIKE %s"
cursor.execute(query, (name_pattern,))
results = cursor.fetchall()
print(f"Customers whose name does NOT match '{name_pattern}':")
for row in results:
print(row)
except mysql.connector.Error as err:
print(f"Database error: {err}")
finally:
if connection and connection.is_connected():
cursor.close()
connection.close()
# Find customers whose names do not end with 'h'
find_customers('%h')
<?php
function findCustomers(string $namePattern): void
{
$dsn = sprintf("mysql:host=%s;dbname=%s;charset=utf8mb4",
$_ENV['DB_HOST'] ?? 'localhost',
$_ENV['DB_NAME'] ?? 'your_database'
);
$options = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC];
try {
$pdo = new PDO($dsn, $_ENV['DB_USER'] ?? 'root', $_ENV['DB_PASSWORD'] ?? 'password', $options);
$stmt = $pdo->prepare('SELECT ID, NAME FROM CUSTOMERS WHERE NAME NOT LIKE :pattern');
$stmt->execute(['pattern' => $namePattern]);
$results = $stmt->fetchAll();
echo "Customers whose name does NOT match '{$namePattern}':\n";
print_r($results);
} catch (\PDOException $e) {
error_log($e->getMessage());
echo "An error occurred.\n";
}
}
// Find customers whose name does not contain 'a'
findCustomers('%a%');