摘要:在上一章,我们学会了如何用 SELECT 从宝库中取出金币。但问题是,我们每次都把所有金币(所有行)都拿了出来,这显然不够高效。
在上一章,我们学会了如何用 SELECT 从宝库中取出金币。但问题是,我们每次都把所有金币(所有行)都拿了出来,这显然不够高效。
如果我们只想拿出“刻有特定年份的金币”或者“重量大于10克的金币”呢?
这时,WHERE 子句就该闪亮登场了!WHERE 是 SQL 查询的“过滤器”或“瞄准镜”,它允许我们设定条件,只提取出我们真正关心的数据行。可以说,没有 WHERE 的查询是没有灵魂的!
WHERE 子句紧跟在 FROM table_name 之后,其基本结构是:
SELECT column_list FROM table_nameWHERE condition;condition 是一个表达式,最终会返回 true 或 false。对于每一行数据,数据库都会检查这个条件:
如果条件为 true,这行数据就会被包含在查询结果中。如果条件为 false,这行数据就会被无情地抛弃。让我们用 friends 表来实际操练一下吧!
这是最常用的一类条件。
示例 1:精确查找
我们想找到名字叫“老王”的朋友的所有信息。
结果:
id | name | birthday | years_known----+------++ 1 | 老王 | 1990-05-20 | 5(1 row)示例 2:数字比较
找出我们认识超过 5 年的朋友。
结果:
name | years_known------+ 张三 | 10 赵四 | 10(2 rows)常用的比较运算符:
运算符描述示例=等于name = '小李'大于years_known > 5小于years_known >=大于等于years_known >= 10小于等于years_known 或 !=不等于name '老王'当我们需要组合多个条件时,就需要逻辑运算符来帮忙了。
AND: 并且 - 所有的条件都必须为 true,结果才为 true。OR: 或者 - 只要有一个条件为 true,结果就为 true。NOT: 非 - 对条件取反。示例 3:AND 的使用
找出我们认识了 10 年,并且名字叫“张三”的朋友。
结果:
id | name | birthday | years_known----+------++ 3 | 张三 | 1988-01-30 | 10(1 row)示例 4:OR 的使用
找出 id 是 1 或者名字是“小李”的朋友。
结果(老王因为 id=1 被选中,小李因为 name='小李' 被选中):
id | name | birthday | years_known----+------++ 1 | 老王 | 1990-05-20 | 5 2 | 小李 | 1992-08-15 | 3(2 rows)小技巧:AND 的优先级高于 OR。当一个复杂的查询中同时有 AND 和 OR 时,最好用括号 来明确你的意图,避免混淆。例如:WHERE (years_known > 5 AND name = '张三') OR id = 1。
除了基本的比较和逻辑运算,SQL 还提供了一些非常有用的关键字,让我们的条件写起来更优雅。
BETWEEN ... AND ...:检查范围
找出我们认识了 3 到 5 年的朋友(包含 3 和 5)。
这两条语句是等价的,但 BETWEEN 的可读性显然更好。
IN (...):检查是否在集合中
找出 id 是 2 或 4 的朋友。
当 OR 的条件很多时,IN 的优势就非常明显了。
LIKE:模糊匹配字符串
LIKE 通常与两个通配符一起使用:
找出所有姓“张”的朋友:
SELECT name FROM friendsWHERE name LIKE '张%'; -- '张'开头,后面是什么无所谓找出名字里包含“王”的朋友:
SELECT name FROM friendsWHERE name LIKE '%王%'; -- 前后是什么无所谓,中间有'王'就行IS NULL:检查空值
假设我们有个朋友的信息不完整,比如 birthday 是空的 (NULL)。NULL 是一个特殊的值,你不能用 = NULL 来判断,必须用 IS NULL。
(我们的表目前没有 NULL 值,这里仅作演示)
-- 找出所有没有记录生日的朋友SELECT name FROM friendsWHERE birthday IS NULL;-- 找出所有记录了生日的朋友SELECT name FROM friendsWHERE birthday IS NOT NULL;本章小结
威力大增!你已经为你的 SELECT 查询装上了精确制导系统。
我们学会了用比较运算符进行筛选。学会了用 AND 和 OR 组合复杂条件。还掌握了 BETWEEN, IN, LIKE, IS NULL 这些让查询更优雅的利器。现在,你不仅能从数据库里拿数据,还能拿得又快又准!
但是,数据拿出来之后,有时候我们还想对它们进行修改或者删除。这就是我们下一章要学习的内容:UPDATE (更新) 和 DELETE (删除)。准备好学习如何“修改”你的数据世界了吗?我们下一章见!️
来源:linux运维菜