文章目录
- 1. SQL
- 1.1. 初始化操作
- 1.2. 数据定义语言DDL(==Data Definition Language==)
- 1.3. 数据操纵语言DML(==Data Manipulation Language==)
- 1.4. 数据查询语言DQL(==Data Query Language==)
- 1.5. 数据控制语言DCL(==Data Control Language==)
- 2. HQL
- 2.1. 数据定义语言DDL
- 2.2. 数据操纵语言DML
- 2.3. 数据查询语言DQL
- 2.4. 桶表的相关案例
- 2.5. Hive 的集合类型
- 2.6. Hive 严格模式
- 2.7. [Hive参数配置方式](https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties)
- 2.8. [Hive 函数](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF)
- 2.9. [hive面试套路 - 累计报表](https://blog.csdn.net/u012808902/article/details/77874722)
- 3. FLINK-SQL
- 3.1. [Flink最锋利的武器:Flink SQL入门和实战 ](https://blog.csdn.net/u013411339/article/details/93267838?depth_1-utm_source=distribute.pc_relevant_right.none-task-blog-OPENSEARCH-1&utm_source=distribute.pc_relevant_right.none-task-blog-OPENSEARCH-1)
- 3.2. [Flink1.10集成Hive快速入门](https://mp.weixin.qq.com/s/EQIDS-DEmo4Ld-N4s1W_Iw)
- 4. 微语:你的每个点赞,我都认真当成了喜欢
1. SQL
1.1. 初始化操作
- 链接数据库
mysql -h 192.168.1.30 -P 3306 -uroot -p123456
- 退出数据库
exit/quit/ctrl+d
- 显示时间
select now();
- 显示数据库的版本
select version();
1.2. 数据定义语言DDL(Data Definition Language)
- 关键词:
create
alter
drop
truncate(删除当前表再新建一个一模一样的表结构)
- 创建数据库create database
hadoop-01
charset=utf8; # 注意有特殊字符时,用tab键上面的字符引起来 - 查看所有的数据库/表
show databases/tables
- 查看创建数据库的语句
show create database db_test;
\G格式化,在终端可以直接拷贝出sql语句 - 查看当前使用的数据库
select database();
- 使用数据库
use db_test;
- 删除数据库
drop database db_test;
- 创建表
- 格式
- auto_increment表示自动增长
- not null 表示不能为空
- primary key 表示主键
- default 默认值
- create table 数据表名字 (
字段
类型
约束
[, 字段 类型 约束]);
- 实例
-
create table xxxxx(id int, name varchar(30));
-
create table yyyyy(id int primary key not null auto_increment, name varchar(30));
-
创建students表(id、name、age、high、gender、cls_id)
create table students( id int unsigned not null auto_increment primary key, name varchar(30), age tinyint unsigned default 0, high decimal(5,2), gender enum("男", "女", "中性", "保密") default "保密", cls_id int unsigned, is_delete bit default 0 );
-
- 格式
- 查看表结构
desc xxxxx;
- 查看创建表的创建语句
show create table xxxxx;
\G格式化,在终端可以直接拷贝出sql语句 - 修改表
-
增加列
alter table 表名 add 列名 类型;
alter table students add birthday datetime;
-
修改字段:不重命名字段
alter table 表名 modify 列名 类型及约束
alter table students modify birthday date;
-
修改表-修改字段:重命名字段
alter table 表名 change 原名 新名 类型及约束;
alter table students change birthday birth date default "2020-03-30";
-
修改表-删除字段
alter table 表名 drop 列名;
alter table students drop high;
-
- 删除表
drop table xxxxx;
- 复制表结构,不包含数据
create table stu like students;
- 复制表结构和数据
create table stu1 (select * from students);
1.3. 数据操纵语言DML(Data Manipulation Language)
-
关键词:
insert
update
delete
-
注意点
- 开发中很少使用delete,删除有物理删除和逻辑删除,其中逻辑删除可以通过给表添加一个字段(isDel),若值为1,代表删除;若值为0,代表没有删除。此时,对数据的删除操作就变成了update操作了。
- truncate和delete的区别:
truncate是删除表,再重新创建这个表。属于DDL,delete是一条一条删除表中的数据,属于DML。
-
数据的增加
- 全列插入
insert [into] 表名 values(...)
-- auto_increment:从当前最大的自增值开始偏移,即使缺少了中间部分值,也可以指定,只要不冲突就可以,一般用0或者null insert into students values(0, "小李飞刀", 20,166.66,"女","1990-01-01",0); -- 是否删除位一般采用一个bit即可 insert into students values(null, "小李飞刀", 20,166.6,"女","1990-01-01",1); -- 枚举中 的 下标从1 开始 1---“男” 2--->"女".... insert into students values(null, "小李飞刀", 20,166.6,"2","1990-01-01",1);
- 部分插入
insert into 表名(列1,...) values(值1,...)
insert into students (name, gender) values ("小乔", 2);
- 多行插入
insert into students (name, gender) values ("大乔", 2),("貂蝉", 2); insert into students values(null, "小李飞刀", 20,166.6,"女","1990-01-01",1),(null, "小李飞刀", 20,166.6,"女","1990-01-01",1);
- 全列插入
-
修改数据
update 表名 set 列1=值1,列2=值2... where 条件;
-- 全部修改 update students set gender=1; -- 只要name是小李飞刀的 全部的修改 update students set gender=1 where name="小李飞刀"; -- 只要id为3的 进行修改 update students set gender=1 where id=3; -- 只要id为3的 进行修改,修改多列 update students set age=22, gender=1 where id=3;
-
删除数据
-
物理删除
delete from 表名 where 条件
delete from students; delete from students where name="小李飞刀";
-
逻辑删除
-- 用一个字段来表示 这条信息是否已经不能再使用了 -- 给students表添加一个is_delete字段 bit 类型 alter table students add is_delete bit default 0; update students set is_delete=1 where id=6;
-
1.4. 数据查询语言DQL(Data Query Language)
-
关键词
select
-
执行顺序
from
->where
->group by
->having
->order by
->select
- 其中select和from是必须的,其他关键词是可选的,这六个关键词的执行顺序与sql语句的书写顺序并不是一样的,而是按照下面的顺序来执行:
- from–where–group by–having–select–order by,
- from:需要从哪个数据表检索数据
- where:过滤表中数据的条件
- group by:如何将上面过滤出的数据分组
- having:对上面已经分组的数据进行过滤的条件
- select:查看结果集中的哪个列,或列的计算结果
- order by :按照什么样的顺序来查看返回的数据
-
注意点
- group by 通常和聚合函数(avg(),count()…)一起使用 ,经常先使用group by关键字进行分组,然后再进行集合运算。
- group by与having 一起使用,可以限制输出的结果,只有满足条件表达式的结果才会显示。
- having和where的区别:
where作用于表或视图,是表和视图的查询条件。having作用于分组后的记录,用于选择满足条件的组。
-
查询
/*查询所有字段*/ -- select * from 表名; -- 查询指定字段 select 列1,列2,... from 表名; select name, age from students; -- 使用 as 给字段起别名 select 字段 as 名字.... from 表名; select name as 姓名, age as 年龄 from students; -- 可以通过 as 给表起别名 select 别名.字段 .... from 表名 as 别名; select s.name, s.age from students as s; -- 消除重复行 distinct 字段 select distinct gender from students;
-
条件查询
-
比较运算符(
<,``>
,<=
,>=
,!=
,=
)-- 查询大于18岁的信息 select * from students where age > 18; -- 查询不等于18岁的信息 -- != 或者 <> select * from students where age <> 18;
-
逻辑运算符(
and
,or
,not
)-- 18到28之间的所以学生信息 select * from students where age>18 and age<28; -- 18岁以上的女性 select * from students where age>18 and gender="女"; select * from students where age>18 and gender=2; -- 18以上或者身高超过过180(包含)以上 select * from students where age>18 or height>=180; -- 不在 18岁以上的女性 这个范围内的信息 -- select * from students where not age>18 and gender=2; select * from students where not (age>18 and gender=2); -- 年龄不是小于或者等于18 并且是女性 select * from students where (not age<=18) and gender=2;
-
-
模糊查询(
like
,rlike
)-- like % 替换1个或者多个 _ 替换1个 -- 查询姓名中 以 "小" 开始的名字 select name from students where name like "小%"; -- 查询姓名中 有 "小" 所有的名字 select name from students where name like "%小%"; -- 查询有2个字的名字 select name from students where name like "__"; -- 查询至少有2个字的名字 select name from students where name like "__%"; -- rlike 正则 -- 查询以 周开始的姓名 select name from students where name rlike "^周.*"; -- 查询以 周开始、伦结尾的姓名 select name from students where name rlike "^周.*伦$";
-
范围查询
-- in (1, 3, 8)表示在一个非连续的范围内 -- 查询 年龄为18、34的姓名 select name,age from students where age in (12, 18, 34); -- not in 不非连续的范围之内 -- 年龄不是 18、34岁之间的信息 select name,age from students where age not in (12, 18, 34); -- between ... and ...表示在一个连续的范围内 -- 查询 年龄在18到34之间的的信息 select name, age from students where age between 18 and 34; -- not between ... and ...表示不在一个连续的范围内 -- 查询 年龄不在在18到34之间的的信息 select * from students where age not between 18 and 34; select * from students where not age between 18 and 34; -- 失败的查询案例 select * from students where age not (between 18 and 34);
-
空判断
-- 判空is null -- 查询身高为空的信息 select * from students where height is null; -- 判非空is not null select * from students where height is not null;
-
排序
order by
-- 查询年龄在18到34岁之间的男性,按照年龄从小到大排序 select * from students where (age between 18 and 34) and gender=1 order by age asc; -- 查询年龄在18到34岁之间的女性,身高从高到矮排序 select * from students where (age between 18 and 34) and gender=2 order by height desc; -- order by 多个字段 -- 查询年龄在18到34岁之间的女性,身高从高到矮排序, 如果身高相同的情况下按照年龄从小到大排序 select * from students where (age between 18 and 34) and gender=2 order by height desc,id desc; -- 查询年龄在18到34岁之间的女性,身高从高到矮排序, 如果身高相同的情况下按照年龄从小到大排序, -- 如果年龄也相同那么按照id从大到小排序 select * from students where (age between 18 and 34) and gender=2 order by height desc,age asc,id desc; -- 按照年龄从小到大、身高从高到矮的排序 select * from students order by age asc, height desc;
-
聚合函数
-- 总数count -- 查询男性有多少人,女性有多少人 select count(*) as 男性人数 from students where gender=1; select count(*) as 女性人数 from students where gender=2; -- 最大值/最小值 max/min -- 查询最大的年龄 select max(age) from students; -- 查询女性的最高 身高 select max(height) from students where gender=2; -- 求和 sum -- 计算所有人的年龄总和 select sum(age) from students; -- 平均值 avg -- 计算平均年龄 select avg(age) from students; -- 计算平均年龄 sum(age)/count(*) select sum(age)/count(*) from students; -- 四舍五入 round(123.23 , 1) 保留1位小数 -- 计算所有人的平均年龄,保留2位小数 select round(sum(age)/count(*), 2) from students; select round(sum(age)/count(*), 3) from students; -- 计算男性的平均身高 保留2位小数 select round(avg(high), 2) from students where gender=1;
-
分组(和聚合配合使用)
-- group by 先分组,从组里面取数据 -- 按照性别分组,查询所有的性别 select gender from students group by gender; -- 失败select * from students group by gender; 查询列当中必须包含分组的字段,并能用* -- 计算每种性别中的人数 select gender,count(*) from students group by gender; -- 计算男性的人数 select gender,count(*) from students where gender=1 group by gender; -- group_concat(...) -- 查询同种性别中的姓名 select gender,group_concat(name) from students where gender=1 group by gender; select gender,group_concat(name, age, id) from students where gender=1 group by gender; select gender,group_concat(name, "_", age, " ", id) from students where gender=1 group by gender; -- having -- 查询平均年龄超过30岁的性别,以及姓名 having avg(age) > 30 select gender, group_concat(name),avg(age) from students group by gender having avg(age)>30; -- 查询每种性别中的人数多于2个的信息 select gender, group_concat(name) from students group by gender having count(*)>2;
-
分页查询
-- limit start, count -- 限制查询出来的数据个数 select * from students where gender=1 limit 2; -- 查询前5个数据 select * from students limit 0, 5; -- 每页显示2个,第1个页面 select * from students limit 0,2; -- 每页显示2个,第2个页面 select * from students limit 2,2; -- 每页显示2个,第3个页面 select * from students limit 4,2; -- 每页显示2个,第4个页面 select * from students limit 6,2; -- -----> limit (第N页-1)*每个的个数, 每页的个数; -- 每页显示2个,显示第6页的信息, 按照年龄从小到大排序 -- 失败select * from students limit 2*(6-1),2; -- 失败select * from students limit 10,2 order by age asc; select * from students order by age asc limit 10,2;
-
链接查询
-- inner join ... on -- select ... from 表A inner join 表B; select * from students inner join classes; -- 查询 有能够对应班级的学生以及班级信息 select * from students inner join classes on students.cls_id=classes.id; -- 按照要求显示姓名、班级 select students.*, classes.name from students inner join classes on students.cls_id=classes.id; select students.name, classes.name from students inner join classes on students.cls_id=classes.id; -- 给数据表起名字 select s.name, c.name from students as s inner join classes as c on s.cls_id=c.id; -- 查询 有能够对应班级的学生以及班级信息,显示学生的所有信息,只显示班级名称 select s.*, c.name from students as s inner join classes as c on s.cls_id=c.id; -- 在以上的查询中,将班级姓名显示在第1列 select c.name, s.* from students as s inner join classes as c on s.cls_id=c.id; -- 查询 有能够对应班级的学生以及班级信息, 按照班级进行排序 -- select c.xxx s.xxx from student as s inner join clssses as c on .... order by ....; select c.name, s.* from students as s inner join classes as c on s.cls_id=c.id order by c.name; -- 当时同一个班级的时候,按照学生的id进行从小到大排序 select c.name, s.* from students as s inner join classes as c on s.cls_id=c.id order by c.name,s.id; -- left join -- 查询每位学生对应的班级信息 select * from students as s left join classes as c on s.cls_id=c.id; -- 查询没有对应班级信息的学生 -- select ... from xxx as s left join xxx as c on..... where ..... -- select ... from xxx as s left join xxx as c on..... having ..... -- having 一般也用在多表关联之后的结果中取数据的条件 select * from students as s left join classes as c on s.cls_id=c.id having c.id is null; select * from students as s left join classes as c on s.cls_id=c.id where c.id is null; -- right join on -- 将数据表名字互换位置,用left join完成
-
子查询
-- 标量子查询 -- 查询出高于平均身高的信息 -- 查询最高的男生信息 select * from students where height = 188; select * from students where height = (select max(height) from students); -- 列级子查询 -- 查询学生的班级号能够对应的学生信息 -- select * from students where cls_id in (select id from classes);
1.5. 数据控制语言DCL(Data Control Language)
- 关键字:
用户
,权限
,事务
。 - MySQL:事务与DCL
2. HQL
2.1. 数据定义语言DDL
-
建表语句及说明
-
显示当前在哪个数据库下面
select current_database();
-
强制删除有数据的数据库
drop database db_test cascade;
-
显示分区表中的分区
show partitions table_name;
-
显示函数
show functions;
-
执行查看表结构(更为详细)
desc formatted table_name;
-
分区表的创建
create table if not exists t_invites(id int, name string) partitioned by(cls string) row format delimited fields terminated by ',' lines terminated by '\n' stored as textfile;
-
内部表和外部表
-
区别
- 内部表数据由Hive自身管理,外部表数据由HDFS管理;
- 内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定(如果没有LOCATION,Hive将在HDFS上的/user/hive/warehouse文件夹下以外部表的表名创建一个文件夹,并将属于这个表的数据存放在这里);
- 删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除;
- 对内部表的修改会将修改直接同步给元数据,而
对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name;)
注意: 在创建外部表时,要保证指定的location目录下面没有其他的“脏文件或者文件夹”
-
内部表
-
创建
create table t1( id int ,name string ,hobby array<string> ,add map<String,string> ) row format delimited fields terminated by ',' collection items terminated by '-' map keys terminated by ':' ;
-
装载数据
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
1,xiaoming,book-TV-code,beijing:chaoyang-shagnhai:pudong 2,lilei,book-code,nanjing:jiangning-taiwan:taibei 3,lihua,music-book,heilongjiang:haerbin
load data inpath '/user/hadoop/xiaofan/data/tmp/t1.data' into table t1;
-
查看表数据
-
-
外部表
- 创建
create external table t2( id int ,name string ,hobby array<string> ,add map<String,string> ) row format delimited fields terminated by ',' collection items terminated by '-' map keys terminated by ':' location '/user/hadoop/xiaofan/data/tmp'
- 表信息
- 创建
-
-
MSCK REPAIR TABLE命令
主要是用来解决通过hdfs dfs -put或者hdfs api写入hive分区表的数据在hive中无法被查询到的问题
-
修改表
2.2. 数据操纵语言DML
-
Load操作
-
INSERT(将查询结果插入Hive表)
-
导出数据表
2.3. 数据查询语言DQL
-
Hive 区分cluster by、distribute by + sort by、order by以及创建表带有clustered by和sort by
-
Hive join(只支持等值链接,和sql用法类似)
2.4. 桶表的相关案例
2.5. Hive 的集合类型
2.6. Hive 严格模式
2.7. Hive参数配置方式
2.8. Hive 函数
2.9. hive面试套路 - 累计报表
- 要求输出每个客户在每个月的总访问次数,以及在当前月份之前所有月份的累积访问次数。