Administrator
发布于 2025-09-11 / 5 阅读
0
0

MySQL第10课:SELECT与逻辑运算符

1. 什么是逻辑运算符

1.1 逻辑运算符的概念

  • 逻辑运算符用于连接多个条件表达式

  • 实现复杂的多条件查询逻辑

  • 是构建复杂SQL查询的基础

1.2 常用的逻辑运算符

  • AND:逻辑与,所有条件都为真时返回真

  • OR:逻辑或,至少一个条件为真时返回真

  • NOT:逻辑非,取反操作

  • XOR:逻辑异或,只有一个条件为真时返回真


2. AND 运算符

2.1 基本语法

SELECT * FROM 表名 
WHERE 条件1 AND 条件2 AND 条件3 ...;

2.2 创建示例表

-- 创建学生信息表
CREATE TABLE students (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    class VARCHAR(20),
    gender VARCHAR(10),
    age INT,
    score_math INT,
    score_english INT,
    score_chinese INT,
    is_active BOOLEAN
);
​
-- 插入示例数据
INSERT INTO students VALUES
(1, '张三', '计算机1班', '男', 18, 85, 78, 92, TRUE),
(2, '李四', '计算机2班', '女', 17, 92, 88, 76, TRUE),
(3, '王五', '计算机1班', '男', 19, 78, 65, 82, FALSE),
(4, '赵六', '计算机2班', '女', 18, 95, 92, 88, TRUE),
(5, '孙七', '计算机1班', '男', 17, 68, 72, 65, TRUE),
(6, '周八', '计算机2班', '女', 19, 88, 85, 90, FALSE);

2.3 AND 运算符使用示例

示例1:查询计算机1班的男生

SELECT * FROM students 
WHERE class = '计算机1班' AND gender = '男';

示例2:查询数学成绩大于80且英语成绩大于85的学生

SELECT * FROM students 
WHERE score_math > 80 AND score_english > 85;

示例3:查询年龄在17-19岁之间的活跃女生

SELECT * FROM students 
WHERE age BETWEEN 17 AND 19 
  AND gender = '女' 
  AND is_active = TRUE;

3. OR 运算符

3.1 基本语法

SELECT * FROM 表名 
WHERE 条件1 OR 条件2 OR 条件3 ...;

3.2 OR 运算符使用示例

示例1:查询计算机1班或计算机2班的学生

SELECT * FROM students 
WHERE class = '计算机1班' OR class = '计算机2班';

示例2:查询数学成绩大于90或英语成绩大于90的学生

SELECT * FROM students 
WHERE score_math > 90 OR score_english > 90;

示例3:查询年龄小于18或大于19的学生

SELECT * FROM students 
WHERE age < 18 OR age > 19;

4. NOT 运算符

4.1 基本语法

SELECT * FROM 表名 
WHERE NOT 条件;

4.2 NOT 运算符使用示例

示例1:查询非计算机1班的学生

SELECT * FROM students 
WHERE NOT class = '计算机1班';

示例2:查询不活跃的学生

SELECT * FROM students 
WHERE NOT is_active;

示例3:查询数学成绩不在80分以下的学生

SELECT * FROM students 
WHERE NOT score_math < 80;

5. XOR 运算符

5.1 基本语法

SELECT * FROM 表名 
WHERE 条件1 XOR 条件2;

5.2 XOR 运算符使用示例

示例1:查询要么数学好要么英语好,但不能两科都好的学生

SELECT * FROM students 
WHERE (score_math > 90) XOR (score_english > 90);

示例2:查询要么是男生要么是计算机1班,但不能同时满足的学生

SELECT * FROM students 
WHERE (gender = '男') XOR (class = '计算机1班');

6. 逻辑运算符组合使用

6.1 使用括号控制优先级

示例1:查询计算机1班的男生或者计算机2班的女生

SELECT * FROM students 
WHERE (class = '计算机1班' AND gender = '男') 
   OR (class = '计算机2班' AND gender = '女');

示例2:查询数学和英语都大于85,或者语文大于90的学生

SELECT * FROM students 
WHERE (score_math > 85 AND score_english > 85) 
   OR score_chinese > 90;

示例3:查询非计算机1班的活跃学生

SELECT * FROM students 
WHERE NOT class = '计算机1班' AND is_active = TRUE;

6.2 复杂条件组合

示例4:查询满足以下条件的学生:

  • 年龄在17-18岁之间

  • 数学或英语成绩大于85

  • 不是不活跃的学生

SELECT * FROM students 
WHERE age BETWEEN 17 AND 18 
  AND (score_math > 85 OR score_english > 85) 
  AND NOT (NOT is_active);

