逻辑运算符就是帮你在查询里组合条件的工具,让数据过滤更灵活。你大概率在编程语言里已经见过它们了。要是把SQL查询比作邮箱里的垃圾邮件过滤程序,逻辑运算符就像是决定邮件进“垃圾箱”还是留在“收件箱”的规则。
SQL是个经常用来查数据或者分析数据的工具。逻辑运算符(AND、OR、NOT)让你能在一个查询里组合多个条件,回答更复杂的问题,比如:
- 哪些学生大于18岁并且成绩是“A”?
- 哪些商品属于“电子产品”或者“家用电器”类别?
- 哪些客户没有进行过购买?
咱们来看看SQL里最主要的三个逻辑运算符:
AND:两个条件都得为真。OR:只要有一个条件为真就行。NOT:把条件反过来(取反)。
AND运算符:两个条件都为真
AND运算符让你指定,只有两个部分的条件都满足,结果才会包含这行数据。
语法
SELECT 列1, 列2
FROM 表名
WHERE 条件1 AND 条件2;
例子1:筛选大于18岁的学生并且成绩为“A”
假设我们有个students表:
| id | name | age | grade |
|---|---|---|---|
| 1 | Alex | 20 | A |
| 2 | Maria | 19 | B |
| 3 | Otto | 17 | A |
| 4 | Anna | 22 | A |
查询:
SELECT name, age, grade
FROM students
WHERE age > 18 AND grade = 'A';
结果:
| name | age | grade |
|---|---|---|
| Alex | 20 | A |
| Anna | 22 | A |
例子2:筛选“HR”部门并且工资大于50000的员工
SELECT name, department, salary
FROM employees
WHERE department = 'HR' AND salary > 50000;
OR运算符:只要有一个条件为真
OR运算符用在你想选出至少满足一个条件的行时。
语法
SELECT 列1, 列2
FROM 表名
WHERE 条件1 OR 条件2;
例子1:筛选成绩为“A”或者“B”的学生
SELECT name, age, grade
FROM students
WHERE grade = 'A' OR grade = 'B';
结果:
| name | age | grade |
|---|---|---|
| Alex | 20 | A |
| Maria | 19 | B |
| Otto | 17 | A |
| Anna | 22 | A |
例子2:属于“电子产品”或者价格小于100的商品
products表:
| product_id | name | category | price |
|---|---|---|---|
| 1 | 电视 | 电子产品 | 300 |
| 2 | 熨斗 | 家用电器 | 50 |
| 3 | 智能手机 | 电子产品 | 700 |
| 4 | 水壶 | 家用电器 | 80 |
SELECT name, category, price
FROM products
WHERE category = '电子产品' OR price < 100;
结果:
| name | category | price |
|---|---|---|
| 电视 | 电子产品 | 300 |
| 熨斗 | 家用电器 | 50 |
| 水壶 | 家用电器 | 80 |
| 智能手机 | 电子产品 | 700 |
NOT运算符:条件取反
如果说AND和OR是让条件为真,NOT就是反着来:它选出那些条件为假的行。
语法
SELECT 列1, 列2
FROM 表名
WHERE NOT 条件;
例子1:筛选没有“A”成绩的学生
SELECT name, age, grade
FROM students
WHERE NOT grade = 'A';
结果:
| name | age | grade |
|---|---|---|
| Maria | 19 | B |
例子2:选出不属于“电子产品”类别的商品
SELECT name, category, price
FROM products
WHERE NOT category = '电子产品';
逻辑运算符组合
逻辑运算符可以组合起来,写出更复杂的条件。比如你想选出大于18岁的学生并且成绩为“A”或者成绩为“B”,你就可以组合AND和OR。
组合语法
SELECT 列1, 列2
FROM 表名
WHERE (条件1 AND 条件2) OR 条件3;
例子:大于18岁且成绩为“A”的学生或者成绩为“B”的学生
SELECT name, age, grade
FROM students
WHERE (age > 18 AND grade = 'A') OR grade = 'B';
结果:
| name | age | grade |
|---|---|---|
| Alex | 20 | A |
| Anna | 22 | A |
| Maria | 19 | B |
运算符执行优先级
要记住,SQL里的逻辑运算符执行顺序如下:
NOTANDOR
你可以用括号改变执行顺序。不加括号的话,结果可能会出乎意料!
例子:有括号和没括号的区别
这个查询会发生什么?
SELECT name, age, grade
FROM students
WHERE age > 18 AND grade = 'A' OR grade = 'B';
这个查询会选出:
- 大于18岁并且成绩为“A”的学生。
- 成绩为“B”的学生。
运算符优先级导致结果和加括号一样:
SELECT name, age, grade
FROM students
WHERE (age > 18 AND grade = 'A') OR (grade = 'B');
不过,如果加上括号:
SELECT name, age, grade
FROM students
WHERE age > 18 AND (grade = 'A' OR grade = 'B');
现在只会选出大于18岁且成绩为“A”或者“B”的学生。括号真的能改变一切!
使用逻辑运算符时的常见错误
- 忘记加括号。尤其是
AND和OR一起用时,容易导致结果不对。 - 用
NOT时没搞清楚到底排除了哪些行。 - 逻辑运算符用错了,比如把
AND写成OR或者反过来。 - 条件太复杂。很多
AND、OR、NOT混在一起又没注释,代码就很难读懂。
这些运算符是所有复杂查询的基础。现在你已经可以写出不仅能用,还能精确找到你想要的数据的查询啦!
GO TO FULL VERSION