MySQL - OR 运算符
MySQL - OR 逻辑运算符
Section titled “MySQL - OR 逻辑运算符”理解 OR 运算符
Section titled “理解 OR 运算符”MySQL 的 OR 运算符是一个逻辑运算符,用于组合两个或多个布尔条件。如果至少一个条件为真,它将返回真(在 MySQL 中表示为 1)。只有当所有条件都为假时,它才返回假(0)。
- 如果
A为真 ORB为真,则结果为真 (1)。 - 如果
A为假 ORB为假,则结果为假 (0)。 - 如果条件为
NULL,结果取决于其他条件。true OR NULL为true,而false OR NULL为NULL。
下表展示了 OR 运算符的行为:
| A | B | A OR B |
|---|---|---|
| 真 (1) | 真 (1) | 真 (1) |
| 真 (1) | 假 (0) | 真 (1) |
| 假 (0) | 真 (1) | 真 (1) |
| 假 (0) | 假 (0) | 假 (0) |
| 真 (1) | NULL | 真 (1) |
| 假 (0) | NULL | NULL |
| NULL | NULL | NULL |
在 WHERE 子句中使用 OR
Section titled “在 WHERE 子句中使用 OR”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, SALARYFROM CUSTOMERSWHERE ADDRESS = 'Delhi' OR SALARY > 6000;| ID | NAME | ADDRESS | SALARY |
|---|---|---|---|
| 2 | Khilan | Delhi | 1500.00 |
| 4 | Chaitali | Mumbai | 6500.00 |
| 5 | Hardik | Bhopal | 8500.00 |
常见陷阱:OR 与 AND 的优先级
Section titled “常见陷阱:OR 与 AND 的优先级”一个常见的错误源是忘记 AND 运算符的优先级高于 OR。这意味着 AND 条件会在 OR 条件之前被评估。始终使用括号 () 来明确分组您的条件,以确保您的逻辑按预期执行。
假设您想查询那些 (来自 Mumbai 或 Bhopal) 并且薪水高于 7000 的客户。
-- 错误逻辑(未加括号)-- 这将查找 (来自 Mumbai 的客户) 或者 (来自 Bhopal 且薪水 > 7000 的客户)SELECT NAME, ADDRESS, SALARYFROM CUSTOMERSWHERE ADDRESS = 'Mumbai' OR ADDRESS = 'Bhopal' AND SALARY > 7000;
-- 正确逻辑(加括号)SELECT NAME, ADDRESS, SALARYFROM CUSTOMERSWHERE (ADDRESS = 'Mumbai' OR ADDRESS = 'Bhopal') AND SALARY > 7000;正确的查询只会识别 Hardik,而错误的查询则会包含来自 Mumbai 的 Chaitali,无论她的薪水如何。
在 UPDATE 和 DELETE 语句中使用 OR
Section titled “在 UPDATE 和 DELETE 语句中使用 OR”OR 运算符在 UPDATE 和 DELETE 语句中同样有效,可以用于指定目标行。
UPDATE 示例
Section titled “UPDATE 示例”为所有年龄小于 25 岁或来自 Hyderabad 的客户发放奖金。
UPDATE CUSTOMERSSET SALARY = SALARY + 500WHERE AGE < 25 OR ADDRESS = 'Hyderabad';-- 这会影响 Kaushik (23 岁) 和 Komal (来自 Hyderabad)。DELETE 示例
Section titled “DELETE 示例”删除所有年龄大于 30 岁或薪水小于 2000 的客户。
DELETE FROM CUSTOMERSWHERE AGE > 30 OR SALARY < 2000;-- 这会影响 Ramesh (32 岁) 和 Khilan (薪水 1500)。在客户端程序中使用 OR 运算符
Section titled “在客户端程序中使用 OR 运算符”在应用程序代码中构建带有 OR 的查询时,请始终使用预处理语句以安全地传递参数。
PHPNode.jsJavaPython
此示例使用 `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)