Skip to main content

任务三 MySQL运算符

  1. 什么是关系运算符

1.1 关系运算符的概念

关系运算符用于比较两个值之间的关系

也称为比较运算符

返回布尔值(TRUE/FALSE),用于条件判断

1.2 关系运算符的作用

数据筛选和过滤

条件查询

数据验证

排序和分组依据

  1. 常用的关系运算符

运算符

描述

示例

=

等于

age = 18

!= 或 <>

不等于

gender != '男'

>

大于

score > 60

<

小于

price < 100

>=

大于等于

age >= 18

<=

小于等于

salary <= 5000
  1. 创建示例数据

3.1 学生信息表

-- 创建学生表
CREATE TABLE students (
student_id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
gender VARCHAR(10),
class VARCHAR(20),
math_score INT,
english_score INT,
chinese_score INT,
total_score INT,
is_active BOOLEAN
);
​```

```sql
-- 插入示例数据
INSERT INTO students VALUES
(1, '张三', 18, '男', '计算机1班', 85, 78, 92, 255, TRUE),
(2, '李四', 17, '女', '计算机2班', 92, 88, 76, 256, TRUE),
(3, '王五', 19, '男', '计算机1班', 78, 65, 82, 225, FALSE),
(4, '赵六', 18, '女', '计算机2班', 95, 92, 88, 275, TRUE),
(5, '孙七', 17, '男', '计算机1班', 68, 72, 65, 205, TRUE),
(6, '周八', 19, '女', '计算机2班', 88, 85, 90, 263, FALSE);

3.2 商品信息表

-- 创建商品表
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(100),
category VARCHAR(50),
price DECIMAL(10,2),
stock_quantity INT,
create_date DATE
);
​```
```sql
-- 插入示例数据
INSERT INTO products VALUES
(1, 'iPhone 14', '手机', 5999.00, 50, '2023-01-15'),
(2, '华为Mate 50', '手机', 4999.00, 30, '2023-02-20'),
(3, '小米手环', '智能设备', 199.00, 100, '2023-03-10'),
(4, '联想笔记本', '电脑', 4599.00, 20, '2023-01-25'),
(5, '保温杯', '日用品', 89.00, 200, '2023-04-05'),
(6, '机械键盘', '电脑外设', 299.00, 80, '2023-03-28');
  1. 等于运算符 (=)

4.1 基本语法

SELECT * FROM 表名 WHERE 列名 = 值;

4.2 使用示例

示例1:查询年龄等于18岁的学生

SELECT * FROM students WHERE age = 18;

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

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

示例3:查询活跃状态的学生

SELECT * FROM students WHERE is_active = TRUE;

示例4:查询特定价格的产品

SELECT * FROM products WHERE price = 5999.00;
  1. 不等于运算符 (!= 或 <>)

5.1 基本语法

SELECT * FROM 表名 WHERE 列名 != 值;
-- 或者
SELECT * FROM 表名 WHERE 列名 <> 值;

5.2 使用示例

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

SELECT * FROM students WHERE class != '计算机1班';
-- 等价于
SELECT * FROM students WHERE class <> '计算机1班';

示例2:查询性别不是男生的学生

SELECT * FROM students WHERE gender != '男';

示例3:查询价格不是199元的商品

SELECT * FROM products WHERE price != 199.00;

示例4:查询非活跃状态的学生

SELECT * FROM students WHERE is_active != TRUE;
  1. 大于和小于运算符 (>, <)

6.1 基本语法

-- 大于
SELECT * FROM 表名 WHERE 列名 > 值;
​
-- 小于
SELECT * FROM 表名 WHERE 列名 < 值;

6.2 使用示例

示例1:查询数学成绩大于80分的学生

SELECT * FROM students WHERE math_score > 80;

示例2:查询年龄小于18岁的学生

SELECT * FROM students WHERE age < 18;

示例3:查询价格大于1000元的商品

SELECT * FROM products WHERE price > 1000;

示例4:查询库存小于50的商品

