这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战
今天打算水一篇超常见超简单的where语句使用说明。所有的数据query语句必定会带有where语句。考虑一下一张如果有上百万的的表,不用where语句进行全表进行扫描的话,轻点把数据库CPU打满,糟糕点可能直接排队去财务室结账。所以用好where条件进行数据是数据开发与测试必备的要求。
WHAT IS 'WHERE'
WHERE子句用于在从表中检索、更新或删除数据时指定/应用任何条件。该子句主要用于SELECT、UPDATE和DELETEquery。当我们使用WHERE子句指定条件时,查询只对由WHERE子句指定的条件为真的记录执行。在本文中,我将只演示查询时候的where条件使用,其余的更新与删除的语句同理理解即可。
语法
WHERE 布尔表达式
指定计算结果为布尔类型的任何表达式。可以使用逻辑运算符(AND、or)将两个或多个表达式组合在一起。现在用一些实际案例来演示一下。
简单的where查询
数值查询
测试表内容如下
mysql> select * from token_u where id = 1;
+----+---------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------+-----------+------------+
| id | date | token | who | pp-userid | pp_storeid |
+----+---------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------+-----------+------------+
| 1 | 2021-06-18 00:00:00 | Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxNjQzMTEiLCJHcm91cCI6IjhmZjVhYjQzLTQ3ZDAtNDdlMi1iZDRhLTg3MjIzOTE4MjE3NiIsImF1ZCI6Imh0dHBzOi8vdWMucHVwdWFwaS5jb20iLCJpc3MiOiJodHRwczovL3VjLnB1cHVhcGkuY29tIiwiVG9rZW4iOiIiLCJnaXZlbl9uYW1lIjoi5ZC05a6H6IiqIiwiZXhwIjoxNjI0MTAwOTk1LCJqdGkiOiJmM2YwOTQ4Ni1iYjhlLTRjYzgtYmU3MC1jNzI3NjU5NTIxODEifQ.eWpkDje4HPkAEJv-W2QnacVfpPPXiHb4Iuy8t-bIxSI | wuyuhang | NULL | NULL |
+----+---------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------+-----------+------------+
1 row in set (0.01 sec)
将条件添加到 WHERE 子句中。在此示例中,条件是id等于1。当然这里的具体条件还会受到诸多的限制,例如索引覆盖(mysql),分区覆盖(hive)等。这些约束条件在后面再介绍。需要牢记一点的是返回的结果需要满足where后的布尔表达式。
spark 中使用 由于目前没有使用spark读取MySQL,所以先用临时表演示效果如下
flink 中使用也没有问题
带有文本的 WHERE 子句
mysql 中使用
spark 中使用
值得一提的是,在MySQL与spark中字符串允许使用双引号进行标记查询
flink 中使用
flink 在使用SQL client 的时候,不允许使用双引号对查询条件进行标记。会出现转移失败的问题。
WHERE 范围查询
上面的两种都是较为精确的查询。既然有精确查询,那就会有范围查询,通常在范围查询中使用此类条件判断。具体的案例,比如要查询id>1的数据则
spark 处理
flink 处理
此类逻辑的判断与编程语言中的逻辑判断一样,满足组合,与或关系等。诸如区间查询,可以使用类似 >(=) and <(=) 或者between...and...。 下面主要演示一下 between...and...
mysql 执行结果
spark 执行结果
flink 执行结果
需要值得注意的是,between...and...是双闭区间。也不知道为什么,有的人刚开始学的时候,就是会记错闭区间这个。以至于要死记硬背才行。没错,说的有的人就是我。事实证明只要吃够了亏,也就足以让一个人长记性了。
范围匹配还有一种情况,使用的是in来进行查询。诸如上面的部分语句可以改成
in 可以用来做已知条件下的范围查询,通常在in的后面会跟随一个子查询来确定集合。但是在实际的生产中,in的查询也不能滥用,过多的条件会导致查询缓慢,一般在集合中元素超过100个,就不建议使用in查询。这在MySQL中需要留意,在spark与flink中就无须关注了,毕竟都在内存中进行计算。
spark
flink
WHERE 模糊查询
聊完了精确查询与模糊查询以后,最后将介绍一下模糊查询。通过使用关键字like实现模糊匹配。通常这种查询性能都不大好,尤其在使用错误的表达式以后,还会导致索引失效,从而导致慢查的出现。当然这也是在MySQL中要重点留意的事项。具体的语句表现为
spark
flink
关于like的具体使用方法以及会碰到的坑点,后面有专门的文章来介绍,此处就不展开了。
where 支持的逻辑操作符
| Operator | Description |
|---|---|
= | 相等 |
!= | 不等 |
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
BETWEEN | 在区间查询 |
LIKE | 模糊查询模板 |
IN | 给定集合判断 |
总结
本文主要介绍了使用where语句进行精确、范围、模糊查询在三中不同的引擎下的具体表现与差异。在where的使用上,实际上差异并不明显。需要留意的主要是
- flink 文本查询需要强制用单引号;
- MySQL 的查询对编写对数据表接口的理解要求比较高,要正确的使用索引进行查询,避免出现慢查。而大数据的引擎对这方面的约束倒不会很高。