Contents

50道HQL题

1.表格设计

学生表student,字段:学号s_id、姓名s_name、生日s_birth、性别s_sex

课程表course,字段:课程编号c_id、课程名c_name、老师编号t_id

老师表teache,字段:老师编号t_id、老师姓名t_name

成绩表score,字段:学号s_id、课程编号c_id、成绩s_score

2.数据

1
mkdir /home/forsre/hql && cd /home/forsre/hql

2.1学生表student.csv

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
tee student.csv <<-'EOF'
01,赵雷,1990-01-01,男
02,钱电,1990-12-21,男
03,孙风,1990-05-20,男
04,李云,1990-08-06,男
05,周梅,1991-12-01,女
06,吴兰,1992-03-01,女
07,郑竹,1989-07-01,女
08,王菊,1990-01-20,女                   
EOF

2.2课程表course.csv

1
2
3
4
5
tee course.csv <<-"EOF"
01,语文,02
02,数学,01
03,英语,03
EOF

2.3教师表teacher.csv

1
2
3
4
5
tee teacher.csv <<-"EOF"
01,张三
02,李四
03,王五
EOF

2.4成绩表score.csv

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
tee score.csv <<-"EOF"
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
EOF

3.建表语句

1
2
3
4
5
6
7
create database hql;
use hql;

create table student(s_id string,s_name string,s_birth string,s_sex string) row format delimited fields terminated by ',';
create table course(c_id string,c_name string,t_id string) row format delimited fields terminated by ',';
create table teacher(t_id string,t_name string) row format delimited fields terminated by ',';
create table score(s_id string,c_id string,s_score int) row format delimited fields terminated by ',';

4.数据装载

1
2
3
4
load data local inpath '/home/forsre/hql/student.csv' into table student;
load data local inpath '/home/forsre/hql/course.csv' into table course;
load data local inpath '/home/forsre/hql/teacher.csv' into table teacher;
load data local inpath '/home/forsre/hql/score.csv' into table score;

5.查询需求

1
2
#对齐表头或者通过dbeaver或者datagrip
beeline -u jdbc:hive2://hadoop161:10000 -n forsre

5.1 查询01课程比02课程成绩高的学生的信息及课程分数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
select stu.*, 01_score.s_score as 01_score, 02_score.s_score as 02_score
from student as stu
join score as 01_score 
on stu.s_id=01_score.s_id 
and 01_score.c_id='01'
left join score as 02_score 
on stu.s_id=02_score.s_id
and 02_score.c_id='02'
where 01_score.s_score > 02_score.s_score
or 02_score.s_score is null and 01_score.s_score is not null;

/*
+-----------+-------------+--------------+------------+-------------------+-------------------+--+
| stu.s_id  | stu.s_name  | stu.s_birth  | stu.s_sex  | 01_score  | 02_score  |
+-----------+-------------+--------------+------------+-------------------+-------------------+--+
| 02        | 钱电          | 1990-12-21   | 男          | 70                | 60                |
| 04        | 李云          | 1990-08-06   | 男          | 50                | 30                |
| 06        | 吴兰          | 1992-03-01   | 女          | 31                | NULL              |
+-----------+-------------+--------------+------------+-------------------+-------------------+--+
3 rows selected (15.03 seconds)
*/

2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
select stu.*, 01_score.s_score, 02_score.s_score
from student as stu
full outer join score as 01_score 
on stu.s_id=01_score.s_id 
and 01_score.c_id='01'
left join score as 02_score 
on stu.s_id=02_score.s_id
and 02_score.c_id='02'
where 01_score.s_score < 02_score.s_score
or 01_score.s_score is null and 02_score.s_score is not null
order by s_id;

/*


*/

3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩:

1

4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩: – (包括有成绩的和无成绩的)

5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩:

6、查询"李"姓老师的数量:

7、查询学过"张三"老师授课的同学的信息:

8、查询没学过"张三"老师授课的同学的信息:

9、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息:

10、查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息:

11、查询没有学全所有课程的同学的信息:

12、查询至少有一门课与学号为"01"的同学所学相同的同学的信息:

13、查询和"01"号的同学学习的课程完全相同的其他同学的信息:

14、查询没学过"张三"老师讲授的任一门课程的学生姓名:

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

16、检索"01"课程分数小于60,按分数降序排列的学生信息:

17、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩:

18.查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率:

19、按各科成绩进行排序,并显示排名:

20、查询学生的总成绩并进行排名:

21、查询不同老师所教不同课程平均分从高到低显示:

22、查询所有课程的成绩第2名到第3名的学生信息及该课程成绩:

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

24、查询学生平均成绩及其名次:

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

26、查询每门课程被选修的学生数:

27、查询出只有两门课程的全部学生的学号和姓名:

28、查询男生、女生人数:

29、查询名字中含有"风"字的学生信息:

30、查询同名同性学生名单,并统计同名人数:

31、查询1990年出生的学生名单:

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

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

34、查询课程名称为"数学",且分数低于60的学生姓名和分数:

35、查询所有学生的课程及分数情况:

36、查询任何一门课程成绩在70分以上的学生姓名、课程名称和分数:

37、查询课程不及格的学生:

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

39、求每门课程的学生人数:

40、查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩:

41、查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩:

42、查询每门课程成绩最好的前三名:

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

44、检索至少选修两门课程的学生学号:

45、查询选修了全部课程的学生信息:

46、查询各学生的年龄(周岁):

47、查询本周过生日的学生:

48、查询下周过生日的学生:

49、查询本月过生日的学生:

50、查询12月份过生日的学生: