一、查询语句
1.基本语法
SELECT [ALL|DISTINCT] select_expr,select_expr,...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[ORDER BY col_list]
[CLUSTER BY col_list|[DISTRIBUTE BY col_list][SORT BY col_list]]
[LIMIT number]
- SQL语句大小写不敏感
- SQL可以写在一行或者多行
- 关键字不能被缩写也不能分行
- 各句子一般要分行写
- 使用缩进来提高语句的可读性
2.Where语句
使用WHERE子句,可以将不满足条件的行过滤掉。where子句紧随FROM子句。
where语句中的比较运算符
操作符 |
支持的数据类型 |
描述 |
A=B |
基本数据类型 |
如果A等于B则返回TRUE,反之返回FALSE |
A<=>B |
基本数据类型 |
如果A和B都为NULL,则返回TRUE,其他的和等号(=)操作符的结果一直,如果任意一位Null则结果为Null |
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 [NOT] BETWEEN B AND C |
基本数据类型 |
如果A,B或者C任一为Null,则返回Null。如果A的值大于等于B而且小于等于C,则结果为TRUE,反之为FALSE。如果使用NOT关键字则可以达到相反的效果。 |
A IS NULL |
所有数据类型 |
如果不等于Null,则返回TRUE,反之返回FALSE |
A IS NOT NULL |
所有数据类型 |
如果A本等于Null,则返回TRUE,反之返回FALSE |
IN(数值1,数值2) |
所有数据类型 |
使用IN运算显示列表中的值 |
A [NOT] LIKE B |
STRING类型 |
B是一个SQL下的简单正则表达式,如果A与其匹配的话,则返回TRUE;反之返回FALSE。B的表达式说明如下:'x%'表示A必须以字母x开头,'%x'表示A必须以字母x结尾,而'%x%'表示A包含字母x,可以是任何位置。如果使用NOT则可以达到反效果 |
A RLIKE B,A REGEXP B |
STRING类型 |
B是一个正则表达式,如果A与其匹配,则返回TRUE;反之返回FALSE。匹配使用的是JDK中的正则表达式接口实现的,因为正则也依据其中的规则。 |
- 使用Like运算选择类似的值
- 选择条件可以包换字符或者数字:%代表0个或者多个字符,_表示一个字符
- RLIKE子句是HIVE中这个功能的一个扩展,其可以通过JAVA的正则表达式这个更强大的语言来指定匹配条件。
3.逻辑运算符
操作符 |
含义 |
AND |
逻辑并 |
OR |
逻辑或 |
NOT |
逻辑否 |
4.Group by语句
GROUP BY语句通常会和聚合函数一起使用,按照一个或者多个列队结果进行分组,然后对每个组执行聚合操作。
5.Having语句
- Where针对表中的列发挥作用,查询数据;having针对查询结果中的列发挥作用,筛选数据。
- where后面不能写分组函数,而having后面可以使用分组函数
- having只用于group by分组统计语句
二、join连接
Hive支持通常的SQLJOIN语句,但是只支持等值连接,不支持非等值连接。
- JOIN ON:内连接只有进行连接的两个表中都存在与连接条件相匹配的数据才会被保留下来。
- LEFT JOIN ON:左外连接JOIN操作符左边表中符合Where子句的所有记录将会被返回。
- RIGHT JOIN ON:右外连接JOIN操作符右边表中符合WHERE子句的所有记录将会被返回。
- FULL JOIN ON:满外连接将会返回所有表中符合where语句条件的所有记录。如果任一表的指定字段满意符合条件的值的话,那么就使用Null代替。
三、排序
1.全局排序
Order By:全局排序,只会产生一个MapReduce
- ASC表示升序(默认)
DESC表示降序 - ORDER BY子句在SELECT语句的结尾
- 实例
select * from emp order by sal desc;
2.MapReduce内部排序(Sort By)
设置reduce个数
set mapreduce.job.reduces=3;
查询实例
select * from emp sort by empno desc;
查询并将结果导入到文件中
insert overwrite local directory '/opt/datas/sortby' select * from emp sort by deptno desc;
3.分区排序(Distribute By)
Distribute By:类似MapReduce中partition,进行分区,结合sort by使用,Hive要求Distribute By要写在Sort by语句之前。
对于Distribute By进行测试,一定要分配多reduce进行处理,否则无法看见Distribute By的效果。
insert overwrite local directory '/opt/dates/distribute' select * from emp distribute by deptno sort by empno desc;
3.Cluster By
当Distribute By和sorts by字段相同的时候,可以使用Cluster By方式。
Cluster By除了具有Distribute By的功能之外还具有sort by的功能。但是排序只能是倒序排序,不能指定排序规则。
select * from emp cluster by deptno;
select * from emp distribute by deptno sort by deptno;
这两种排序方式是等价的