今天面试被sql绊倒了,废话少说,希望以后面试时不再填坑。需求基本和标题一样。

三张表:学生表student,科目表:course,成绩表:grade

sql语句如下

CREATE TABLE `course` (
  `course_id` int(11) NOT NULL AUTO_INCREMENT,
  `c_name` varchar(64) NOT NULL,
  PRIMARY KEY (`course_id`)
)
INSERT INTO `course` VALUES ('1', '语文');
INSERT INTO `course` VALUES ('2', '数学');
INSERT INTO `course` VALUES ('3', '外语');


CREATE TABLE `grade` (
  `grade_id` int(11) NOT NULL AUTO_INCREMENT,
  `student_id` int(11) NOT NULL,
  `course_id` int(11) NOT NULL,
  `score` decimal(5,2) NOT NULL,
  PRIMARY KEY (`grade_id`)
)

INSERT INTO `grade` VALUES ('1', '1', '1', '83.00');
INSERT INTO `grade` VALUES ('2', '1', '2', '75.00');
INSERT INTO `grade` VALUES ('3', '1', '3', '59.00');
INSERT INTO `grade` VALUES ('4', '2', '1', '76.00');
INSERT INTO `grade` VALUES ('5', '2', '2', '95.00');
INSERT INTO `grade` VALUES ('6', '2', '3', '87.00');
INSERT INTO `grade` VALUES ('7', '3', '1', '89.00');
INSERT INTO `grade` VALUES ('8', '3', '2', '74.00');
INSERT INTO `grade` VALUES ('9', '3', '3', '58.00');
INSERT INTO `grade` VALUES ('10', '4', '1', '95.00');
INSERT INTO `grade` VALUES ('11', '4', '2', '76.00');
INSERT INTO `grade` VALUES ('12', '4', '3', '87.00');


CREATE TABLE `student` (
  `student_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(16) NOT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`student_id`)
)

INSERT INTO `student` VALUES ('1', '张三', '18');
INSERT INTO `student` VALUES ('2', '李四', '18');
INSERT INTO `student` VALUES ('3', '王五', '18');
INSERT INTO `student` VALUES ('4', '赵柳', '18');


首先行变列查询出其中的各科成绩以及平均成绩、总成绩:

select s.student_id as '编号',s.name as '姓名',s.age as '年龄',
sum(case c_name when '语文' then score else 0 end) as '语文',
sum(case c_name when '数学' then score else 0 end) as '数学',
sum(case c_name when '外语' then score else 0 end) as '外语',
convert(sum(score)/3,decimal(5,2)) as '平均成绩',
convert(sum(score),decimal(5,2)) as total
from student s,course c,grade g where s.student_id=g.student_id and c.course_id=g.course_id
group by s.student_id order by sum(score) desc

sql语法慢慢体会,还是不难的,主要因为之前很久没看过了,陌生了。。。

然后需要查出排名,而且总分相同的排名相同,好的,此时运用到了sql变量以及赋值

sql变量用@来表示,赋值用:=来实现;

select
@rows:=@rows+1 as rows,
if(@gnum=total,@rownum:=@rownum,@rownum:=@rownum+1) as rank,
@gnum:=total,
 message.* from(
select s.student_id as '编号',s.name as '姓名',s.age as '年龄',
sum(case c_name when '语文' then score else 0 end) as '语文',
sum(case c_name when '数学' then score else 0 end) as '数学',
sum(case c_name when '外语' then score else 0 end) as '外语',
convert(sum(score)/3,decimal(5,2)) as '平均成绩',
convert(sum(score),decimal(5,2)) as total
from student s,course c,grade g where s.student_id=g.student_id and c.course_id=g.course_id
group by s.student_id order by sum(score) desc) message,(select @rownum:=0,@gnum:=0,@rows:=0) number


解析一下 首先开始时候 @gnum表示上个总成绩变量 初始化=0, 然后判断是否和上个total相同 相同的话,把上个排名@rownnum赋值给当前列排名,不同则@rownum+1

查询结果如下:


基础还要掌握。。

更多相关文章

  1. 字体图标的引入和通过媒体查询改变导航样式
  2. HTML样式和常用选择器
  3. 字体图标的引用和自定义样式/媒体查询的使用
  4. 数据库的CURD操作、PDO本质与原理的学习
  5. CSS之伪类选择器和简单盒子简单案例
  6. 伪类选择器与盒模型常用属性
  7. 伪类选择器-结构伪类、根据位置选择匹配
  8. 7.4——常用标签与应用场景之表格与单元格
  9. css伪类选择器和盒模型

随机推荐

  1. 【Android】自定义 Tabhost
  2. Android HTTP框架Volley详解
  3. Android圆型头像实现
  4. android studio3 多渠道打包及编译速度优
  5. Android SystemClock
  6. Android TV 模拟器启动
  7. Android平板获取唯一标识DeviceId
  8. Handler传递参数动态更新UI界面demo
  9. ANDROID NDK文档系列--(一)Android NDK Ove
  10. Android启动页