MySQL - NOT REGEXP 操作符

NOT REGEXP 简介

你好,有抱负的数据库爱好者们!今天,我们将深入探索 MySQL 的 NOT REGEXP 操作符的奇妙世界。作为你友好邻里的计算机老师,我在这里用我第一次学习这个话题时的同样激动的心情来引导你。相信我,到了这节课的结尾,你会像数据库巫师一样熟练地使用这个强大的工具!

MySQL - NOT REGEXP Operator

什么是 NOT REGEXP?

在我们深入细节之前,让我们先理解 NOT REGEXP 实际上是什么。简单来说,NOT REGEXP 就像一家高级俱乐部的保镖,但它不是让人进去,而是把某些模式排除在我们的搜索结果之外。

REGEXP 代表正则表达式,这是一系列字符,形成了一个搜索模式。当我们在这个前面加上 NOT,我们实际上是在说:“嘿,MySQL,给我展示所有不匹配这个模式的条目!”

MySQL NOT REGEXP 操作符实战

让我们卷起袖子看看这在实践中是如何工作的。想象我们有一个名为 book_club 的表,其中有一个列 book_title。我们想找到所有标题中没有单词 "mystery" 的书籍。

SELECT book_title
FROM book_club
WHERE book_title NOT REGEXP 'mystery';

在这个例子中,MySQL 将返回所有不包含单词 "mystery" 的书名。这就像问你的图书管理员要所有不是神秘小说的书籍——相当酷,对吧?

大小写敏感性

有一点需要注意的是,默认情况下,REGEXP(和 NOT REGEXP)是不区分大小写的。所以 'mystery'、'Mystery',甚至是 'mYsTeRy' 都会在我们之前的例子中被排除。如果你想让它区分大小写,你可以使用 BINARY 关键字:

SELECT book_title
FROM book_club
WHERE book_title NOT REGEXP BINARY 'mystery';

现在,只有 'mystery'(全部小写)会被排除,但 'Mystery' 或 'MYSTERY' 仍然会出现在我们的结果中。

高级 NOT REGEXP 模式

让我们提升一下难度,看看一些更复杂的模式。记住,NOT REGEXP 是非常灵活多变的!

排除多个单词

如果我们想排除标题中包含 "mystery" 或 "thriller" 的书籍呢?

SELECT book_title
FROM book_club
WHERE book_title NOT REGEXP 'mystery|thriller';

| 符号起着 "或" 操作符的作用。这个查询将返回所有标题中不包含 "mystery" 或 "thriller" 的书籍。

排除开头或结尾的单词

也许我们想找到所有不是以 "The" 开头的书籍:

SELECT book_title
FROM book_club
WHERE book_title NOT REGEXP '^The';

^ 符号将模式锚定在字符串的开始。类似地,如果我们想找不以 "Chronicles" 结尾的书籍,我们可以使用:

SELECT book_title
FROM book_club
WHERE book_title NOT REGEXP 'Chronicles$';

$ 符号将模式锚定在字符串的结尾。

在客户端程序中使用 NOT REGEXP 操作符

现在,让我们看看如何在客户端程序中使用 NOT REGEXP。我将使用 Python 和 MySQL 连接器库作为例子,但其他语言的概念是类似的。

import mysql.connector

# 建立连接
mydb = mysql.connector.connect(
host="localhost",
user="yourusername",
password="yourpassword",
database="book_club_db"
)

mycursor = mydb.cursor()

# 执行 NOT REGEXP 查询
mycursor.execute("SELECT book_title FROM book_club WHERE book_title NOT REGEXP 'fantasy|sci-fi'")

# 获取并打印结果
for x in mycursor:
print(x)

这个脚本连接到我们的数据库,运行一个查询来找到所有标题中不包含 "fantasy" 或 "sci-fi" 的书籍,然后打印结果。

常见的 NOT REGEXP 模式

让我们看看一些你可能发现有用的常见模式:

模式 描述 示例
[^...] 匹配不在括号中的任何字符 '[^aeiou]' 匹配任何非元音字母
.* 匹配任何字符序列 'not.*end' 匹配包含 "not" 和 "end" 且中间有任何字符的字符串
\d 匹配任何数字 '\d' 匹配任何单个数字
\D 匹配任何非数字 '\D' 匹配任何单个非数字字符
\s 匹配任何空白字符 '\s' 匹配空格、制表符、换行符
\S 匹配任何非空白字符 '\S' 匹配任何不是空格、制表符或换行符的字符

结论

就这样,未来的数据库大师们!我们已经探索了 NOT REGEXP 操作符,从它的基本用法到更高级的模式。记住,像任何强大的工具一样,它需要练习才能掌握。不要害怕尝试不同的模式并看看你得到的结果。

在我多年的教学过程中,我看到了学生从对 NOT REGEXP 摸不着头脑到在复杂查询中轻松使用它的转变。你们正走在加入他们行列的路上!

在我离开之前,这里有一点数据库幽默给你们:为什么开发者辞职了?因为他无法 TABLE 关于他薪水的讨论!(明白了吗?TABLE?好吧,我自己出去好了...)

继续练习,保持好奇心,快乐地查询!

Credits: Image by storyset