Mysql、Hive语法对比

Mysql 
——————学生表——----
CREATE table student(
student_id varchar(4) ---学生编号
,name      varchar(20) ---学生姓名
,birthday  varchar(10) ---学生生日
,sex       varchar(2) ---学生性别
);

CREATE TABLE `student` (
  `student_id` varchar(4) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `name` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `birthday` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `sex` varchar(2) COLLATE utf8mb4_unicode_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

HIVE
——————学生表——————
create table study.student (
     student_id   string  -- 学生编号
    ,name         string  -- 学生姓名
    ,birthday     string  -- 学生生日
    ,sex          string  -- 学生性别
)
stored as parquet
tblproperties("orc.compress"="snappy");


Mysql 
——————教师表——----
CREATE table teacher(
teacher_id varchar(4) 
,name      varchar(20) 
);

HIVE
——————教师表——————
create table study.teacher (
     teacher_id   string  -- 教师编号
    ,name         string  -- 教师姓名
)
stored as parquet
tblproperties("orc.compress"="snappy");


Mysql 
——————课程表——----
CREATE table course(
course_id   varchar(4) 
,name       varchar(20) ,teacher_id varchar(4) 
);

HIVE
——————课程表——————

create table study.course (
     course_id    string  -- 课程编号
    ,name         string  -- 课程名
    ,teacher_id   string  -- 课程对应的教师编号
)
stored as parquet
tblproperties("orc.compress"="snappy");


Mysql 
——————成绩表——----
CREATE table score(
 student_id  varchar(4)
,course_id   varchar(4) 
,score       int
);

Hive
——————成绩表——----

create table study.score (
     student_id   string  -- 学生编号
    ,course_id    string  -- 课程编号
    ,score        int     -- 对应的成绩
)
stored as parquet
tblproperties("orc.compress"="snappy");

答题时请注意:

1、这里认为课程可能是选修课,学生不一定学了所有课程
2、成绩表里的课程都应该在课程表里存在,而且每门课程都应该有对应的教师,且在教师表里可以找到
3、成绩表里的学生也应该在学生表里存在
4、下面的导入数据也是随机写的,读者也可以自己随机制造生成数据导入

导入数据

----------学生表----------
insert into  student(student_id,name,birthday,sex)
VALUES
('01','赵雷','1990-01-01','男'),
('01' , '赵雷' , '1990-01-01' , '男'),
('02' , '钱电' , '1990-12-21' , '男'),
('03' , '孙风' , '1990-12-20' , '男'),
('04' , '李云' , '1990-12-06' , '男'),
('05' , '周梅' , '1991-12-01' , '女'),
('06' , '吴兰' , '1992-01-01' , '女'),
('07' , '郑竹' , '1989-01-01' , '女'),
('09' , '张三' , '2017-12-20' , '女'),
('10' , '李四' , '2017-12-25' , '女'),
('11' , '李四' , '2012-06-06' , '女'),
('12' , '赵六' , '2013-06-13' , '女'),
('13' , '孙七' , '2014-06-01' , '女');


----------------删除重复记录,只保留一条----------
------新建临时表tmp_ytx-------
create table tmp_ytx as 
select distinct *
from student;

---------删除原表student,把临时表tmp_ytx重命名为student---------
drop table student;
rename table tmp_ytx to student;

—————————— HIVE ——------
insert overwrite table study.student VALUES
('01' , '赵雷' , '1990-01-01' , '男'),
('02' , '钱电' , '1990-12-21' , '男'),
('03' , '孙风' , '1990-12-20' , '男'),
('04' , '李云' , '1990-12-06' , '男'),
('05' , '周梅' , '1991-12-01' , '女'),
('06' , '吴兰' , '1992-01-01' , '女'),
('07' , '郑竹' , '1989-01-01' , '女'),
('09' , '张三' , '2017-12-20' , '女'),
('10' , '李四' , '2017-12-25' , '女'),
('11' , '李四' , '2012-06-06' , '女'),
('12' , '赵六' , '2013-06-13' , '女'),
('13' , '孙七' , '2014-06-01' , '女');

----------------- 教师表 ---------------
Mysql

insert into teacher(teacher_id,name) VALUES
('01' , '张三'),
('02' , '李四'),
('03' , '王五');

SELECT * from teacher;

HIVE
insert overwrite table study.teacher VALUES
('01' , '张三'),
('02' , '李四'),
('03' , '王五');


----------------- 课程表 ---------------
Mysql

insert into course(course_id,name,teacher_id) VALUES
('01' , '语文' , '02'),
('02' , '数学' , '01'),
('03' , '英语' , '03');

SELECT * from course;

HIVE
insert overwrite table study.course VALUES
('01' , '语文' , '02'),
('02' , '数学' , '01'),
('03' , '英语' , '03');


----------------- 课程表 ---------------
Mysql
insert into score(student_id,course_id,score) VALUES
('01' , '01' , 80),
('01' , '02' , 90),
('01' , '03' , 99),
('02' , '01' , 70),
('02' , '02' , 60),
('02' , '03' , 80),
('03' , '01' , 80),
('03' , '02' , 80),
('03' , '03' , 80),
('04' , '01' , 50),
('04' , '02' , 30),
('04' , '03' , 20),
('05' , '01' , 76),
('05' , '02' , 87),
('06' , '01' , 31),
('06' , '03' , 34),
('07' , '02' , 89),
('07' , '03' , 98);


HIVE

insert overwrite table study.score VALUES
('01' , '01' , 80),
('01' , '02' , 90),
('01' , '03' , 99),
('02' , '01' , 70),
('02' , '02' , 60),
('02' , '03' , 80),
('03' , '01' , 80),
('03' , '02' , 80),
('03' , '03' , 80),
('04' , '01' , 50),
('04' , '02' , 30),
('04' , '03' , 20),
('05' , '01' , 76),
('05' , '02' , 87),
('06' , '01' , 31),
('06' , '03' , 34),
('07' , '02' , 89),
('07' , '03' , 98);

练习题

查询所有教师的全部信息(教师编号和姓名)

输出所有学生中男生的全部信息

查询所有学生中男生的全部信息,按照生日排降序

查询所有学生的全部信息,先按照性别排序,再按照生日排降序

求出学生总数

查询学生中男生、女生人数

参加考试的学生中,查出每个学生的学生编号、选了几门课

检索至少选修三门课程的学生学号

查询存在不及格的课程编号

输出所有课程的课程编号、课程名、对应的教师姓名

求每门课程的学生人数及平均分,输出课程编号、对应学生人数、平均分

求每门课程的学生人数及平均分,输出课程名称、对应学生人数、平均分

查询同时学习" 01 "课程和" 02 "课程的学生编号及01和02课程分数

查询" 01 "课程比" 02 "课程成绩高的学生编号及01和02课程分数

查询" 01 "课程比" 02 "课程成绩高的学生姓名及01和02课程分数

查询选择了 "01"课程但没选择 "02"课程的学生姓名

查询学过 '张三' 老师课程的所有同学姓名、生日、性别

查询同时学习 "01"、"02"课程学生的学生编号以及"01"和"02"课程成绩

查询学习 "01"课程但没有学习 "02"课程学生的学生编号以及"01"课程成绩

查询学习 "02"课程但没有学习 "01"课程学生的学生编号以及"02"课程成绩

查询选课的同学的学生姓名、选课总数、所有课程的成绩总和、课程平均分

查询考试平均分大于 60 分同学的学生姓名、选课总数、所有课程的成绩总和、课程平均分,按照科目数排降序、科目数相同按照分数排降序

检索 "01" 课程分数小于 60 分的学生信息及"01" 课程分数,按照分数排降序

查询两门及其以上不及格课程的同学的姓名及其平均成绩

查询没有学全所有课程的同学的编号 (包含无选课的同学)

查询 1990 年出生的学生名单

查询名字中含有「风」字的学生信息

查询「李」姓老师的数量

查询至少有两门课与学号为" 01 "的学生所学相同的学生id

查询选修了全部课程的学生id的姓名和姓名

查询和" 01 "号的同学学习的课程完全相同的其他同学的学生id

统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分比

查询学生的总成绩,并进行排名

查询各科成绩前三名的记录

查询出只选修两门课程的学生学号和姓名

查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列

查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩

查询课程名称为「数学」,且分数低于 60 的学生姓名和分数

查询课程编号为 01 且课程成绩在 80 分及以上的学生的学号和姓名

查询选修「张三」老师所授课程的学生中,成绩最高的学生编号、课程编号及其成绩

统计每门课程的学生选修人数(超过 5 人的课程才统计)。

查询该学生有不同课程但成绩相同的学生编号、课程编号、学生成绩


答案(请大家先独立思考后,再参考答案)


1、查询所有教师的全部信息(教师编号和姓名)

select *
  from study.teacher
;
2、输出所有学生中男生的全部信息

 select *
   from study.student
 where sex = '男'
 ;
3、查询所有学生中男生的全部信息,按照生日排降序

 select *
   from study.student
 where sex = '男'
 order by birthday desc
 ;
4、查询所有学生的全部信息,先按照性别排序,再按照生日排降序

 select *
   from study.student
 order by sex
         ,birthday desc
 ;
5、求出学生总数

 select count(*)
   from study.student
 ;
6、查询学生中男生、女生人数

 select sex
       ,count(*)
   from study.student
 group by sex
7、参加考试的学生中,查出每个学生的学生编号、选了几门课

 select student_id
     ,count(*) as course_count
   from study.score
 group by student_id
 ;
8、检索至少选修三门课程的学生学号

 select student_id
       ,count(*) as course_num
   from score
 group by student_id
 having course_num >= 3
 ;

9、查询存在不及格的课程编号

写法一
SELECT distinct course_id
from score
where score<60

写法二
SELECT course_id
from score
where score<60
GROUP BY course_id;----去重

10、输出所有课程的课程编号、课程名、对应的教师姓名

写法一
SELECT 
course.course_id,
course.name,
teacher.name
from course 
join teacher on course.teacher_id=teacher.teacher_id


写法二
select course_id
      ,a.name as course_name
      ,b.name as teacher_name
  from 
    (
        select course_id
              ,name 
              ,teacher_id
          from course
    ) a
join 
    (
        select teacher_id
              ,name
          from teacher
    ) b
  on a.teacher_id = b.teacher_id

 

你可能感兴趣的:(数据分析,sql)