当前位置:首页 > SQL > 正文内容

PHP面试指南2020-sql考察题

高老师5年前 (2021-03-05)SQL3182

给定四个表:

  • student(学生表)

  • teacher(老师表)

  • course(课程表)

  • sc(成绩表)

根据题目要求,写出SQL语句。

「问题列表」

1、查询每个学生的学号、姓名和每门课的成绩2、查询都学过2号同学(sid=2)学习过的课程的同学的学号3、查询“语文(cid=1)”课程比“数学(cid=2)”课程成绩高的所有学生的学号;4、查询平均成绩大于60分的同学的学号和平均成绩;5、查询所有同学的学号、姓名、选课数、总成绩;6、查询姓“李”的老师的个数;7、查询没学过“叶平”老师课的同学的学号、姓名; 
8、查询学过“语文(cid=1)”并且也学过“数学(cid=2)”课程的同学的学号、姓名; 
9、查询学过“叶平”老师所教的所有课的同学的学号、姓名;10、查询课程编号“数学(cid=2)”的成绩比课程编号“语文(cid=1)”课程低的所有同学的学号、姓名;11、查询所有课程成绩小于60分的同学的学号、姓名; 
12、查询没有学全所有课的同学的学号、姓名; 
13、按平均成绩从高到低显示所有学生的“语文“、“数学”、“英语”三门的课程成绩,按如下形式显示: 学生
    ID,语文,数学,英语,有效课程数,有效平均分 
14、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分 
15、查询男生、女生人数, 以如下形式显示:男生人数,女生人数16、查询课程名称为“数学”,且分数低于60的学生姓名和分数 
17、查询两门以上不及格课程的同学的学号及其平均成绩;18、检索“cid=4”课程分数小于60,按分数降序排列的同学学号

1、查询每个学生的学号、姓名和每门课的成绩;

(1)利用隐式内联,只输出两表中都有的字段

SQL语句:
SELECT 
 student.sid AS 学生ID, 
    student.sname AS 学生姓名, 
    (SELECT course.cname FROM course WHERE course.cid=sc.cid) AS 课程名称, 
    sc.score AS 成绩 
FROM student,sc 
WHERE student.sid = sc.sid

(2)利用左连接,假如左表有,右表没有,则按左表为准,右表缺省字段置为NULL

SQL语句:

SELECT 
 student.sid AS 学生ID, 
    student.sname AS 学生姓名, 
    (SELECT course.cname FROM course WHERE course.cid=sc.cid) AS 课程名称, 
    sc.score AS 成绩 
FROM student
LEFT JOIN sc
ON student.sid = sc.sid

因为 student 表 和 sc 表没有冗余字段,所以(1)和(2)两种查询方法结果一致。

2、查询都学过2号同学(sid=2)学习过的课程的同学的学号

SQL语句:

SELECT sid 
FROM sc 
WHERE cid IN (SELECT cid FROM sc WHERE sid=2) GROUP BY sid 
HAVING COUNT(*) = (SELECT COUNT(*) FROM sc WHERE sid=2)

3、查询“语文(cid=1)”课程比“数学(cid=2)”课程成绩高的所有学生的学号;

SQL语句:

SELECT a.sid 
FROM 
(SELECT sid, score FROM sc WHERE cid=1) a, (SELECT sid, score FROM sc WHERE cid=2) b 
WHERE a.sid=b.sid AND a.score > b.score;

4、查询平均成绩大于60分的同学的学号和平均成绩;

SQL语句:

SELECT sid, AVG(score) FROM `sc` 
GROUP BY sid 
HAVING AVG(score) > 60;

5、查询所有同学的学号、姓名、选课数、总成绩;

SQL:

SELECT a.sid, a.sname, COUNT(a.cid), SUM(a.score) FROM(SELECT student.sid, student.sname, sc.cid, sc.score FROM student JOIN sc WHERE student.sid=sc.sid) a
GROUP BY sid;

6、查询姓“周”的老师的个数;

SQL:

SELECT COUNT(*) FROM `teacher` WHERE tname LIKE '周%';

7、查询没学过“叶平”老师课的同学的学号、姓名;

SQL:

# 参考答案
SELECT student.sid,student.sname
FROM student  
WHERE sid NOT IN 
 (
     SELECT DISTINCT(sc.sid) 
     FROM sc, course, teacher 
     WHERE  sc.cid=course.cid AND teacher.tid=course.tid AND teacher.tname='叶平'
    );

8、查询学过“语文(cid=1)”并且也学过“数学(cid=2)”课程的同学的学号、姓名;

SQL:

SELECT student.sid,student.sname 
FROM student, sc 
WHERE student.sid=sc.sid AND sc.cid=1 AND 
EXISTS ( SELECT * FROM sc AS sc_2 WHERE sc_2.sid=sc.sid AND sc_2.cid=2);

9、查询学过“叶平”老师所教的所有课的同学的学号、姓名;

SQL:

SELECT student.sid,student.sname 
FROM student 
WHERE sid IN 
  (
   SELECT sid 
   FROM sc ,course ,teacher 
   WHERE sc.cid=course.cid AND teacher.tid=course.tid AND teacher.tname='叶平' 
   GROUP BY sid
   HAVING COUNT(sc.cid)=
      (
          SELECT COUNT(cid) 
          FROM course,teacher
          WHERE teacher.tid=course.tid AND teacher.tname='叶平'
      )
  );

