SQL基础能力-SQL中的WHERE语句

1,943 阅读3分钟

这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战

今天打算水一篇超常见超简单的where语句使用说明。所有的数据query语句必定会带有where语句。考虑一下一张如果有上百万的的表,不用where语句进行全表进行扫描的话,轻点把数据库CPU打满,糟糕点可能直接排队去财务室结账。所以用好where条件进行数据是数据开发与测试必备的要求。

WHAT IS 'WHERE'

WHERE子句用于在从表中检索、更新或删除数据时指定/应用任何条件。该子句主要用于SELECT、UPDATE和DELETEquery。当我们使用WHERE子句指定条件时,查询只对由WHERE子句指定的条件为真的记录执行。在本文中,我将只演示查询时候的where条件使用,其余的更新与删除的语句同理理解即可。

语法

WHERE 布尔表达式

指定计算结果为布尔类型的任何表达式。可以使用逻辑运算符(AND、or)将两个或多个表达式组合在一起。现在用一些实际案例来演示一下。

简单的where查询

数值查询

测试表内容如下

image.png

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,所以先用临时表演示效果如下

image.png

flink 中使用也没有问题

image.png

带有文本的 WHERE 子句

mysql 中使用 image.png

spark 中使用

image.png

值得一提的是,在MySQL与spark中字符串允许使用双引号进行标记查询

flink 中使用

image.png

flink 在使用SQL client 的时候,不允许使用双引号对查询条件进行标记。会出现转移失败的问题。

image.png

WHERE 范围查询

上面的两种都是较为精确的查询。既然有精确查询,那就会有范围查询,通常在范围查询中使用此类条件判断。具体的案例,比如要查询id>1的数据则

image.png

spark 处理

image.png

flink 处理

image.png

此类逻辑的判断与编程语言中的逻辑判断一样,满足组合,与或关系等。诸如区间查询,可以使用类似 >(=) and <(=) 或者between...and...。 下面主要演示一下 between...and...

mysql 执行结果

image.png

spark 执行结果 image.png

flink 执行结果

image.png

需要值得注意的是,between...and...是双闭区间。也不知道为什么,有的人刚开始学的时候,就是会记错闭区间这个。以至于要死记硬背才行。没错,说的有的人就是我。事实证明只要吃够了亏,也就足以让一个人长记性了。

范围匹配还有一种情况,使用的是in来进行查询。诸如上面的部分语句可以改成

image.png in 可以用来做已知条件下的范围查询,通常在in的后面会跟随一个子查询来确定集合。但是在实际的生产中,in的查询也不能滥用,过多的条件会导致查询缓慢,一般在集合中元素超过100个,就不建议使用in查询。这在MySQL中需要留意,在spark与flink中就无须关注了,毕竟都在内存中进行计算。

spark

image.png

flink

image.png

WHERE 模糊查询

聊完了精确查询与模糊查询以后,最后将介绍一下模糊查询。通过使用关键字like实现模糊匹配。通常这种查询性能都不大好,尤其在使用错误的表达式以后,还会导致索引失效,从而导致慢查的出现。当然这也是在MySQL中要重点留意的事项。具体的语句表现为

image.png

spark

image.png

flink

image.png

关于like的具体使用方法以及会碰到的坑点,后面有专门的文章来介绍,此处就不展开了。

where 支持的逻辑操作符

OperatorDescription
=相等
!=不等
<小于
>大于
<=小于等于
>=大于等于
BETWEEN在区间查询
LIKE模糊查询模板
IN给定集合判断

总结

本文主要介绍了使用where语句进行精确、范围、模糊查询在三中不同的引擎下的具体表现与差异。在where的使用上,实际上差异并不明显。需要留意的主要是

  1. flink 文本查询需要强制用单引号;
  2. MySQL 的查询对编写对数据表接口的理解要求比较高,要正确的使用索引进行查询,避免出现慢查。而大数据的引擎对这方面的约束倒不会很高。