任务描述
本关任务:根据要求编写符合输出条件的SQL
。
相关知识
略
日期函数
本章节介绍MySQL
中的日期时间函数,下面列出常用的函数:
函数 | 说明 |
---|---|
NOW() | 当前日期和时间 |
CURDATE() | 当前日期 |
CURTIME() | 当前时间 |
DATE_ADD() | 日期变化 |
DATEDIFF() | 日期差值 |
DATE_FORMAT() | 日期格式化 |
YEAR() | 返回日期的年份 |
MONTH() | 返回日期的月份 |
WEEK() | 返回日期的周号 |
NOW()、CURDATE()和CURTIME()
NOW()
返回当前日期和时间;
CURDATE()
则单独返回当前日期,CURTIME()
则返回当前时间。
DATE_ADD()、DATEDIFF()和DATE_FORMAT()
DATE_ADD()
从函数名称来看会想当然的认为是时间的添加,但其实可以添加也可以减少,因此我们将其说明为日期的变化,第一个参数为指定时间,第二个参数为增加(减少)的单位值(YEAR
、MONTHS
、WEEK
、DAY
);
DATEDIFF()
函数则返回二个日期之间的差值;
DATE_FORMAT()
函数为日期格式化,也就是将我们常见的日期格式转换成另一种格式。
以下是在format
字符串中常用的说明符,更多的说明符可在 MySQL 官方文档中进行查看:
格式 | 描述 |
---|---|
%d | 月的天,数值(00-31 ) |
%H | 小时 (00-23 ) |
%h | 小时 (01-12 ) |
%m | 月,数值(00-12 ) |
%p | AM 或 PM |
%s | 秒(00-59 ) |
%T | 时间,24 -小时(hh:mm:ss ) |
%Y | 年,4 位 |
YEAR()和MONTH()
流程控制类函数
函数 | 说明 |
---|---|
IF() | 判断,流程控制 |
IFNULL() | 字段值是否为空 |
CASE | 搜索语句 |
IF()
函数:IF(a,b,c)
如果a
为真返回b
,否则返回c
;
IFNULL()
函数:IFNULL(a,b)
如果a
不为null
返回a
,否则返回b
;
CASE
:CASE WHEN a then b end
判断如果a
为真返回b
。
编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin - End
区域内进行代码补充,具体任务如下:
-
查询所有学生的出生年份及至
2019-01-01
时的年龄; -
查询所有课程中的最高分、最低分、平均分和及格率,按课程
id
升序输出。
Student
表结构:
字段名 | 说明 |
---|---|
s_id | 学生id |
s_name | 学生姓名 |
s_birth | 学生生日 |
s_sex | 学生性别 |
Course
表结构:
字段名 | 说明 |
---|---|
c_id | 课程id |
c_name | 课程名 |
Score
表结构:
字段名 | 说明 |
---|---|
s_id | 学生id |
c_id | 课程id |
s_score | 学生成绩 |
测试说明
补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。
开始你的任务吧,祝你成功!
#请在此添加实现代码
########## Begin ##########
########## 查询学生出生年份及年龄 ##########
SELECT YEAR(s_birth) as year,2019-s_birth as "年龄" FROM Student;
########## 查询课程的最高分、最低分、平均分和及格率 #########
SELECT
Course.c_id as "课程id",
Course.c_name as "课程名",
MAX(Score.s_score)as "最高分",
MIN(Score.s_score)as "最低分",
ROUND(AVG(Score.s_score),2) as "平均分" ,
ROUND(SUM(CASE WHEN Score.s_score >= 60 then 1 else 0 END)/COUNT(*) * 100,2) as "及格率"
FROM Course join Score on Course.c_id=Score.c_id
GROUP BY Course.c_id;
########## End ##########