MySQL NOT REGEXP 操作符怎么用?不匹配正则表达式查询数据

文章导读
上一个 测验 下一个 MySQL NOT REGEXP 操作符 技术上,正则表达式被定义为表示输入文本中模式的字符序列。它用于使用某些模式定位或替换文本字符串;这种模式可以是单个字符、多个字符或单词等。
📋 目录
  1. MySQL NOT REGEXP 操作符
  2. 使用客户端程序的 NOT REGEXP 操作符
A A

MySQL - NOT REGEXP 操作符

目录
  • MySQL NOT REGEXP 操作符
  • 使用客户端程序的 NOT REGEXP 操作符


上一个
测验
下一个

MySQL NOT REGEXP 操作符

技术上,正则表达式被定义为表示输入文本中模式的字符序列。它用于使用某些模式定位或替换文本字符串;这种模式可以是单个字符、多个字符或单词等。

在 MySQL 中,REGEXP 操作符是一个强大的工具,用于在数据库中执行复杂的搜索操作,通过正则表达式检索所需数据。而且与 LIKE 操作符不同,REGEXP 操作符不受搜索模式(如 % 和 _)的限制,因为它使用其他多个元字符来扩展模式匹配时的灵活性和控制。

NOT REGEXP 操作符是对 REGEXP 操作符的否定。它用于检索数据库中不满足指定模式的所有记录。在本章中,我们将详细学习这个操作符。

语法

以下是 MySQL NOT REGEXP 操作符的基本语法 −

expression NOT REGEXP pattern

注意 − 由于这只是一个否定,NOT REGEXP 操作符的功能与 REGEXP 操作符相同。

示例

让我们使用以下查询创建一个名为 CUSTOMERS 的表 −

CREATE TABLE CUSTOMERS (
   ID INT AUTO_INCREMENT,
   NAME VARCHAR(20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),
   PRIMARY KEY (ID)
);

下面的 INSERT 语句向上面创建的表中插入 7 条记录 −

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES 
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(2, 'Khilan', 25, 'Delhi', 1500.00 ),
(3, 'Kaushik', 23, 'Kota', 2000.00 ),
(4, 'Chaitali', 25, 'Mumbai', 6500.00 ),
(5, 'Hardik', 27, 'Bhopal', 8500.00 ),
(6, 'Komal', 22, 'Hyderabad', 4500.00 ),
(7, 'Muffy', 24, 'Indore', 10000.00 );

执行以下查询以显示 CUSTOMERS 表中的所有记录 −

Select * from CUSTOMERS;

以下是 CUSTOMERS 表 −

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

现在,让我们使用几个查询在这个表上展示 NOT REGEXP 操作符的使用。

查找所有不以 'ra' 开头的姓名 −

SELECT * FROM CUSTOMERS WHERE NAME NOT REGEXP '^ra';

以下是输出 −

ID NAME AGE ADDRESS SALARY
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

检索所有姓名不以 'ik' 结尾的记录 −

SELECT * FROM CUSTOMERS WHERE NAME NOT REGEXP 'ik$';

以下是输出 −

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
4 Chaitali 25 Mumbai 6500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

以下是查找所有不包含 'an' 的姓名的查询 −

SELECT * FROM CUSTOMERS WHERE NAME NOT REGEXP 'an';

以下是输出 −

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

示例

NOT RLIKE 是 MySQL 中 NOT REGEXP 的替代语法。两个操作符的结果相同。如果前两个操作数中的任何一个为 NULL,则该操作符返回 NULL。

在下面的查询中,字符串值为 NULL。因此输出为 NULL。

SELECT NULL NOT RLIKE 'value';

以下是输出 −

NULL NOT RLIKE 'value'
NULL

这里,指定的模式为 NULL。因此,输出将检索为 NULL。

SELECT '' NOT REGEXP NULL;

以下是输出 −

NULL NOT RLIKE 'value'
NULL

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

除了使用 MySQL 查询执行 NOT REGEXP 操作符外,我们还可以使用 PHP、Node.js、Java 和 Python 等客户端程序来实现相同的结果。

语法

以下是各种编程语言中该操作的语法 −

PHP NodeJS Java Python

要通过 PHP 程序使用 MySQL 查询检索数据库中不满足指定模式的所有记录,我们需要使用 mysqli 函数 query() 执行 "SELECT" 语句,如下所示 −

$sql = "SELECT * FROM person_tbl WHERE NAME NOT REGEXP '^sa'";
$mysqli->query($sql);

要通过 Node.js 程序使用 MySQL 查询检索数据库中不满足指定模式的所有记录,我们需要使用 mysql2 库的 query() 函数执行 "SELECT" 语句,如下所示 −

sql = "SELECT * FROM person_tbl WHERE NAME NOT REGEXP '^sa'";
con.query(sql);

要通过 Java 程序使用 MySQL 查询检索数据库中不满足指定模式的所有记录,我们需要使用 JDBC 函数 executeUpdate() 执行 "SELECT" 语句 −