SELECT * FROM products WHERE stock_quantity < 50;
  1. 大于等于和小于等于运算符 (>=, <=)

7.1 基本语法

-- 大于等于
SELECT * FROM 表名 WHERE 列名 >= 值;
​
-- 小于等于
SELECT * FROM 表名 WHERE 列名 <= 值;

7.2 使用示例

示例1:查询年龄大于等于18岁的学生

SELECT * FROM students WHERE age >= 18;

示例2:查询总分小于等于250分的学生

SELECT * FROM students WHERE total_score <= 250;

示例3:查询价格在100-500元之间的商品

SELECT * FROM products WHERE price >= 100 AND price <= 500;

示例4:查询3月份及之后创建的商品

SELECT * FROM products WHERE create_date >= '2023-03-01';
  1. 综合实战练习

8.1 学生成绩分析

练习1:查询成绩优秀的学生(单科成绩>=85)

SELECT * FROM students
WHERE math_score >= 85 OR english_score >= 85 OR chinese_score >= 85;

练习2:查询需要补考的学生(单科成绩<60)

SELECT * FROM students
WHERE math_score < 60 OR english_score < 60 OR chinese_score < 60;

练习3:查询中等成绩的学生(总分在230-270之间)

SELECT * FROM students
WHERE total_score >= 230 AND total_score <= 270;

8.2 商品库存管理

练习4:查询需要补货的商品(库存<30)

SELECT * FROM products WHERE stock_quantity < 30;

练习5:查询高价商品(价格>3000)

SELECT * FROM products WHERE price > 3000;

练习6:查询第一季度创建的商品

SELECT * FROM products
WHERE create_date >= '2023-01-01' AND create_date <= '2023-03-31';
  1. 关系运算符组合使用

9.1 多条件组合查询

示例1:查询18岁的女生

SELECT * FROM students
WHERE age = 18 AND gender = '女';

示例2:查询手机类且价格大于3000的商品

SELECT * FROM products
WHERE category = '手机' AND price > 3000;

示例3:查询计算机1班中数学成绩优秀的学生

SELECT * FROM students
WHERE class = '计算机1班' AND math_score >= 85;

9.2 复杂条件组合

示例4:查询年龄在17-19岁之间,且总分大于250的活跃学生

SELECT * FROM students
WHERE age >= 17 AND age <= 19
AND total_score > 250
AND is_active = TRUE;

示例5:查询非手机类商品,且价格在100-1000元之间,库存充足

SELECT * FROM products
WHERE category != '手机'
AND price >= 100 AND price <= 1000
AND stock_quantity > 50;
  1. 常见错误与注意事项

❌ 常见错误

-- 错误:比较字符串时忘记引号
SELECT * FROM students WHERE class = 计算机1班;
​
-- 错误:日期格式不正确
SELECT * FROM products WHERE create_date > 2023-01-01;
​
-- 错误:混淆=和==
SELECT * FROM students WHERE class == '计算机1班';

✅ 正确写法

-- 正确:字符串用引号括起来
SELECT * FROM students WHERE class = '计算机1班';
​
-- 正确:日期用引号括起来
SELECT * FROM products WHERE create_date > '2023-01-01';
​
-- 正确:MySQL使用=进行比较
SELECT * FROM students WHERE class = '计算机1班';

⚠️ 重要注意事项

字符串比较要区分大小写(取决于数据库配置)

NULL值比较要使用IS NULL或IS NOT NULL

日期比较要确保格式正确

数值比较要注意数据类型匹配

  1. 数据类型对比较的影响

11.1 字符串比较

-- 字符串按字典序比较
SELECT * FROM students WHERE name > '李四'; -- 名字在'李四'之后的学生

11.2 日期比较

-- 日期按时间先后比较
SELECT * FROM products WHERE create_date < '2023-03-01';

11.3 布尔值比较

-- 布尔值比较
SELECT * FROM students WHERE is_active = TRUE;
SELECT * FROM students WHERE is_active = FALSE;

🎯 本章重点总结

运算符

名称

示例

说明

=

等于

age = 18

精确匹配

`!= / <>`

