数据库面试题(一)多表查询

一、数据准备

1、创建表结构及数据

-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course`  (
  `Cno` int(11) NOT NULL COMMENT '课程编号',
  `Cname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '课程名称',
  `Tno` int(11) NULL DEFAULT NULL COMMENT '老师编号',
  PRIMARY KEY (`Cno`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES (1, '数学', 1);
INSERT INTO `course` VALUES (2, '语文', 2);
INSERT INTO `course` VALUES (3, '英文', 1);

-- ----------------------------
-- Table structure for sc
-- ----------------------------
DROP TABLE IF EXISTS `sc`;
CREATE TABLE `sc`  (
  `Sno` int(11) NOT NULL COMMENT '学号',
  `Cno` int(11) NOT NULL COMMENT '课程编号',
  `score` int(255) NULL DEFAULT NULL COMMENT '分数',
  PRIMARY KEY (`Sno`, `Cno`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of sc
-- ----------------------------
INSERT INTO `sc` VALUES (1, 1, 99);
INSERT INTO `sc` VALUES (1, 2, 80);
INSERT INTO `sc` VALUES (1, 3, 50);
INSERT INTO `sc` VALUES (2, 1, 70);
INSERT INTO `sc` VALUES (2, 2, 90);
INSERT INTO `sc` VALUES (3, 1, 90);
INSERT INTO `sc` VALUES (4, 1, 60);
INSERT INTO `sc` VALUES (4, 2, 50);
INSERT INTO `sc` VALUES (4, 3, 40);

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `Sno` int(255) NOT NULL COMMENT '学号',
  `Sname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
  `Sage` int(255) NULL DEFAULT NULL COMMENT '年龄',
  `Ssex` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性别',
  PRIMARY KEY (`Sno`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, '张三丰', 108, '');
INSERT INTO `student` VALUES (2, '李小龙', 20, '');
INSERT INTO `student` VALUES (3, '小龙女', 17, '');
INSERT INTO `student` VALUES (4, '白发魔女', 18, '');
INSERT INTO `student` VALUES (5, '韦小宝', 19, '');

-- ----------------------------
-- Table structure for teacher
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher`  (
  `Tno` int(11) NOT NULL COMMENT '老师编号',
  `Tname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '老师名称',
  PRIMARY KEY (`Tno`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of teacher
-- ----------------------------
INSERT INTO `teacher` VALUES (1, '无崖子');
INSERT INTO `teacher` VALUES (2, '孤独求败');
INSERT INTO `teacher` VALUES (3, '洪七公');

SET FOREIGN_KEY_CHECKS = 1;

表结构:

  a学生表,b成绩表,c课程表,d老师表

2、面试题

2.1 单表查询

#1 查询年龄小于18岁的学员信息

select * from student a where a.Sage < 18;

 

2.2 双表查询

# 2 查询无崖子授课信息

select
    * 
from
    teacher d
    inner join course c on d.tno = c.tno 
where
    d.tname = '无崖子';

 

# 3 查询没有参与任意课程的学生信息

select
    * 
from
    student a
    left join sc b on a.sno = b.sno 
where
    b.sno is null;

2.3 三表查询

#4 查询无崖子每个授课课程的学员人数 统计 + 分组

select
    c.cno,
    c.cname,
    count( * ) 
from
    teacher d
    inner join course c on d.tno = c.tno
    inner join sc b on b.cno = c.cno 
where
    d.tname = '无崖子' 
group by
    c.cno,
    c.cname;

 

#5 查询张三丰数学成绩

select
    * 
from
    student a
    inner join sc b on a.sno = b.sno
    inner join course c on c.cno = b.cno 
where
    a.sname = '张三丰' 
    and c.cname = '数学';

 

#6 查询出语文最高分

select
    max( b.score ),
    c.cname 
from
    student a
    inner join sc b on a.sno = b.sno
    inner join course c on b.cno = c.cno 
where
    c.cname = '语文';

 

 

 

#7 查询没有参与语文考试的学生信息
# 先查询出参加了语文课程学生

select
    * 
from
    course c
    inner join sc b on c.cno = b.cno 
    and c.cname = '语文'
    right join student a on a.sno = b.sno 
where
    b.sno is null;

 

 

 

#8 查询语数外三门成绩的平均分

select
    c.cno,
    c.cname,
    avg( b.score ) 
from
    student a
    inner join sc b on a.sno = b.sno
    inner join course c on b.cno = c.cno 
group by
    c.cno,
    c.cname;

 

2.4 四表查询

#9 查询报名孤独求败老师课程的学生信息

select
    * 
from
    student a
    inner join sc b on a.sno = b.sno
    inner join course c on b.cno = c.cno
    inner join teacher d on c.tno = d.tno 
where
    d.tname = '孤独求败';

 

#10 没有报名孤独求败老师课程的学生信息

select
    * 
from
    teacher d
    inner join course c on d.tno = c.tno 
    and d.tname = '孤独求败'
    inner join sc b on c.cno = b.cno
    right join student a on a.sno = b.sno 
where
    b.sno is null;

 

 

 

 

*******请大家尊重原创,如要转载,请注明出处:转载自:https://www.cnblogs.com/shouhu/,谢谢!!******* 

posted @ 2020-03-24 14:47  守护往昔  阅读(3752)  评论(1编辑  收藏  举报