10、查询课程编号“数学(cid=2)”的成绩比课程编号“语文(cid=1)”课程低的所有同学的学号、姓名;

SQL:

SELECT sid,sname 
FROM student
WHERE sid=(
 SELECT a.sid 
 FROM 
  (SELECT sid, score FROM sc WHERE cid=1) a, 
  (SELECT sid, score FROM sc WHERE cid=2) b 
 WHERE a.sid=b.sid AND a.score > b.score)

「11」、查询所有课程成绩小于60分的同学的学号、姓名;

SQL:

SELECT sid,sname 
FROM student 
WHERE sid NOT IN 
(
    SELECT student.sid FROM student AS s,sc WHERE s.sid=sc.sid AND score>60);

12、查询没有学全所有课的同学的学号、姓名;

SQL:

SELECT student.sid, student.sname
FROM student,sc
WHERE student.sid=sc.sid
GROUP BY sid 
HAVING COUNT(cid) < (SELECT COUNT(cid) FROM course)

13、按平均成绩从高到低显示所有学生的“语文“、“数学”、“英语”三门的课程成绩,按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分

SQL:

SELECT sid AS 学生ID,(SELECT score FROM sc WHERE sc.sid=sc_2.sid AND cid=1) AS 语文,(SELECT score FROM sc WHERE sc.sid=sc_2.sid AND cid=2) AS 数学,(SELECT score FROM sc WHERE sc.sid=sc_2.sid AND cid=3) AS 英语,COUNT(*) AS 有效课程数, AVG(score)FROM sc AS sc_2
GROUP BY sid
ORDER BY AVG(sc_2.score)

14、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分

SQL:

SELECT cid AS 课程ID, MAX(score) AS 最高分, MIN(score) AS 最低分
FROM sc
GROUP BY cid

15、查询男生、女生人数 :以如下形式显示:男生人数,女生人数

SQL:

SELECT 
(SELECT COUNT(ssex) FROM student GROUP BY ssex HAVING ssex='男') AS 男生人数, (SELECT COUNT(ssex) FROM student GROUP BY ssex HAVING ssex='女') AS 女生人数;

16、查询课程名称为“数学”,且分数低于60的学生姓名和分数

SQL:

SELECT student.sid, student.sname
FROM student,sc
WHERE student.sid=sc.sid AND cid=(SELECT cid FROM course WHERE cname='数学') AND score > 60

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

SQL:

SELECT sid, AVG(score) FROM sc WHERE sid IN (SELECT sid FROM sc WHERE score < 60 GROUP BY sid HAVING COUNT(*)>1) GROUP BY sid;

18、检索“cid=4”课程分数小于60,按分数降序排列的同学学号

SQL:

SELECT sid FROM sc WHERE cid=4 AND score < 60 ORDER BY score DESC

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/355.html

分享给朋友:

“PHP面试指南2020-sql考察题” 的相关文章

Left join,​Right join,​Inner join的区别实例讲解

Left join,​Right join,​Inner join的区别实例讲解

Left join:即左连接,是以左表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将左表所有的查询信息列出,而右表只列出ON后条件与左表满足的部分。左连接全称为左外连接,是外连接的一种。Right join:即右连接,是以右表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将右表...

主键primary key是否必须和auto_increment 一起出现

主键primary key是否必须和auto_increment 一起出现

    一般情况下,绝大部分,我们的主键是数字,1 2 3 4...所以我们才让它递增.这并不意味着,他们两个必须要绑定在一起使用.例如我还想将用户表的email字段设置为主键,但是并没有必要为其设置自增。    因此可...

 mysql储存引擎,mysql的5种储存引擎

mysql储存引擎,mysql的5种储存引擎

1.MyISAM 建立一个MyISAM引擎的表时,就会在本地磁盘上建立三个文件,.frm格式文件,存储表定义;.MYD格式文件,存储数据;MYI格式文件,存储索引;方便数据迁移,我只需将mysql安装目录下data文件中的表文件复制即可完成数据迁移,之前在搬迁多个dedecms中深有体会。 ...

mysql diff,mysqldiff 安装,mysqldiff 用法

mysql diff,mysqldiff 安装,mysqldiff 用法

项目和第三方系统对接,由于第三方开发人员属于兼职,数据库结构不一致的问题只能我来处理。此处文章用本地模拟演示。数据库资料:1号服务器:  账号root 密码root  IP:127.0.0.1  数据库名称:data1 2号服务器...

mysql构建海量表,mysql 海量数据创建

mysql构建海量表,mysql 海量数据创建

海量表,数据量较大,并且每个字段的值具有唯一性。如果你创建的海量表只是数据多,索引是毫无意义的。构建海量时我们要使用存储过程。学习自韩顺平(1).创建一个测试数据库create  database  testdb;set names gbk;use testdb(2).创建dep...

mysql null转空字符串,mysql null转0

mysql null转空字符串,mysql null转0

项目中查询数据部分字段出现null,影响到了排序,但是由于没有数据库权限,还想将null转为其他值表示;例如现有表member的原始数据:SELECT  *  FROM  memberid    &n...