前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WHERE语句

WHERE语句

作者头像
DataScience
发布2019-12-30 11:14:38
9090
发布2019-12-30 11:14:38
举报
文章被收录于专栏:A2DataA2Data
WHERE语句

SELECT语句用于选取字段,WHERE语句用于过滤条件,两者结合使用可以查找到符合过滤条件的记录。之前我们已经在很多简单例子中使用过它了,现在我们深入学习一下它吧。

WHERE语句使用谓词表达式,对于列应用在谓词操作符上的情况,稍后我们将进行讨论。有几种谓词表达式可以使用AND和OR相连接。当谓词表达式计算结果为true时,相应的行将被保留并输出。

注:WHERE后面是不可以使用别名的,如果想使用别名,那可以使用嵌套语句去查询。

1.谓词操作符

下面这些谓词操作符可以用于JOIN... ON和HAVING语句中。

操作符

支持的数据类型

描述

A=B

基本数据类型

如果A等于B则返回TRUE,反之返回FLASE

A<=>B

基本数据类型

如果A和B都为NULL则返回TRUE,其他的和等号(=)操作符的结果一致,如果任一为NULL则结果为NULL

A==B

没有

这个是错误的语法!SQL使用=,而不是==

A<>B,A!=B

基本数据类型

A或者B为NULL则返回NULL;如果A不等于B则返回TRUE,反之返回FALSE

A<=B

基本数据类型

A或者B为NULL则返回NULL;如果A小于或等于B则返回TRUE,反之返回FALSE

A>B

基本数据类型

A或者B为NULL则返回NULL;如果A大于B则返回TRUE,反之返回FALSE

A>=B

基本数据类型

A或者B为NULL则返回NULL;如果A大于或等于B则返回TRUE,反之返回FALSE

A[NOT] BETWEEN B AND C

基本数据类型

如果A,B或者C任一为NULL,则结果为NULL,如果A的值大于或等于B而且小于或等于C,则结果为TRUE,反之为FLASE。如果使用NOT关键字则可达到相反的效果

A IS NULL

所有数据类型

如果A等于NULL则返回TRUE;反之返回FLASE

A IS NOT NULL

所有数据类型

如果A不等于NULL则返回TRUE;反之返回FLASE

A [NOT] LIKE B

STRING 类型

B是一个SQL下的简单正则表达式,如果A与其匹配的话,则返回TRUE;反之返回FLASE。B的表达式说明如下:'x%'表示A必须以字母'x'开头,'%x'表示A必须以字母'x'结尾,而'%x%'表示A包含有字母'x',可以位于开头,结尾或者字符串中间。类似地,下划线'_'匹配单个字符。B必须要和整个字符串A相匹配才行。如果使用NOT关键字则可达到相反的效果

A RLIKE B,A REGEXP B

STRING 类型

B是一个正则表达式,如果A与其相匹配,则返回TRUE;反之返回FLASE。匹配使用的是JDK中的正则表达式接口实现的,因为正则规则也依据其中的规则。例如,正则表达式必须和整个字符串A想匹配,而不是只需与其子字符串匹配。

2.关于浮点数比较

浮点数比较的一个常见陷井出现在不同类型间做比较的时候(也就是FLOAT和DOUBLE比较)。

eg:下面这个对员工的查询语句,该语句将返回员工姓名,工资和联邦税,过滤条件是薪水的减免税款超过0.2(之前定义的deductions的map的值是FLOAT类型的)

代码语言:javascript
复制
hive> SELECT name,salary,deductions['Federal Taxes']
    > FROM employees WHERE deductions['Federal Taxes']>0.2;
John    Doe    100000.0    0.2
Mary    Smith    80000.0    0.2
Boss    Man    200000.0    0.3
Fred    Finance    150000.0    0.3

Wait!为什么deductions['Federal Taxes']=0.2的记录也被输出了?

这是Hive的Bug吗?这其实反映了内部是如何进行浮点数比较的,这个问题几乎影响了在现在数字计算机中所有使用各种各样编程语言编写的软件。

实际上我们可以说0.2对于FLOAT类型是0.2000001,而对于DOUBLE类型是0.200000000001。这是因为一个8字节的DOUBLE值具有更多的小数位。当表中的FLOAT值通过Hive转换为DOUBLE值时,其产生的DOUBLE值是0.200000100000,这个值实际要比0.200000000001大。这就是为什么这个查询结果像是使用了>=似的。

这个问题并非仅仅存在于Hive中或Java中,而其他系统也会出现这个问题。

Hive有两种规避这个问题的方法。

1.如果使用存储格式为TEXTFILE,那么Hive会从数据文件中读取字符串"0.2",然后将其转换成一个真实的数字。我们可以在表模式中定义对应的字段类型为DOUBLE而不是FLOAT,这样我们就可以对deductions['Federal Taxes']这个DOUBLE值和0.2这个DOUBLE值进行比较。

2.使用cast操作符改变数据类型

eg:下面是修改后的语句和结果

代码语言:javascript
复制
hive> SELECT name,salary,deductions['Federal Taxes']
                 > FROM employees WHERE deductions['Federal Taxes']>cast(0.2 AS FLOAT);
Boss    Man    200000.0    0.3
Fred    Finance    150000.0    0.3

为什么上帝看到思考的人会笑?那是因为人在思考,却又抓不住真理。因为人越思考,一个人的思想就越跟另一个人的思想相隔万里。 ——米兰·昆德拉

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DataScience 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档