MySQL经典面试题:66道题目整理(student,teacher,...四表查询练习)

本文整理了66道关于MySQL的面试题,涵盖四张表格(student, sc, course, teacher)的查询与更新。内容包括各科报考人数、学生最高分、课程及格率等复杂查询操作。同时也包含一些涉及表更新的题目,适合SQL学习和进阶者参考。" 8991390,1443615,C#编程:继承、多态与动态绑定演示,"['C#编程', '面向对象', '继承', '多态', '动态绑定']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介:所用到的四个表格

粗略读过一遍《SQL基础教程》后,利用周末刷了一组经典的MySQL面试题,来和大家分享。主要是一些有关SQL查询的题目,也有几道涉及表的更新。有很多地方也许有更简单写法,请大神们指教~

题目中共有四个表格:

- student表
储存学生信息的表格,含有4个字段,分别是:Sid,Sname,Sage,Ssex;代表了学生的学号,姓名,年龄,性别

在这里插入图片描述

- sc表
储存学生成绩的表格,含有3个字段,分别是:Sid,Cid,score;代表了学生的学号,科目的代号,学生该科目的成绩

在这里插入图片描述

- course表
储存科目信息的表格,含有3个字段,分别是:Cid,Cname,Tid;代表了科目的代号,科目的名字,教授该科目的老师代号

在这里插入图片描述

**- teacher表**

储存老师信息的表格,含有2个字段,分别是:Tid,Tname;代表了老师的代号,老师的名字

在这里插入图片描述

50道题目及答案

有关查询的题目

(因为是练习题目,所以尽可能写了多种写法)

  1. 各科的报考人数
SELECT sc.Cid AS 科目代号, course.Cname AS 科目, COUNT(*) AS 报考人数 from sc
INNER JOIN course ON course.Cid = sc.Cid
GROUP BY sc.Cid;

-- 也可以使用子查询去写
SELECT DISTINCT A.Cid AS 科目代号, 
(SELECT B.Cname FROM course B WHERE B.Cid = A.Cid) AS 科目,
(SELECT COUNT(*) FROM sc C WHERE C.Cid = A.Cid) AS 报考人数 
from sc A;
  1. 每个学生的参与课程号
SELECT student.Sid, student.Sname, course.Cname FROM student
INNER JOIN sc ON sc.Sid = student.Sid
INNER JOIN course ON course.Cid = sc.Cid
ORDER BY student.Sid ASC;
  1. 各课程老师的名字
SELECT course.Cname AS 课程, teacher.Tname AS 授课老师 FROM course
INNER JOIN teacher ON teacher.Tid = course.Tid;

-- 也可以使用子查询去写
SELECT Cname AS 课程,
(SELECT Tname FROM teacher WHERE teacher.Tid = course.Tid) AS 授课老师
FROM course;
  1. 每个老师所教的课程名
-- 与第3题相同,只是改变两列的顺序
SELECT teacher.Tname AS 授课老师, course.Cname AS 课程 FROM teacher
INNER JOIN course ON course.Tid = teacher.Tid;

-- 也可以使用子查询去写
SELECT teacher.Tname AS 授课老师,
(SELECT Cname FROM course WHERE course.Tid = teacher.Tid) AS 课程
FROM teacher;
  1. 每个学生的最高分
SELECT A.Sid AS 学号, A.Sname AS 学生姓名, 
(SELECT MAX(sc.score) FROM sc WHERE sc.Sid = A.Sid) AS 最高分数,
(SELECT course.Cname FROM course 
INNER JOIN sc B ON B.Cid = course.Cid
WHERE B.Sid = A.Sid AND B.score = 最高分数) AS 最高成绩科目
FROM student A;
  1. 每科中的最高分是谁
SELECT Cname AS 科目,
(SELECT MAX(score) FROM sc WHERE sc.Cid = course.Cid) AS 最高分,
(SELECT Sname FROM student 
INNER JOIN sc ON sc.Sid = student.Sid
WHERE sc.score = 最高分) AS 最高分同学
FROM course;

-- 不想要最高分列的话,可以将可以查询到每科`最高分`的代码写在`最高分同学`的子查询中
SELECT Cname AS 科目,
(SELECT Sname FROM student 
INNER JOIN sc ON sc.Sid = student.Sid
WHERE sc.score = (SELECT MAX(score) FROM sc WHERE sc.Cid = course.Cid)) AS 最高分同学
FROM course;
  1. 每科中的最高分是谁
-- 将题目理解为每位同学所选修的所有科目中哪个科目成绩最高
SELECT Sid AS 学号, Sname AS 学生姓名,
(SELECT MAX(score) FROM sc WHERE Sid = student.Sid) AS 该学生最高分,
(SELECT Cname FROM course 
LEFT JOIN sc on sc.Cid = course.Cid
WHERE Sid = student.Sid AND score = 该学生最高分) AS 最高分数科目
FROM student;

-- 不想要最高分列的话,可以将可以查询到每科`最高分`的代码写在`最高分同学`的子查询中
SELECT Sid AS 学号, Sname AS 学生姓名,
(SELECT Cname FROM course 
LEFT JOIN sc SC1 on SC1.Cid = course.Cid
WHERE SC1.Sid = student.Sid 
AND 
SC1.score = (SELECT MAX(SC2.score) FROM sc SC2 WHERE SC2.Sid = student.Sid)) 
AS 最高分数科目
FROM student;
  1. 同时学了数学,语文的学生
SELECT student.Sid AS 学号, student.Sname AS 学生姓名 FROM student
WHERE student.Sid IN (SELECT sc.Sid FROM sc 
				LEFT JOIN course 
				ON course.Cid = sc.Cid
				WHERE course.Cname = "数学")
AND
student.Sid IN (SELECT sc.Sid FROM sc 
				LEFT JOIN course 
				ON course.Cid = sc.Cid
				WHERE course.Cname = "语文");
  1. 每个课程的报考人数
SELECT Cid AS 科目代号, Cname AS 科目,
(SELECT COUNT(sc.Sid) 
FROM sc 
WHERE sc.Cid = course.Cid) AS 报考人数
FROM course;
  1. 所有课程都及格的学生
-- 理解题目:所有课程都及格,也就是该学生的最低分大于等于60
SELECT Sid, Sname FROM student
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值