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 程序使用 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/Python 的 execute() 函数执行 "SELECT" 语句 −
sql = "SELECT * FROM person_tbl WHERE NAME NOT REGEXP '^sa'" cursorObj.execute(sql)
示例
以下是相应的程序 −
$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')