学生表

CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT,`student_name` varchar(255) DEFAULT NULL,`age` datetime DEFAULT NULL,`sex` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

教师表

CREATE TABLE `teacher` (`id` int(11) NOT NULL AUTO_INCREMENT,`teacher_name` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

课程表

CREATE TABLE `course` (`id` int(11) NOT NULL AUTO_INCREMENT,`course_name` varchar(255) DEFAULT NULL,`teacher_id` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

分数表

CREATE TABLE `score` (`id` int(11) NOT NULL AUTO_INCREMENT,`student_id` int(11) DEFAULT NULL,`course_id` int(11) DEFAULT NULL,`score` decimal(18,1) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;

插入数据

INSERT INTO `course`(`id`, `course_name`, `teacher_id`) VALUES (1, '语文', 2);
INSERT INTO `course`(`id`, `course_name`, `teacher_id`) VALUES (2, '数学', 1);
INSERT INTO `course`(`id`, `course_name`, `teacher_id`) VALUES (3, '英语', 3);INSERT INTO `score`(`id`, `student_id`, `course_id`, `score`) VALUES (1, 1, 1, 80.0);
INSERT INTO `score`(`id`, `student_id`, `course_id`, `score`) VALUES (2, 1, 2, 90.0);
INSERT INTO `score`(`id`, `student_id`, `course_id`, `score`) VALUES (3, 1, 3, 99.0);
INSERT INTO `score`(`id`, `student_id`, `course_id`, `score`) VALUES (4, 2, 1, 70.0);
INSERT INTO `score`(`id`, `student_id`, `course_id`, `score`) VALUES (5, 2, 2, 60.0);
INSERT INTO `score`(`id`, `student_id`, `course_id`, `score`) VALUES (6, 2, 3, 80.0);
INSERT INTO `score`(`id`, `student_id`, `course_id`, `score`) VALUES (7, 3, 1, 80.0);
INSERT INTO `score`(`id`, `student_id`, `course_id`, `score`) VALUES (8, 3, 2, 80.0);
INSERT INTO `score`(`id`, `student_id`, `course_id`, `score`) VALUES (9, 3, 3, 80.0);
INSERT INTO `score`(`id`, `student_id`, `course_id`, `score`) VALUES (10, 4, 1, 50.0);
INSERT INTO `score`(`id`, `student_id`, `course_id`, `score`) VALUES (11, 4, 2, 30.0);
INSERT INTO `score`(`id`, `student_id`, `course_id`, `score`) VALUES (12, 4, 3, 20.0);
INSERT INTO `score`(`id`, `student_id`, `course_id`, `score`) VALUES (13, 5, 1, 76.0);
INSERT INTO `score`(`id`, `student_id`, `course_id`, `score`) VALUES (14, 5, 2, 87.0);
INSERT INTO `score`(`id`, `student_id`, `course_id`, `score`) VALUES (15, 6, 1, 31.0);
INSERT INTO `score`(`id`, `student_id`, `course_id`, `score`) VALUES (16, 6, 3, 34.0);
INSERT INTO `score`(`id`, `student_id`, `course_id`, `score`) VALUES (17, 7, 2, 89.0);
INSERT INTO `score`(`id`, `student_id`, `course_id`, `score`) VALUES (18, 7, 3, 98.0);INSERT INTO `student`(`id`, `student_name`, `age`, `sex`) VALUES (1, '赵雷', '1990-01-01 00:00:00', '男');
INSERT INTO `student`(`id`, `student_name`, `age`, `sex`) VALUES (2, '钱电', '1990-12-21 00:00:00', '男');
INSERT INTO `student`(`id`, `student_name`, `age`, `sex`) VALUES (3, '孙风', '1990-05-20 00:00:00', '男');
INSERT INTO `student`(`id`, `student_name`, `age`, `sex`) VALUES (4, '李云', '1990-08-06 00:00:00', '男');
INSERT INTO `student`(`id`, `student_name`, `age`, `sex`) VALUES (5, '周梅', '1991-12-01 00:00:00', '女');
INSERT INTO `student`(`id`, `student_name`, `age`, `sex`) VALUES (6, '吴兰', '1992-03-01 00:00:00', '女');
INSERT INTO `student`(`id`, `student_name`, `age`, `sex`) VALUES (7, '郑竹', '1989-07-01 00:00:00', '女');
INSERT INTO `student`(`id`, `student_name`, `age`, `sex`) VALUES (8, '王菊', '1990-01-20 00:00:00', '女');INSERT INTO `teacher`(`id`, `teacher_name`) VALUES (1, '张三');
INSERT INTO `teacher`(`id`, `teacher_name`) VALUES (2, '李四');
INSERT INTO `teacher`(`id`, `teacher_name`) VALUES (3, '王五');

sql语句面试题

1、查询语文比数学成绩高的学生的信息及课程分数

SELECTt1.student_id,t1.score 语文,t2.score 数学
FROM(SELECTsc.*,c.course_name FROMscore scINNER JOIN course c WHEREsc.course_id = c.id AND c.course_name = '语文' ) t1,(SELECTsc.*,c.course_name FROMscore scINNER JOIN course c WHEREsc.course_id = c.id AND c.course_name = '数学' ) t2
WHEREt1.score > t2.score

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

SELECTsc.student_id,s.student_name,avg( sc.score )
FROMscore scINNER JOIN student s
WHEREsc.student_id = s.id
GROUP BYstudent_id
HAVINGavg( sc.score )> 60

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

SELECTs.id,s.student_name,count( sc.course_id ) 选课总数,SUM( sc.score ) 总成绩
FROMstudent s,score sc
WHEREs.id = sc.student_id
GROUP BYsc.student_id

4、查询"李"姓老师的数量 

SELECTcount(*)
FROMteacher
WHEREteacher_name LIKE '李%'

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

SELECTs.*
FROM
teacher t
INNER JOIN course cON t.id=c.teacher_idINNER JOIN score sc onsc.course_id=c.idINNER JOIN student sON s.id=sc.student_idWHEREt.teacher_name="张三"

6、查询学过编号为"1"并且也学过编号为"2"的课程的同学的信息 

SELECT*
FROMstudent
WHEREid IN ( SELECT student_id FROM `score` WHERE course_id = 1 ) AND id IN (SELECTstudent_id FROM`score`
WHEREcourse_id = 2)

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

SELECT * FROM student WHERE id IN ( SELECT student_id FROM score GROUP BY student_id HAVING COUNT( course_id )<( SELECT COUNT(*) FROM course )
)

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

SELECTDISTINCT s.*
FROMscore sc,student s
WHEREsc.course_id IN ( SELECT course_id FROM score WHERE student_id = 1 ) AND student_id != 1 AND s.id = sc.student_id

 9、查询和"1"号的同学学习的课程完全相同的其他同学的信息

把其他学生选课信息拼成字符串

SELECTsc.student_id ,    GROUP_CONCAT( course_id ORDER BY course_id ASC )FROMscore sc GROUP BYstudent_id 

把学生1选课信息拼成字符串进行比较,得到结果。

SELECT*
FROMstudent
WHEREid IN (SELECTsc.student_id FROMscore sc WHEREstudent_id != 1 GROUP BYstudent_id HAVINGGROUP_CONCAT( course_id ORDER BY course_id ASC )=(SELECTGROUP_CONCAT( course_id ORDER BY course_id ASC ) FROMscore sc WHEREstudent_id = 1 ))

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

SELECT*
FROMstudent
WHEREid NOT IN (SELECT DISTINCTsc.student_id FROMteacher tINNER JOIN course c ON t.id = c.teacher_idINNER JOIN score sc ON c.id = sc.course_id WHEREt.teacher_name = '张三' )

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

SELECTs.id,s.student_name,t.avgScore
FROMstudent s,( SELECT COUNT( course_id ), student_id, AVG( score ) avgScore FROM score sc WHERE sc.score < 60 GROUP BY student_id ) t
WHEREs.id = t.student_id

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

SELECTsc.student_id,SUM( CASE sc.course_id WHEN 1 THEN sc.score ELSE 0 END ) 语文,SUM( CASE sc.course_id WHEN 2 THEN sc.score ELSE 0 END ) 数学,SUM( CASE sc.course_id WHEN 3 THEN sc.score ELSE 0 END ) 英语,AVG( sc.score ) 平均成绩
FROMscore sc
GROUP BYsc.student_id
ORDER BY平均成绩 DESC

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

及格为>=60,

中等为:70-80,

优良为:80-90,

优秀为:>=90

先把学生每科成绩进行划分等级

SELECTsc.*,( CASE WHEN sc.score >= 60 AND sc.score < 70 THEN 1 ELSE 0 END ) pass,( CASE WHEN sc.score >= 70 AND sc.score < 80 THEN 1 ELSE 0 END ) mid,( CASE WHEN sc.score >= 80 AND sc.score < 90 THEN 1 ELSE 0 END ) good,( CASE WHEN sc.score >= 90 THEN 1 ELSE 0 END ) exellent
FROMscore sc
ORDER BYsc.student_id,course_id

按课目求出学生的最高最低分

SELECTsc.course_id,c.course_name,MAX( sc.score ) 最高分,MIN( sc.score ) 最低分
FROMscore scINNER JOIN course c ON sc.course_id = c.id
GROUP BYsc.course_id

合起来

5.7及以上由于sql_mode默认开启ONLY_FULLY_GROUP_BY会报错

1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.sc.course_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

SELECTsc.course_id,c.course_name,MAX( sc.score ) 最高分,MIN( sc.score ) 最低分,sum( t.pass )* 100 / count( sc.student_id ) 及格率,sum( t.mid )* 100 / count( sc.student_id ) 中等率,sum( t.good )* 100 / count( sc.student_id ) 优良率,sum( t.exellent )* 100 / count( sc.student_id ) 优秀率
FROMscore scINNER JOIN course c ON sc.course_id = c.idINNER JOIN (SELECTsc.course_id,sc.id,( CASE WHEN sc.score >= 60 AND sc.score < 70 THEN 1 ELSE 0 END ) pass,( CASE WHEN sc.score >= 70 AND sc.score < 80 THEN 1 ELSE 0 END ) mid,( CASE WHEN sc.score >= 80 AND sc.score < 90 THEN 1 ELSE 0 END ) good,( CASE WHEN sc.score >= 90 THEN 1 ELSE 0 END ) exellent FROMscore sc ORDER BYsc.student_id,course_id ) t ON t.id = sc.id
GROUP BYt.course_id

如果开启了ONLY_FULLY_GROUP_BY 将id相等转换成 student_id 和course_id相等

SELECTsc.course_id,c.course_name,MAX( sc.score ) 最高分,MIN( sc.score ) 最低分,sum( t.pass )* 100 / count( sc.student_id ) 及格率,sum( t.mid )* 100 / count( sc.student_id ) 中等率,sum( t.good )* 100 / count( sc.student_id ) 优良率,sum( t.exellent )* 100 / count( sc.student_id ) 优秀率
FROMscore scINNER JOIN course c ON sc.course_id = c.idINNER JOIN (SELECTsc.course_id,sc.id,sc.student_id,( CASE WHEN sc.score >= 60 AND sc.score < 70 THEN 1 ELSE 0 END ) pass,( CASE WHEN sc.score >= 70 AND sc.score < 80 THEN 1 ELSE 0 END ) mid,( CASE WHEN sc.score >= 80 AND sc.score < 90 THEN 1 ELSE 0 END ) good,( CASE WHEN sc.score >= 90 THEN 1 ELSE 0 END ) exellent FROMscore sc ORDER BYsc.student_id,course_id ) t ON t.course_id = sc.course_id AND t.student_id=sc.student_idGROUP BYt.course_id

14、查询学生的科目1的成绩并进行排名

SELECTstudent_id,score,(@rowNum := @rowNum + 1 ) rowNum,@rowinc :=
CASEWHEN @rowTotal = score THEN@rowinc WHEN @rowTotal := score THEN@rowNum END AS rank
FROMscore,(SELECT@rowNum := 0,@rowTotal := NULL,@rowinc := 0 ) t
WHEREcourse_id =1
ORDER BYscore DESC
SELECTsc.score,(SELECTCOUNT( s.score )+ 1 FROMscore s WHEREs.score > sc.score AND s.course_id = 1 ) rank
FROMscore sc
WHEREsc.course_id = 1
ORDER BYsc.score DESC;

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

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

数据库MySQL经典面试题之SQL语句相关推荐

  1. mysql面试题sql语句_数据库MySQL经典面试题之SQL语句

    数据库MySQL经典面试题之SQL语句 1.需要数据库表1.学生表 Student(SID,Sname,Sage,Ssex) --SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex ...

  2. 数据库MySQL总结(一)SQL语句

    目录 一.一些命令 二.SQL结构化查询语言 1.DDL 数据库定义语言 针对结构(库.表)的增删改查 create   drop   alter   show 有关库的增删改查 (1)创建库 (2) ...

  3. MySQL经典面试题--SQL语句

    备注:建立下面的每一个题目对应的表,插入案例数据,然后执行需要的 SQL ,将结果复制到 word 文件中 MYSQL经典面试题,后面有建表过程和SQL执行语句  有道云连接 https://note ...

  4. 如何在mysql查找效率慢的SQL语句

    如何在mysql查找效率慢的SQL语句呢?这可能是困然很多人的一个问题,MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启 ...

  5. mysql命令书写顺序_MySQL SQL语句书写顺序和执行顺序

    SQL语句书写顺序和执行顺序 (7) SELECT (8) DISTINCT (1) FROM (3) JOIN (2) ON (4) WHERE (5) GROUP BY (6) HAVING (9 ...

  6. 会mysql不会sql_不是吧,不会有人还不知道MySQL中具实用的SQL语句

    原标题:不是吧,不会有人还不知道MySQL中具实用的SQL语句 目录 实用的SQL 1.插入或替换 2.插入或更新 3.插入或忽略 4.SQL中的if-else判断语句 5.指定数据快照或备份 6.写 ...

  7. 使用Shell对MySQL指定的库进行SQL语句批量插入操作

    需求:   某环境MySQL数据库中有1000个以yz_xxx开头命名的库,要求:在所有以yz_xxx开头命名的库中插入指定的SQL语句. 解决一:   使用Navicat Mysql工具连接到MyS ...

  8. 详解MySQL的逻辑架构和SQL语句执行流程

    文章目录 1. 逻辑架构 1.1 连接层 1.2 服务层 1.3 引擎层 1.3.1 InnoDB 存储引擎 1.3.2 MyISAM 存储引擎 1.3.3 其他存储引擎 1.4 存储层 3. SQL ...

  9. SQLSERVER数据库、表的创建及SQL语句命令

    SQLSERVER数据库.表的创建及SQL语句命令 备份,还原,创建,删除,查询,修改 ** 数据库定义及操作命令:** 按照数据结构来组织.存储和管理数据的仓库.由表.关系以及操作对象组成,把数据存 ...

最新文章

  1. Request Connection: Remote Server @ 192.229.145.200:80
  2. Perl Nmap报告处理摸索(学习)
  3. 小心多任务设计被滥用
  4. linux mint 18支持安卓编译,Linux mint 18版本开启SSH服务
  5. 转 C#对多个集合和数组的操作(合并,去重,判断)
  6. Python学习之路—初识Python
  7. Linux 安装 MySQL 数据库
  8. MyBatis学习总结(20)——MyBatis完全使用指南
  9. 读书-算法《程序设计导引及在线实践》-简单计算题3:校门外的树
  10. python输入整数反转输出_Python反转输出正整数
  11. Latex语法学习05:代码表格的制作
  12. Intellij创建自己的TODO
  13. 踱步狼注释移除,状态机算法更新2019.10.16
  14. 纸飞机html,纸飞机.html
  15. Linux与数据库简要说明
  16. 浮点数定化--altera 乘除法ip使用FPGA学习笔记
  17. 弘辽科技:如何提高客单价
  18. 浅谈Facade外观模式
  19. iOS Airplay Screen Mirroring 投屏技术详解
  20. 新手小白一行代码快速生成HTML代码块

热门文章

  1. 4.1 使用常见的各种字体属性 [原创Excel教程]
  2. android 系统下拉菜单,【MotoX评测】原生Android5.0下拉菜单和基础设置_Moto X_手机评测-中关村在线...
  3. 常见格式浏览器在线预览
  4. SGMII光模块知识百科
  5. android系统关机广播,Android开机广播和关机广播
  6. 【Dubbo实战】基础学习篇(一)
  7. Bless You Autocorrect!(字典树上建图)
  8. CPU后面字母究竟是啥?
  9. 01. Web漏洞靶场的搭建
  10. 如何开通微信支付和支付宝支付0.2%(千分之二)费率(最全攻略)