7. 运算符优先级

7.1 优先级顺序

  1. 括号 () - 最高优先级

  2. NOT

  3. AND

  4. OR、XOR - 最低优先级

7.2 优先级示例

-- 这两个查询结果相同,但写法不同
SELECT * FROM students 
WHERE class = '计算机1班' AND gender = '男' OR gender = '女';
​
-- 使用括号明确优先级
SELECT * FROM students 
WHERE class = '计算机1班' AND (gender = '男' OR gender = '女');

8. 综合实战练习

8.1 创建员工表

CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    department VARCHAR(50),
    position VARCHAR(50),
    salary DECIMAL(10,2),
    hire_date DATE,
    is_fulltime BOOLEAN,
    city VARCHAR(50)
);
​
INSERT INTO employees VALUES
(1, '张三', '技术部', '工程师', 8000.00, '2022-03-15', TRUE, '北京'),
(2, '李四', '销售部', '销售代表', 6000.00, '2023-01-20', TRUE, '上海'),
(3, '王五', '技术部', '高级工程师', 12000.00, '2021-08-10', TRUE, '北京'),
(4, '赵六', '人事部', 'HR专员', 5500.00, '2023-05-30', FALSE, '广州'),
(5, '孙七', '销售部', '销售经理', 9000.00, '2022-11-05', TRUE, '上海'),
(6, '周八', '技术部', '实习生', 4000.00, '2023-07-01', FALSE, '北京');

8.2 综合查询练习

练习1:查询技术部或销售部的全职员工

SELECT * FROM employees 
WHERE (department = '技术部' OR department = '销售部') 
  AND is_fulltime = TRUE;

练习2:查询薪资在5000-10000之间,且在北京或上海工作的员工

SELECT * FROM employees 
WHERE salary BETWEEN 5000 AND 10000 
  AND (city = '北京' OR city = '上海');

练习3:查询不是实习生,且薪资大于6000或工作超过1年的员工

SELECT * FROM employees 
WHERE NOT position = '实习生' 
  AND (salary > 6000 OR DATEDIFF(CURDATE(), hire_date) > 365);

练习4:使用XOR查询要么薪资高要么职位高,但不能两者都高的员工

SELECT * FROM employees 
WHERE (salary > 10000) XOR (position LIKE '%经理%' OR position LIKE '%高级%');

9. 常见错误与注意事项

❌ 常见错误

-- 错误:AND和OR混合使用时没有使用括号
SELECT * FROM students 
WHERE class = '计算机1班' AND gender = '男' OR gender = '女';
​
-- 错误:NOT使用不当
SELECT * FROM students 
WHERE NOT score_math > 80 AND score_english > 80;  -- 可能不是预期结果
​
-- 错误:混淆=和==
SELECT * FROM students 
WHERE class == '计算机1班';  -- MySQL使用=,不是==

✅ 正确写法

-- 正确:使用括号明确优先级
SELECT * FROM students 
WHERE class = '计算机1班' AND (gender = '男' OR gender = '女');
​
-- 正确:明确NOT的范围
SELECT * FROM students 
WHERE NOT (score_math > 80 AND score_english > 80);
​
-- 正确:使用=进行比较
SELECT * FROM students 
WHERE class = '计算机1班';

🎯 本章重点总结

运算符

语法

描述

真值表

AND

条件1 AND 条件2

所有条件为真时返回真

真 AND 真 = 真 真 AND 假 = 假

OR

条件1 OR 条件2

至少一个条件为真时返回真

真 OR 假 = 真 假 OR 假 = 假

NOT

NOT 条件

对条件取反

NOT 真 = 假 NOT 假 = 真

XOR

条件1 XOR 条件2

只有一个条件为真时返回真

真 XOR 真 = 假 真 XOR 假 = 真

💡 重要提醒

  1. 使用括号明确逻辑运算的优先级

  2. AND的优先级高于OR,混合使用时特别注意

  3. 复杂的逻辑条件可以分步骤测试

  4. 合理使用逻辑运算符可以简化查询语句


📝 课后作业

基础练习

  1. 创建商品表,包含价格、分类、库存、状态等字段

  2. 使用AND查询价格在某个区间且库存充足的商品

  3. 使用OR查询多个分类的商品

  4. 使用NOT排除特定状态的商品

进阶练习

  1. 设计一个学生选课系统的复杂查询,组合使用各种逻辑运算符

  2. 编写查询找出满足多个条件的员工(部门、薪资、入职时间等)

  3. 分析复杂逻辑查询的性能,思考优化方案



评论