String sql = "SELECT * FROM person_tbl WHERE NAME NOT REGEXP '^sa'";
statement.executeQuery(sql);

要通过 Python 程序使用 MySQL 查询检索数据库中不满足指定模式的所有记录,我们需要使用 MySQL Connector/Pythonexecute() 函数执行 "SELECT" 语句 −

sql = "SELECT * FROM person_tbl WHERE NAME NOT REGEXP '^sa'" 
cursorObj.execute(sql)

示例

以下是相应的程序 −

PHP NodeJS Java Python
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'password';
$db = 'TUTORIALS';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $db);
if ($mysqli->connect_errno) {
    printf("Connect failed: %s
", $mysqli->connect_error); exit(); } //printf('Connected successfully.
'); $sql = "SELECT * FROM person_tbl WHERE NAME NOT REGEXP '^sa'"; if($result = $mysqli->query($sql)){ printf("表记录(姓名不以 'sa' 开头的):\n"); while($row = mysqli_fetch_array($result)){ printf("ID %d, Name %s, Age %d, Address %s", $row['ID'], $row['NAME'], $row['AGE'], $row['ADDRESS'],); printf("\n"); } } if($mysqli->error){ printf("错误信息:", $mysqli->error); } $mysqli->close();

输出

得到的输出如下所示 −

表记录(姓名不以 'sa' 开头的):
ID 1, Name John, Age 33, Address New York
ID 2, Name Ram, Age 29, Address Pune
ID 4, Name Tanya, Age 26, Address Paris
ID 5, Name Anmol, Age 28, Address Surat
ID 6, Name Ramesh, Age 40, Address Mumbai      
var mysql = require('mysql2');
var con = mysql.createConnection({
host:"localhost",
user:"root",
password:"password"
});
 //连接到 MySQL
 con.connect(function(err) {
 if (err) throw err;
  //console.log("Connected successfully...!");
  //console.log("--------------------------");
 sql = "USE TUTORIALS";
 con.query(sql);
 sql = "SELECT * FROM person_tbl WHERE NAME NOT REGEXP '^sa'";
 console.log("SELECT 查询执行成功..!");
 console.log("表记录:");
 con.query(sql);
 con.query(sql, function(err, result){
 if (err) throw err;
 console.log(result);
 });
});    

输出

产生的输出如下所示 −

SELECT 查询执行成功..!
表记录:
[
  { ID: 1, NAME: 'John', AGE: 33, ADDRESS: 'New York' },
  { ID: 2, NAME: 'Ram', AGE: 29, ADDRESS: 'Pune' },
  { ID: 4, NAME: 'Tanya', AGE: 26, ADDRESS: 'Paris' },
  { ID: 5, NAME: 'Anmol', AGE: 28, ADDRESS: 'Surat' },
  { ID: 6, NAME: 'Ramesh', AGE: 40, ADDRESS: 'Mumbai' }
]    
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class regexp_not {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/TUTORIALS";
        String user = "root";
        String password = "password";
        ResultSet rs;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            Connection con = DriverManager.getConnection(url, user, password);
            Statement st = con.createStatement();
            //System.out.println("Database connected successfully...!");
            String sql = "SELECT * FROM person_tbl WHERE NAME NOT REGEXP '^sa'";
            rs = st.executeQuery(sql);
            System.out.println("表记录:");
            while(rs.next()) {
                String id = rs.getString("id");
                String name = rs.getString("Name");
                String age = rs.getString("AGE");
                String address = rs.getString("ADDRESS");
                System.out.println("Id: " + id + ", Name: " + name + ", Age: " + age + ", Address: " + address);
            }
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
}          

输出

得到的输出如下所示 −

表记录:
Id: 1, Name: John, Age: 33, Address: New York
Id: 2, Name: Ram, Age: 29, Address: Pune
Id: 4, Name: Tanya, Age: 26, Address: Paris
Id: 5, Name: Anmol, Age: 28, Address: Surat
Id: 6, Name: Ramesh, Age: 40, Address: Mumbai
import mysql.connector
#建立连接
connection = mysql.connector.connect(
   host='localhost',
   user='root',
   password='password',
   database='tut'
)
#创建游标对象 
cursorObj = connection.cursor()
notregexp_operator_query = f"SELECT * FROM person_tbl WHERE NAME NOT REGEXP '^sa'"
cursorObj.execute(notregexp_operator_query)
# 获取所有结果
results = cursorObj.fetchall()
# 显示结果
print("使用 NOT REGEXP 查找姓名不以 'sa' 开头的人员:")
for row in results:
    print(row)
cursorObj.close()
connection.close()    

输出

上述代码的输出如下所示 −

使用 NOT REGEXP 查找姓名不以 'sa' 开头的人员:
(1, 'John', 33, 'New York')
(2, 'Ram', 29, 'Pune')
(4, 'Tanya', 26, 'Paris')
(5, 'Anmol', 28, 'Surat')
(6, 'Ramesh', 40, 'Mumbai')