WHERE子句
1、WHERE
子句是在 SELECT ... FROM ...
的基础上使用的,你可以把它视作组成 SELECT
语句的一块“积木”。
2、在 SELECT
语句的 FROM
子句后添加 WHERE
子句,SQL 就会根据 WHERE
子句中的条件筛选数据
SELECT 字段名
FROM 表名
WHERE 筛选条件
常用条件操作符
比较运算
相等:=
不等:!=
<>
大于:>
大于等于:>=
小于:<
小于等于:<=
范围筛选
连续数值范围:BETWEEN
离散范围:IN
搜索模式匹配
LIKE
逻辑运算
与运算:AND
或运算:OR
非运算:NOT
BETWEEN操作符
范围筛选要通过 BETWEEN
操作符来完成,单词 between 的意思是“在……之间”,SQL 中我们用它来找到给定最小值、最大值之间的数据。
使用这个操作符时,我们需要在 BETWEEN
后面写好数值范围的最小值和最大值,二者用 AND
连接,格式如下:
上图中的 WHERE
子句,含义是:筛选出 price
列的值大于等于 100,小于等于 200 的行,AND
左右的两个数字构成了一个连续的数值区间,作为查询范围。
注意:一定要让最小值在前,最大值在后,顺序不可以颠倒,否则就查不到结果啦!
我们把 WHERE
子句拼到 SELECT
语句中,完整的查询语句和查询结果如下:
SELECT *
FROM events
WHERE price BETWEEN 100 AND 200;
日期筛选
1、越晚发生的日期,数值越大
2、所以,>
、<
、=
这些操作符,在日期比较中也是通用的。如果想要筛选出 2021 年 10 月 31 日以前的演出,筛选条件可以写成 WHERE date < '2021-10-31'
。
SELECT *
FROM events
WHERE event_time < '2021-10-31';
3、现在我们了解了 SQL 中日期值比较大小的规则。如果要筛选某个范围内的日期,同样要请 BETWEEN
关键字出马。
4、前面我们强调过,使用 BETWEEN
关键字做范围筛选时,要将范围的最小值写在 AND
左侧,最大值写在 AND
右侧。日期筛选中也一样,筛选条件的格式为:
SELECT *
FROM events
WHERE event_time BETWEEN '2021-11-01' AND '2021-11-30';
分本筛选
1、查询语句中,筛选条件是 event_name = '蓝莓音乐节'
,也即 查询列 = TEXT 类型的目标文本
,所有文字都要与目标文本一一匹配,这也是文本筛选中最常见的模式:精确搜索。
2、精确搜索能满足大部分文本筛选的需求,不过对于更复杂的查询需求,比如在 events
表中查找所有北京的演出,精确搜索就无能为力了。
3、更灵活的文本筛选,要求 SQL 根据给定的 搜索模式,找到所有具备相同特征的文本。这要借助 通配符 来完成。
4、通配符是一个相当好用的小帮手,它专门用来代替一个或多个字符,熟悉 Excel 的同学可能会对它有所耳闻。
5、SQL 中常用的通配符有两个:百分号 %
用来代替多个字符,下划线 _
用来代替单个字符。要怎么用呢?我们以 %
为例来体会下。
6、从 events
表中我们可以看到,所有北京的演出,其 site
列的值都是以“北京-”开头、总体长度不确定的文本——提炼一下共同特征,它们都是 TEXT
类型,内容形式为 '北京-任意长度的其他字符'
。
7、百分号 %
可以代替多个任意字符,我们用它来替换掉短划线 - 之后的内容,就得到了搜索模式:'北京-%'
。
8、怎样在 WHERE
子句中应用这个搜索模式呢?这里要用到一个新的操作符:LIKE
。LIKE
操作符会告诉 SQL,“搜索模式都给你列在后面啦,请你帮我找到符合这个模式的所有数据!🙇🙇🙇”
SELECT *
FROM events
WHERE site LIKE '北京-%';
高级筛选
1、SQL 支持的逻辑操作符有 AND
、OR
和 NOT
,它们三个代表了我们生活中最常用的三类逻辑运算:与、或、非。
AND
操作符:与运算,被连接的条件全部为真,复合条件才为真;OR
操作符:或运算,被连接的条件有一个为真,复合条件即为真;NOT
操作符:非运算,否定其后跟的条件。
2、NOT操作符的优先级高于
OR和
AND`,在与或非三种逻辑运算之间,SQL 会首先执行非运算。
SELECT *
FROM events
WHERE NOT (event_type = '话剧' OR event_type = '舞剧');
IN操作符
IN
操作符会对待查找的值给出一个允许的范围。在筛选时,我们会把这些允许的值用 英文逗号 隔开,然后统一用 英文括号 包裹起来,写成 (值1, 值2, 值3, ...)
的形式
IN
和 BETWEEN
的区别在于,BETWEEN
筛选的范围,是一个连续的数值范围,而 IN
筛选的范围则是独立、分散的一组值,比如几段不同的文本、几个不同的数字、几个不同的日期等等。
SELECT *
FROM events
WHERE site IN ('北京-糖果大楼', '上海-人民体育场', '广州-蓓蕾剧院');