目录
一、基本查询
1.查询所有
select * from table_name;
2.查询单列
select column_name from table_name;
3.查询数据量
select count(*) from table_name;
4.过滤(where)
select * from table_name where column_name like ' XXX';
5.查找最大值(max)
select * from table_name order by column_name desc limit number;
6.分组统计(count)
select count(*) as 别名 from table_name group by column_name;
7.分组查找(group by)
select max(column_name) as 别名 from table_name group by column_name;
8.计算均值(avg)
select avg(column_name) from table_name group by column_name;
9.分组过滤(having)
select avg(column_name) from table_name group by column_name having 过滤条件;
10.关联表(join)
select a.column1,a.column2,b.column1,b.column2 from a join b on 关联条件;
11.左外关联(left join)
select a.column1,a.column2,b.column1,b.column2 from a left join b on 关联条件;
二、RLIKE正则匹配
字符 | 匹配 | 示例 |
. | 任意单个字符 | jav.匹配java |
[ ] | [ ]中任意一个字符 | java匹配j[ abc ]va |
^ | 在[ ]内的开头,匹配除[ ]内字符之外的任意一个字符 | java匹配j[ ^b-f ]va |
| | 或 | x | y 匹配x或y |
\ | 将下一个字符标记为特殊字符、文本、反向引用或八进制转义符 | \( 匹配 ( |
$ | 匹配输入字符串结尾的位置,如果设置RegExp对象的Multiline属性,$还会与“\n”或"\r"之前的位置匹配 | ;$匹配位于一行及外围的;号 |
* | 0次或多次匹配前面的字符 | zo*匹配zoo或z |
+ | 一次或多次匹配前面的字符 | zo+匹配zo或zoo |
? | 0次或一次匹配前面的字符 | zo?匹配z或zo |
p{n} | n是非负整数,正好匹配n次 | o{2}匹配food中的两个o |
p{n,} | 至少匹配n次 | o{2,}匹配foood中的所有o |
p{n,m} | m和n是非负整数,其中n<=m,匹配至少n次,至多m次 | o{1,3}匹配fooood中三个o |
\p{P} | 一个标点字符!“#$%&+,-./:;<=>?@[\]^_'{|}~” | J\p{P}a匹配J?a |
\b | 匹配一个字边界 | va\b匹配java中的va,但匹配不到javar中的va |
\B | 非字边界匹配 | va\B匹配javar中va,但匹配不到java中的va |
\d | 数字字符匹配 | 1[\\d]匹配13 |
\D | 非数字字符匹配 | [\\D]java匹配Jjava |
\w | 单词字符 | java匹配[\\w]ava |
\W | 非单词字符 | $java匹配[\\W]java |
\s | 空白字符 | Java 2匹配java\\s2 |
\S | 非空白字符 | java匹配j[\\S]va |
\f | 匹配换页符 | 等效于\x0c和\cJ |
\n | 匹配换行符 | 等效于\x0a和\cJ |
例:查找广东省的数据
例:查找用户地址是:XX省 XX市 XX区
例:查找用户姓为:张、王、邓
例:查找手机号符合:188***0***规则
三、union联合查询
union用于将多个select的结果组合成单个结果集。每个select语句返回的列的数量和名称必须相同,否则,将会引发架构错误。
基础语法:
select ...
union [ all ]
select ...
1.union基础查询
2.去重
语法:
select ... union select...
3.不去重
语法:
select ... union all select....
4.将union结果作为from对象
select column from (select ... union [all] select ...)
5.用于insert select
四、数据抽样(tablesample)
(1)随机分桶抽样
语法:
select ... from table_name tablesample(bucket x out of y on (colname | rand()))
注释:y表示将表数据随机划分成y份(y个桶)
x表示从y里面随机抽取x份数据作为取样
colname 表示随机的依据基于某个列的值(建议分桶表使用)
rand()表示随机的依据基于整行(普通表使用)
注意:
使用colname作为随机依据,则其他条件不变下,每次抽样的结果一致
使用rand()作为随机依据,每次抽样结果都不同
(2)基于数据块抽样
语法:
select ... from table_name tablesample(num rows | num percent | num(K|M|G));
num rows 表示抽取num条数据
num percent 表示抽样num百分百比例数据
num(K|M|G)表示抽取num大小的数据,单位可以是K、M、G表示KB、MB、GB
注意:
使用这种语法抽样,条件不变的话,每一次抽样的结果都一致,无法做到随机,只是按照数据顺序从前向后取。
五、虚拟列
虚拟列是Hive内置的可以在查询语句中使用的特殊标记,可以查询数据本身的详细参数。
目前Hive可用3个虚拟列:
input_ _file_ _name,显示数据行所在的具体文件
block_ _offset_ _inside_ _file,显示数据行所在文件的偏移量
row_ _offset_ _inside_ _block,显示数据所在的HDFS块的偏移量看,需要运行语句
SET hive.exec.rowoffset=true
虚拟列同样适用于where,group等查询语句