8.sql和hsql以及flink-sql总结

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

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

在这里插入图片描述

2.4. 桶表的相关案例

在这里插入图片描述
在这里插入图片描述

2.5. Hive 的集合类型

在这里插入图片描述

2.6. Hive 严格模式

在这里插入图片描述

2.7. Hive参数配置方式

2.8. Hive 函数

在这里插入图片描述
在这里插入图片描述

2.9. hive面试套路 - 累计报表

  • 要求输出每个客户在每个月的总访问次数,以及在当前月份之前所有月份的累积访问次数。

3. FLINK-SQL

3.1. Flink最锋利的武器:Flink SQL入门和实战

3.2. Flink1.10集成Hive快速入门

4. 微语:你的每个点赞,我都认真当成了喜欢

猜你喜欢

转载自blog.csdn.net/fanjianhai/article/details/105191729