不等于

gender != '男'

排除匹配

`>`

大于

`score > 60`

数值/日期比较

`<`

小于

`price < 100`

数值/日期比较

`>=`

大于等于

age `>=` 18

包含边界值

`<=`

小于等于

`salary <= 5000`

包含边界值

💡 核心要点

关系运算符用于条件判断,返回布尔值

组合使用可以实现复杂的查询条件

注意数据类型,确保比较的合理性

字符串和日期需要用引号括起来

📝 课后作业

基础练习

创建员工表,包含薪资、入职日期、部门等字段

使用关系运算符查询:

薪资大于5000的员工

入职日期在2023年之前的员工

特定部门的员工

进阶练习

设计复杂查询:查询薪资在某个范围且入职时间在特定期间的员工

分析学生成绩数据,找出各分数段的学生分布

设计库存预警查询,找出需要补货的商品

实践项目

创建一个简单的学生管理系统,实现以下功能:

查询及格/不及格的学生

查询不同年龄段的学生

查询各班级的成绩统计

1. 什么是区间运算符

1.1 区间运算符的概念

区间运算符用于查询某个范围内的数据

可以替代多个AND连接的比较条件

使查询语句更简洁、易读

1.2 常用的区间运算符

BETWEEN...AND:在某个范围内

IN:在某个值列表中

比较运算符组合:>、<、>=、<=

2. BETWEEN...AND 运算符

2.1 基本语法

SELECT * FROM 表名
WHERE 列名 BETWEEN 值1 AND 值2;
2.2 数值范围查询

-- 创建示例表
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(50),
price DECIMAL(10,2),
stock INT,
category VARCHAR(20)
);
​
-- 插入示例数据
INSERT INTO products VALUES
(1, '苹果手机', 5999.00, 50, '电子产品'),
(2, '华为平板', 3299.00, 30, '电子产品'),
(3, '小米手环', 199.00, 100, '电子产品'),
(4, '联想笔记本', 4599.00, 20, '电子产品'),
(5, '保温杯', 89.00, 200, '日用品');
示例1:查询价格在2000-5000之间的商品

SELECT * FROM products
WHERE price BETWEEN 2000 AND 5000;
示例2:查询库存量在30-100之间的商品

SELECT * FROM products
WHERE stock BETWEEN 30 AND 100;
2.3 日期范围查询

-- 创建员工表
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
department VARCHAR(50),
salary DECIMAL(10,2),
hire_date DATE
);
​
-- 插入示例数据
INSERT INTO employees VALUES
(1, '张三', '销售部', 5000.00, '2023-01-15'),
(2, '李四', '技术部', 6000.00, '2023-02-20'),
(3, '王五', '人事部', 4500.00, '2023-03-10'),
(4, '赵六', '财务部', 5500.00, '2023-04-05'),
(5, '钱七', '技术部', 6500.00, '2023-05-25');
示例3:查询2023年第一季度入职的员工

SELECT * FROM employees
WHERE hire_date BETWEEN '2023-01-01' AND '2023-03-31';
3. IN 运算符

3.1 基本语法

SELECT * FROM 表名
WHERE 列名 IN (值1, 值2, 值3, ...);
3.2 使用IN进行多值匹配

示例1:查询特定部门的员工

-- 查询技术部和销售部的员工
SELECT * FROM employees
WHERE department IN ('技术部', '销售部');
示例2:查询特定价格的商品

-- 查询价格为5999、3299、199的商品
SELECT * FROM products
WHERE price IN (5999, 3299, 199);
3.3 IN运算符的等价写法

-- 使用IN运算符
SELECT * FROM employees
WHERE department IN ('技术部', '销售部');
​
-- 等价的使用OR运算符(更繁琐)
SELECT * FROM employees
WHERE department = '技术部' OR department = '销售部';
4. NOT BETWEEN 和 NOT IN

4.1 NOT BETWEEN

作用:查询不在某个范围内的数据

