其实HIVE的SQL和MySQL的语法基本类似。
一、数据库
创建数据库
create database 数据库名;
查看数据库
show databases;
切换数据库
use database 数据库名
二、表
创建表
方式一:
create table 表名(
字段名 字段类型,
字段名 字段类型
) row format delimited
fields terminated by "" 使用分隔符
方式二:
create table 表名 as (查询语句查询的结果)
三、加载数据
传统的数据库添加数据使用的是insert,但是这里官方推荐使用load进行数据加载。
数据加载有两种方式:复制形式的加载,移动形式的加载。
命令:
load data local inpath 要加载的文件地址 into table 对应文件的表名
这里加载的是服务器本地的文件系统中的文件,此时是一种纯复制操作。
load data inpath 要加载的文件地址 into table 对应文件的表名
这里加载的是HDFS系统中的文件,此时是一种纯移动操作。
insert插入数据,要启动MR进行计算,所以插入时间会比较长。不过在这里可以使用insert+select进行数据查询插入。
insert into table 表名 查询语句获取相同字段的记录进行批量插入
四、查询数据
1、基本查询语法
HIVE的基本查询语句是与常规的SQL语句一致的。
select current_database(); 查询当前看数据库
2、去重
去重使用distinct,放在字段名之前可以根据当前字段进行去重。也可以放在返回结果的多个字段前,就会对多个字段同时去重。
3、where
where查询,其后面是跟一个布尔值
4、聚合函数
AVG(cloumn) 计算平均值
count(cloumn) 统计数量,不包括null
count(*) 统计数量,包括null
max(cloumn) 统计该字段内最大值
min(cloumn) 统计该字段内最小值
sun(cloumn) 对该字段数据求和
5、分组
group by 字段 :按字段进行分组,字段可以是多个,就是按照多个字段进行分组
限制:返回的结果中的字段必须是分组的字段或在聚合函数之中,否则报错。
6、having
having 后面也是布尔类型过滤,他要放在分组之后。
having和where的区别:
having | where |
分组后执行 | 分组前执行 |
可以使用聚合函数 | 不可以使用聚合函数 |
7、排序
orderBy 字段 排序:根据某个字段进行排序 ,也可以根据多个字段进行排序
排序分两种:升序排序(asc) 、降序排序(desc)
默认排序是升序排序。
8、限制
limit 数量 n:显示前n条数据
limit n,m :从n开始,显示m条数据
索引从0开始
执行顺序:
from > where > group by > having > order by > limit > select
示例:
select * from 表
where 条件
group by 字段
having 条件
order by 字段 顺序
limit n|[n,m]
9、关联查询
内连接
select * from A inner join B where =
select * from A join B where =
select * from A,B where =
左连接
select * from A inner left join B where =
在关联查询中,内连接是只将关联到的记录进行展示。外连接则是对所有的记录进行展示,在关联不到的记录中所对应的数据为空。
左连接查询,是以左表为主表,再对右表进行关联,能关联到的显示关联数据,关联不到的只展示左边数据,右表字段为null。右连接相反。
10、内置函数
操作字符串的:
length(str) 查看某个数据的长度
reverse(str) 将字符串进行反转
concat(str1, str2, strArr) 对字符串进行拼接
concat_ws(分隔符,str1, str2, strArr) 对字符串进行分隔符拼接
substr(int start,int length) |substring(int start,int length) 对字符串进行截取 索引是从1开始的
split(str,分隔符) 对字符串进行分割 返回值是一个数组
操作日期的:
current_date();获取当前时间
unix_timestamp():获取当前时间的时间戳
unix_timestamp(date,时间格式):获取自定义的时间的时间戳
from_unixtime(时间戳,自定义的时间格式):将时间戳转换为固定格式的时间
date_diff(时间1,时间2):获取两个时间的天数差
date_add(时间1,int n) :添加几天
date_sub(时间1,int n) :减少几天
数学函数
round(double b) 四舍五入
round(double b,int a):保留a位小数
rand() :获取随机数(0-1)
rand(int n):获取固定数,在随机数获取后就会固定
条件函数
if(boolean b,成功默认值,失败默认值) :判断后可以得到默认值,只能有两个
case str when str1 默认1 when str2 默认2 else 默认3 end :可以判断多个条件