你與寫的一手好sql的大佬可能就差這一道題!

TimeFriends發表於2021-01-03

你與寫的一手好sql的大佬可能就差這一道題!

1:建表語句

1.1:課程表

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `c`
-- ----------------------------
DROP TABLE IF EXISTS `c`;
CREATE TABLE `c` (
  `CNO` int(11) NOT NULL DEFAULT '0' COMMENT '課程號',
  `CNAME` varchar(11) DEFAULT NULL COMMENT '課程名稱',
  `CTEACHER` varchar(11) DEFAULT NULL COMMENT '課程老師名稱',
  PRIMARY KEY (`CNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of c
-- ----------------------------
INSERT INTO `c` VALUES ('1', '科學', '科學老師');
INSERT INTO `c` VALUES ('2', '程式設計', '程式設計老師');
INSERT INTO `c` VALUES ('3', '美術', '何炅老師');

1.2:學生表

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `s`
-- ----------------------------
DROP TABLE IF EXISTS `s`;
CREATE TABLE `s` (
  `SNO` int(11) NOT NULL DEFAULT '0' COMMENT '學號',
  `SNAME` varchar(11) DEFAULT NULL,
  `AGE` int(2) DEFAULT NULL,
  `SEX` int(1) DEFAULT NULL COMMENT '0-女 1-男',
  PRIMARY KEY (`SNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of s
-- ----------------------------
INSERT INTO `s` VALUES ('1', '張三', '1', '1');
INSERT INTO `s` VALUES ('2', '李四', '2', '1');
INSERT INTO `s` VALUES ('3', '小麗', '3', '0');
INSERT INTO `s` VALUES ('4', '小花', '4', '0');
INSERT INTO `s` VALUES ('5', '王二麻子', '5', '1');
1.3:學生和課程關係表

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `sc`
-- ----------------------------
DROP TABLE IF EXISTS `sc`;
CREATE TABLE `sc` (
  `SNO` int(11) DEFAULT NULL COMMENT '學號',
  `CNO` int(22) DEFAULT NULL COMMENT '課程號',
  `SCGRADE` decimal(11,2) DEFAULT NULL COMMENT '成績'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of sc
-- ----------------------------
INSERT INTO `sc` VALUES ('1', '1', '70.00');
INSERT INTO `sc` VALUES ('1', '2', '56.00');
INSERT INTO `sc` VALUES ('1', '3', '90.00');
INSERT INTO `sc` VALUES ('2', '1', '2.00');
INSERT INTO `sc` VALUES ('2', '3', '70.00');
INSERT INTO `sc` VALUES ('3', '3', '60.00');
INSERT INTO `sc` VALUES ('4', '3', '90.00');
INSERT INTO `sc` VALUES ('2', '2', '56.00');
INSERT INTO `sc` VALUES ('3', '1', '45.00');
INSERT INTO `sc` VALUES ('3', '2', '12.00');
INSERT INTO `sc` VALUES ('4', '1', '22.00');
INSERT INTO `sc` VALUES ('4', '2', '55.00');

1.4:學生和課程關係擴充表

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `sc_c`
-- ----------------------------
DROP TABLE IF EXISTS `sc_c`;
CREATE TABLE `sc_c` (
  `CNO` int(11) NOT NULL DEFAULT '0',
  `CNAME` varchar(11) DEFAULT NULL,
  `AVG_GRADE` decimal(11,4) DEFAULT NULL,
  PRIMARY KEY (`CNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of sc_c
-- ----------------------------

2:題目

1:把SC表中每門課程的平均成績插入到另外一個已經存在的表SC_C(CNO,CNAME,AVG_GRADE),其中AVG_GRADE表示每門課程的平均成績
2:從SC表中把選擇何炅老師的課程的女生的選課記錄刪除
3:查詢選何炅老師的課程的女生且成績在80分以上
4:找出沒有選修過何炅老師的課程的所有學生的姓名(兩種寫法)
5:列出有兩門以上(包含兩門)不及格課程(成績小於60)的學生的姓名及其平均成績(兩種方式)   
6:列舉出即學過1(科學)又學過2(程式設計)的所有學生姓名(兩種方式)
7:列出1(科學)成績比2(程式設計)的學生成績高的所有學生的學號和姓名
8:列出1(科學)成績比2(程式設計)的學生成績高的所有學號及其1號課(科學)2號課(程式設計)的成績

3:參考答案

-- 1:把SC表中每門課程的平均成績插入到另外一個已經存在的表SC_C(CNO,CNAME,AVG_GRADE),其中AVG_GRADE表示每門課程的平均成績
INSERT INTO SC_C (CNO, CNAME, AVG_GRADE) SELECT
	SC.CNO,
	C.CNAME,
	AVG(SC.SCGRADE)
FROM
	`SC`
INNER JOIN C ON C.CNO = SC.CNO
GROUP BY
	SC.CNO;

-- 2:從SC表中把選擇何炅老師的課程的女生的選課記錄刪除
DELETE
FROM
	SC,
	S,
	C
WHERE
	SC.SNO = S.SNO
AND SC.CNO = C.CNO
AND C.CTEACHER = '何炅老師'

-- 3:查詢選何炅老師的課程的女生且成績在80分以上
SELECT
	S.*
FROM
	S
INNER JOIN SC ON SC.SNO = S.SNO
INNER JOIN C ON C.CNO = SC.CNO
WHERE
	C.CTEACHER = '何炅老師'
AND SC.SCGRADE > 80
AND S.SEX = 0 

-- 4:找出沒有選修過何炅老師的課程的所有學生的姓名(兩種寫法)
SELECT
	S.SNAME
FROM
	S
WHERE
	S.SNO NOT IN (
		SELECT
			S.SNO
		FROM
			S
		INNER JOIN SC ON SC.SNO = S.SNO
		INNER JOIN C ON C.CNO = SC.CNO
		WHERE
			C.CTEACHER = '何炅老師'
	) 

SELECT
		SNAME
	FROM
		S
	WHERE
		NOT EXISTS (
			SELECT
				*
			FROM
				SC,
				C
			WHERE
				SC.CNO = SC.CNO
			AND SC.SNO = S.SNO
			AND C.CTEACHER = '何炅老師'
		) 

-- 5:列出有兩門以上(包含兩門)不及格課程(成績小於60)的學生的姓名及其平均成績(兩種方式)
SELECT
	S.SNAME,
	AVG(sc.SCGRADE)
FROM
	SC
INNER JOIN S ON S.SNO = sc.SNO
WHERE
	sc.SNO IN (
		SELECT
			sc.SNO
		FROM
			SC
		WHERE
			SC.SCGRADE < 60
		GROUP BY
			sc.SNO
		HAVING
			COUNT(1)>= 2
	)
GROUP BY
	sc.SNO;

SELECT
	S.SNAME,
	AVG(sc.SCGRADE)
FROM
	s,
	sc,
	(
		SELECT
			sc.SNO
		FROM
			SC
		WHERE
			SC.SCGRADE < 60
		GROUP BY
			sc.SNO
		HAVING
			COUNT(1) >= 2
	) A
WHERE
	A.SNO = s.SNO
AND s.SNO = sc.SNO
GROUP BY
	sc.SNO

-- 6:列舉出即學過1(科學)又學過2(程式設計)的所有學生姓名(兩種方式)
SELECT
	s.SNAME
FROM
	s,
	sc
WHERE
	s.sno = sc.SNO
AND sc.CNO = 2
AND sc.SNO IN (
	SELECT
		sc.SNO
	FROM
		sc
	WHERE
		sc.CNO = 1
) 

SELECT
		s.SNAME
	FROM
		s,
		(
			SELECT
				SNO
			FROM
				sc
			WHERE
				CNO IN (1, 2)
			GROUP BY
				SNO
			HAVING
				count(CNO) >= 2
		) AS a
	WHERE
		s.sno = a.SNO

-- 7:列出1(科學)成績比2(程式設計)的學生成績高的所有學生的學號和姓名
SELECT
	s.sno,
	s.SNAME
FROM
	s,
	(
		SELECT
			sc.SNO,
			sc.SCGRADE
		FROM
			sc
		WHERE
			sc.CNO = 1
	) k,
	(
		SELECT
			sc.SNO,
			sc.SCGRADE
		FROM
			sc
		WHERE
			sc.CNO = 2
	) b
WHERE
	s.SNO = k.SNO
AND k.SNO = b.SNO
AND k.SCGRADE > b.SCGRADE

-- 8:列出1(科學)成績比2(程式設計)的學生成績高的所有學號及其1號課(科學)2號課(程式設計)的成績
SELECT
	s.sno,
	s.SNAME,
	k.SCGRADE AS "1",
	b.SCGRADE AS "2"
FROM
	s,
	(
		SELECT
			sc.SNO,
			sc.SCGRADE
		FROM
			sc
		WHERE
			sc.CNO = 1
	) k,
	(
		SELECT
			sc.SNO,
			sc.SCGRADE
		FROM
			sc
		WHERE
			sc.CNO = 2
	) b
WHERE
	s.SNO = k.SNO
AND k.SNO = b.SNO
AND k.SCGRADE > b.SCGRADE

相關文章