Skip to content

MySQL - OR 运算符

MySQL 的 OR 运算符是一个逻辑运算符,用于组合两个或多个布尔条件。如果至少一个条件为真,它将返回真(在 MySQL 中表示为 1)。只有当所有条件都为假时,它才返回假(0)。

  • 如果 A 为真 OR B 为真,则结果为真 (1)。
  • 如果 A 为假 OR B 为假,则结果为假 (0)。
  • 如果条件为 NULL,结果取决于其他条件。true OR NULL 为 true,而 false OR NULL 为 NULL。

下表展示了 OR 运算符的行为:

ABA OR B
真 (1)真 (1)真 (1)
真 (1)假 (0)真 (1)
假 (0)真 (1)真 (1)
假 (0)假 (0)假 (0)
真 (1)NULL真 (1)
假 (0)NULLNULL
NULLNULLNULL

OR 运算符最常见的用法是在 WHERE 子句中,用于检索符合多个条件中至少一个条件的行。

首先,我们创建一个示例 CUSTOMERS 表。

CREATE TABLE CUSTOMERS(
ID INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(50) NOT NULL,
AGE INT NOT NULL,
ADDRESS VARCHAR(100),
SALARY DECIMAL(10, 2)
);
INSERT INTO CUSTOMERS(NAME, AGE, ADDRESS, SALARY) VALUES
('Ramesh', 32, 'Ahmedabad', 2000.00),
('Khilan', 25, 'Delhi', 1500.00),
('Kaushik', 23, 'Kota', 2000.00),
('Chaitali', 25, 'Mumbai', 6500.00),
('Hardik', 27, 'Bhopal', 8500.00),
('Komal', 22, 'Hyderabad', 4500.00);

现在,让我们查询那些来自 ‘Delhi’ 或薪水高于 6000 的客户。

SELECT ID, NAME, ADDRESS, SALARY
FROM CUSTOMERS
WHERE ADDRESS = 'Delhi' OR SALARY > 6000;
IDNAMEADDRESSSALARY
2KhilanDelhi1500.00
4ChaitaliMumbai6500.00
5HardikBhopal8500.00

一个常见的错误源是忘记 AND 运算符的优先级高于 OR。这意味着 AND 条件会在 OR 条件之前被评估。始终使用括号 () 来明确分组您的条件,以确保您的逻辑按预期执行。

假设您想查询那些 (来自 Mumbai 或 Bhopal) 并且薪水高于 7000 的客户。

-- 错误逻辑(未加括号)
-- 这将查找 (来自 Mumbai 的客户) 或者 (来自 Bhopal 且薪水 > 7000 的客户)
SELECT NAME, ADDRESS, SALARY
FROM CUSTOMERS
WHERE ADDRESS = 'Mumbai' OR ADDRESS = 'Bhopal' AND SALARY > 7000;
-- 正确逻辑(加括号)
SELECT NAME, ADDRESS, SALARY
FROM CUSTOMERS
WHERE (ADDRESS = 'Mumbai' OR ADDRESS = 'Bhopal') AND SALARY > 7000;

正确的查询只会识别 Hardik,而错误的查询则会包含来自 Mumbai 的 Chaitali,无论她的薪水如何。

OR 运算符在 UPDATE 和 DELETE 语句中同样有效,可以用于指定目标行。

为所有年龄小于 25 岁或来自 Hyderabad 的客户发放奖金。

UPDATE CUSTOMERS
SET SALARY = SALARY + 500
WHERE AGE < 25 OR ADDRESS = 'Hyderabad';
-- 这会影响 Kaushik (23 岁) 和 Komal (来自 Hyderabad)。

删除所有年龄大于 30 岁或薪水小于 2000 的客户。

DELETE FROM CUSTOMERS
WHERE AGE > 30 OR SALARY < 2000;
-- 这会影响 Ramesh (32 岁) 和 Khilan (薪水 1500)。

在应用程序代码中构建带有 OR 的查询时,请始终使用预处理语句以安全地传递参数。

PHP
Node.js
Java
Python
此示例使用 `mysqli` 和预处理语句来查找匹配两个城市之一的客户。
```php
<?php
$dbhost = 'localhost'; $dbuser = 'root'; $dbpass = 'password'; $dbname = 'TUTORIALS';
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
$city1 = 'Delhi';
$city2 = 'Mumbai';
$sql = 'SELECT NAME, ADDRESS FROM CUSTOMERS WHERE ADDRESS = ? OR ADDRESS = ?';
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('ss', $city1, $city2);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
printf("Name: %s, Address: %s\n", $row['NAME'], $row['ADDRESS']);
}
$stmt->close();
$mysqli->close();
?>

此 mysql2/promise 示例查找年龄小于某个值或薪水高于某个阈值的客户。

const mysql = require('mysql2/promise');
async function findCustomers(maxAge, minSalary) {
let connection;
try {
connection = await mysql.createConnection({ host: 'localhost', user: 'root', password: 'password', database: 'TUTORIALS' });
const sql = 'SELECT NAME, AGE, SALARY FROM CUSTOMERS WHERE AGE < ? OR SALARY > ?';
const [rows] = await connection.execute(sql, [maxAge, minSalary]);
console.log('Found customers:', rows);
} catch (error) {
console.error('Query failed:', error);
} finally {
if (connection) await connection.end();
}
}
findCustomers(25, 6000);

此现代 JDBC 示例使用 PreparedStatement 将参数安全地插入到 OR 查询中。

import java.sql.*;
public class OrOperatorExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/TUTORIALS";
String user = "root";
String password = "password";
String sql = "SELECT NAME, AGE, SALARY FROM CUSTOMERS WHERE AGE < ? OR SALARY > ?";
try (Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, 25); // age < 25
pstmt.setBigDecimal(2, new java.math.BigDecimal("6000.00")); // salary > 6000
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
System.out.printf("Name: %s, Age: %d, Salary: %.2f%n",
rs.getString("NAME"), rs.getInt("AGE"), rs.getBigDecimal("SALARY"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}

此 Python 示例使用 mysql-connector-python 并将参数作为元组传递给 execute()。

import mysql.connector
def find_customers(max_age, min_salary):
config = {'user': 'root', 'password': 'password', 'host': 'localhost', 'database': 'TUTORIALS'}
query = "SELECT NAME, AGE, SALARY FROM CUSTOMERS WHERE AGE < %s OR SALARY > %s"
try:
with mysql.connector.connect(**config) as conn:
with conn.cursor(dictionary=True) as cursor:
cursor.execute(query, (max_age, min_salary))
for row in cursor.fetchall():
print(row)
except mysql.connector.Error as err:
print(f"Error: {err}")
find_customers(25, 6000)