-- 查询价格不在2000-5000之间的商品
SELECT * FROM products
WHERE price NOT BETWEEN 2000 AND 5000;
​
-- 查询不在第一季度入职的员工
SELECT * FROM employees
WHERE hire_date NOT BETWEEN '2023-01-01' AND '2023-03-31';
4.2 NOT IN

作用:查询不在指定值列表中的数据

-- 查询不是技术部和销售部的员工
SELECT * FROM employees
WHERE department NOT IN ('技术部', '销售部');
​
-- 查询不是特定价格的商品
SELECT * FROM products
WHERE price NOT IN (5999, 3299, 199);
5. 综合实战练习

5.1 创建学生成绩表

CREATE TABLE student_scores (
student_id INT PRIMARY KEY,
name VARCHAR(50),
class VARCHAR(20),
chinese INT,
math INT,
english INT,
total_score INT
);
​
INSERT INTO student_scores VALUES
(1, '张三', '计算机1班', 85, 92, 78, 255),
(2, '李四', '计算机2班', 76, 88, 90, 254),
(3, '王五', '计算机1班', 92, 95, 87, 274),
(4, '赵六', '计算机2班', 68, 72, 65, 205),
(5, '钱七', '计算机1班', 88, 84, 91, 263),
(6, '孙八', '计算机2班', 95, 98, 92, 285);
5.2 综合查询练习

练习1:查询总分在250-280之间的学生

SELECT * FROM student_scores
WHERE total_score BETWEEN 250 AND 280;
练习2:查询数学成绩在90分以上的学生

SELECT * FROM student_scores
WHERE math >= 90;
练习3:查询计算机1班和2班中英语成绩优秀(85分以上)的学生

SELECT * FROM student_scores
WHERE class IN ('计算机1班', '计算机2班')
AND english >= 85;
练习4:查询语文成绩不在70-90分之间的学生

SELECT * FROM student_scores
WHERE chinese NOT BETWEEN 70 AND 90;
6. 常见错误与注意事项

❌ 常见错误

-- 错误!BETWEEN的值顺序不能颠倒
SELECT * FROM products
WHERE price BETWEEN 5000 AND 2000; -- 不会返回结果
​
-- 错误!IN运算符中不能有NULL值
SELECT * FROM employees
WHERE department IN ('技术部', NULL, '销售部'); -- 可能产生意外结果
✅ 最佳实践

-- 正确:确保BETWEEN的小值在前
SELECT * FROM products
WHERE price BETWEEN 2000 AND 5000;
​
-- 正确:处理可能的NULL值
SELECT * FROM employees
WHERE department IN ('技术部', '销售部')
OR department IS NULL;
7. 性能优化建议

7.1 索引的使用

对经常用于范围查询的列创建索引

BETWEEN在索引列上效率很高

7.2 避免过度使用IN

-- 不推荐:IN列表过长影响性能
SELECT * FROM products
WHERE id IN (1,2,3,4,5,6,7,8,9,10,11,12,...);
​
-- 推荐:改用BETWEEN或其他条件
SELECT * FROM products
WHERE id BETWEEN 1 AND 50;
🎯 本章重点总结

运算符

语法

用途

示例

BETWEEN...AND

BETWEEN A AND B

范围查询

WHERE price BETWEEN 100 AND 500

IN

IN (值1,值2,...)

多值匹配

WHERE dept IN ('销售','技术')

NOT BETWEEN

NOT BETWEEN A AND B

范围排除

WHERE age NOT BETWEEN 18 AND 30

NOT IN

NOT IN (值1,值2,...)

多值排除

WHERE status NOT IN ('离职','退休')

💡 重要提醒

BETWEEN包含边界值:BETWEEN 100 AND 500 包含100和500

IN运算符适合离散值,BETWEEN适合连续范围

注意数据类型匹配,特别是日期类型

复杂的区间查询可以组合使用多个运算符

📝 课后作业

基础练习

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

使用BETWEEN查询价格在某个区间的商品

使用IN查询特定分类的商品

组合使用BETWEEN和IN进行复杂查询

进阶练习

查询价格不在100-500之间,且分类为'电子产品'或'图书'的商品

