常见的sql面试题(学生、成绩、课程 三表操作)

一、学生、成绩、课程  三表操作

-- 问题1、查询课程1比课程2成绩高的所有学生的编号
-- 问题2、查询所有学生的学号、姓名、选课数、总成绩
-- 问题3、查询没有学完所有课程的学生的学号和姓名

首先初始化表和数据;

/*
Navicat MySQL Data Transfer

Source Server         : Mysql
Source Server Version : 50615
Source Host           : 127.0.0.1:3306
Source Database       : demo

Target Server Type    : MYSQL
Target Server Version : 50615
File Encoding         : 65001

Date: 2020-10-11 22:53:24
*/

SET FOREIGN_KEY_CHECKS=0; --禁用外键约束

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `sno` int(3) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `sname` varchar(10) NOT NULL COMMENT '姓名',
  `sage` int(4) DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`sno`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('1', '周杰伦', '18');
INSERT INTO `student` VALUES ('2', '周润发', '18');
INSERT INTO `student` VALUES ('3', '吴孟达', '25');
INSERT INTO `student` VALUES ('4', '刘德华', '25');
INSERT INTO `student` VALUES ('5', '李连杰', '29');



-- ----------------------------
-- Table structure for score
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
  `sno` int(3) NOT NULL COMMENT '学号主键',
  `cno` int(3) NOT NULL COMMENT '成绩主键',
  `score` int(4) NOT NULL COMMENT '年龄'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

-- ----------------------------
-- Records of score
-- ----------------------------
INSERT INTO `score` VALUES ('1', '1', '60');
INSERT INTO `score` VALUES ('1', '2', '61');
INSERT INTO `score` VALUES ('2', '1', '80');
INSERT INTO `score` VALUES ('2', '2', '70');



-- ----------------------------
-- Table structure for cource
-- ----------------------------
DROP TABLE IF EXISTS `cource`;
CREATE TABLE `cource` (
  `cno` int(3) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `cname` varchar(10) NOT NULL COMMENT '姓名',
  PRIMARY KEY (`cno`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

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

实际问题:

-- 问题1、查询课程1比课程2成绩高的所有学生的编号
SELECT score1.sno FROM
	(SELECT * FROM score t WHERE t.cno = 1 ) AS score1,
	(SELECT * FROM score t WHERE t.cno = 2 ) AS score2
WHERE
	score1.score > score2.score
AND score1.sno = score2.sno;

-- 问题2、查询所有学生的学号、姓名、选课数、总成绩
SELECT
	t.sno,
	t.sname,
	COUNT(t1.cno) AS cources,
	-- SUM(t1.score) //无数据为null
	SUM(case WHEN t1.score is NULL then 0 else t1.score END) AS scores -- 数据为null,则补为0
FROM
	student t
LEFT JOIN score t1 ON t.sno = t1.sno
GROUP BY
	t.sno;

-- 问题3、查询没有学完所有课程的学生的学号和姓名
SELECT DISTINCT t.sno,t.sname FROM student t
LEFT JOIN score t1 ON t.sno = t1.sno
WHERE t1.score is null;

猜你喜欢

转载自blog.csdn.net/huqiwuhuiju/article/details/109051320
今日推荐