查询入职日期在去年,且薪资在5000-8000之间的员工

设计一个学生选课系统的查询,使用各种区间运算符

其他区间表示方法

-- 使用比较运算符组合
SELECT * FROM products
WHERE price >= 2000 AND price <= 5000;
​
-- 使用数学函数
SELECT * FROM products
WHERE ABS(price - 3500) <= 1500; -- 价格在2000-5000之间

空值运算符

1. 什么是空值(NULL)

1.1 空值的定义

空值表示"未知"或"不存在"的值

与0、空字符串''、False不同

在数据库中具有特殊含义

1.2 空值的特点

-- 空值示例
SELECT NULL = NULL; -- 结果为NULL,不是True
SELECT NULL != NULL; -- 结果为NULL,不是False
2. 空值运算符详解

2.1 IS NULL 运算符

作用:检查某个值是否为空

-- 基本语法
SELECT * FROM 表名 WHERE 列名 IS NULL;
​
-- 实际示例
-- 假设有学生表 students
SELECT * FROM students WHERE 电话号码 IS NULL;
2.2 IS NOT NULL 运算符

作用:检查某个值是否不为空

-- 基本语法
SELECT * FROM 表名 WHERE 列名 IS NOT NULL;
​
-- 实际示例
SELECT * FROM students WHERE 邮箱 IS NOT NULL;
3. 实战演示

3.1 创建示例表

CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
department VARCHAR(50),
salary DECIMAL(10,2),
hire_date DATE,
phone VARCHAR(20)
);
​
-- 插入示例数据
INSERT INTO employees VALUES
(1, '张三', '销售部', 5000.00, '2023-01-15', '13800138000'),
(2, '李四', '技术部', NULL, '2023-02-20', NULL),
(3, '王五', NULL, 4500.00, NULL, '13900139000'),
(4, '赵六', '人事部', 4800.00, '2023-04-10', NULL);
3.2 查询练习

查询1:查找薪资未知的员工

SELECT * FROM employees WHERE salary IS NULL;
查询2:查找部门已确定的员工

SELECT * FROM employees WHERE department IS NOT NULL;
查询3:查找电话号码和入职日期都完整的员工

SELECT * FROM employees
WHERE phone IS NOT NULL AND hire_date IS NOT NULL;
4. 常见错误与注意事项

❌ 错误写法

-- 错误!不能用 = 判断NULL
SELECT * FROM employees WHERE salary = NULL;
​
-- 错误!不能用 != 判断非NULL
SELECT * FROM employees WHERE salary != NULL;
✅ 正确写法

-- 正确使用IS NULL
SELECT * FROM employees WHERE salary IS NULL;
​
-- 正确使用IS NOT NULL
SELECT * FROM employees WHERE salary IS NOT NULL;
5. 综合练习

练习1:数据完整性检查

-- 检查员工表中哪些关键信息缺失
SELECT
COUNT(*) as 总员工数,
COUNT(department) as 有部门的员工数,
COUNT(salary) as 有薪资的员工数,
COUNT(phone) as 有电话的员工数
FROM employees;
练习2:条件组合查询

-- 查找技术部中薪资未知的员工
SELECT * FROM employees
WHERE department = '技术部' AND salary IS NULL;
​
-- 查找所有信息完整的员工
SELECT * FROM employees
WHERE department IS NOT NULL
AND salary IS NOT NULL
AND hire_date IS NOT NULL
AND phone IS NOT NULL;
🎯 本章重点总结

运算符

作用

示例

IS NULL

判断是否为空

WHERE phone IS NULL

IS NOT NULL

判断是否不为空

WHERE email IS NOT NULL

💡 重要提醒

NULL ≠ 0,也≠ 空字符串

必须使用IS NULL/IS NOT NULL判断空值

空值在排序时通常显示在最前面

📝 课后作业

创建一个商品表,包含价格、库存等字段,故意插入一些空值

编写查询语句找出价格未知的商品

编写查询语句找出所有信息完整的商品

使用IFNULL函数为空的字段显示默认值