Mysql练习

/*
 Navicat Premium Data Transfer

 Source Server         : localhost
 Source Server Type    : MySQL
 Source Server Version : 50624
 Source Host           : localhost
 Source Database       : sqlexam

 Target Server Type    : MySQL
 Target Server Version : 50624
 File Encoding         : utf-8

 Date: 10/21/2016 06:46:46 AM
*/

SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
--  Table structure for `class`
-- ----------------------------
DROP TABLE IF EXISTS `class`;
CREATE TABLE `class` (
  `cid` int(11) NOT NULL AUTO_INCREMENT,
  `caption` varchar(32) NOT NULL,
  PRIMARY KEY (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `class`
-- ----------------------------
BEGIN;
INSERT INTO `class` VALUES ('1', '三年二班'), ('2', '三年三班'), ('3', '一年二班'), ('4', '二年九班');
COMMIT;

-- ----------------------------
--  Table structure for `course`
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
  `cid` int(11) NOT NULL AUTO_INCREMENT,
  `cname` varchar(32) NOT NULL,
  `teacher_id` int(11) NOT NULL,
  PRIMARY KEY (`cid`),
  KEY `fk_course_teacher` (`teacher_id`),
  CONSTRAINT `fk_course_teacher` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `course`
-- ----------------------------
BEGIN;
INSERT INTO `course` VALUES ('1', '生物', '1'), ('2', '物理', '2'), ('3', '体育', '3'), ('4', '美术', '2');
COMMIT;

-- ----------------------------
--  Table structure for `score`
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
  `sid` int(11) NOT NULL AUTO_INCREMENT,
  `student_id` int(11) NOT NULL,
  `course_id` int(11) NOT NULL,
  `num` int(11) NOT NULL,
  PRIMARY KEY (`sid`),
  KEY `fk_score_student` (`student_id`),
  KEY `fk_score_course` (`course_id`),
  CONSTRAINT `fk_score_course` FOREIGN KEY (`course_id`) REFERENCES `course` (`cid`),
  CONSTRAINT `fk_score_student` FOREIGN KEY (`student_id`) REFERENCES `student` (`sid`)
) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `score`
-- ----------------------------
BEGIN;
INSERT INTO `score` VALUES ('1', '1', '1', '10'), ('2', '1', '2', '9'), ('5', '1', '4', '66'), ('6', '2', '1', '8'), ('8', '2', '3', '68'), ('9', '2', '4', '99'), ('10', '3', '1', '77'), ('11', '3', '2', '66'), ('12', '3', '3', '87'), ('13', '3', '4', '99'), ('14', '4', '1', '79'), ('15', '4', '2', '11'), ('16', '4', '3', '67'), ('17', '4', '4', '100'), ('18', '5', '1', '79'), ('19', '5', '2', '11'), ('20', '5', '3', '67'), ('21', '5', '4', '100'), ('22', '6', '1', '9'), ('23', '6', '2', '100'), ('24', '6', '3', '67'), ('25', '6', '4', '100'), ('26', '7', '1', '9'), ('27', '7', '2', '100'), ('28', '7', '3', '67'), ('29', '7', '4', '88'), ('30', '8', '1', '9'), ('31', '8', '2', '100'), ('32', '8', '3', '67'), ('33', '8', '4', '88'), ('34', '9', '1', '91'), ('35', '9', '2', '88'), ('36', '9', '3', '67'), ('37', '9', '4', '22'), ('38', '10', '1', '90'), ('39', '10', '2', '77'), ('40', '10', '3', '43'), ('41', '10', '4', '87'), ('42', '11', '1', '90'), ('43', '11', '2', '77'), ('44', '11', '3', '43'), ('45', '11', '4', '87'), ('46', '12', '1', '90'), ('47', '12', '2', '77'), ('48', '12', '3', '43'), ('49', '12', '4', '87'), ('52', '13', '3', '87');
COMMIT;

-- ----------------------------
--  Table structure for `student`
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `sid` int(11) NOT NULL AUTO_INCREMENT,
  `gender` char(1) NOT NULL,
  `class_id` int(11) NOT NULL,
  `sname` varchar(32) NOT NULL,
  PRIMARY KEY (`sid`),
  KEY `fk_class` (`class_id`),
  CONSTRAINT `fk_class` FOREIGN KEY (`class_id`) REFERENCES `class` (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `student`
-- ----------------------------
BEGIN;
INSERT INTO `student` VALUES ('1', '', '1', '理解'), ('2', '', '1', '钢蛋'), ('3', '', '1', '张三'), ('4', '', '1', '张一'), ('5', '', '1', '张二'), ('6', '', '1', '张四'), ('7', '', '2', '铁锤'), ('8', '', '2', '李三'), ('9', '', '2', '李一'), ('10', '', '2', '李二'), ('11', '', '2', '李四'), ('12', '', '3', '如花'), ('13', '', '3', '刘三'), ('14', '', '3', '刘一'), ('15', '', '3', '刘二'), ('16', '', '3', '刘四');
COMMIT;

-- ----------------------------
--  Table structure for `teacher`
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
  `tid` int(11) NOT NULL AUTO_INCREMENT,
  `tname` varchar(32) NOT NULL,
  PRIMARY KEY (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `teacher`
-- ----------------------------
BEGIN;
INSERT INTO `teacher` VALUES ('1', '张磊老师'), ('2', '李平老师'), ('3', '刘海燕老师'), ('4', '朱云海老师'), ('5', '李杰老师');
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;
查询每门课程被选修的次数
SELECT course_id,COUNT(course_id) FROM score GROUP BY course_id

查询之选修了一门课程的学生姓名和学号
SELECT sname,sid FROM student WHERE sid IN (
SELECT student_id FROM score GROUP BY student_id HAVING COUNT(course_id)=1)

查询所有学生考出的成绩并按从高到低排序(成绩去重)
SELECT student_id,SUM(num) FROM score GROUP BY student_id ORDER BY SUM(num) DESC

查询平均成绩大于85的学生姓名和平均成绩
SELECT sname,AVG(num) FROM student INNER JOIN score ON student.sid=score.student_id GROUP BY student_id HAVING AVG(num)>85

查询生物成绩不及格的学生姓名和对应生物分数
SELECT sname,num FROM student INNER JOIN (SELECT * FROM score WHERE course_id=1) a ON student.sid=a.student_id WHERE num<60

查询在所有选修了李平老师课程的学生中,这些课程(李平老师的课程,不是所有课程)平均成绩最高的学生姓名
-- SELECT cid FROM course WHERE teacher_id IN(SELECT tid FROM teacher WHERE tname LIKE '李平%')
-- SELECT * FROM score WHERE course_id IN(SELECT cid FROM course WHERE teacher_id IN(SELECT tid FROM teacher WHERE tname LIKE '李平%'))
-- SELECT * FROM student INNER JOIN (SELECT * FROM score WHERE course_id IN(SELECT cid FROM course WHERE teacher_id IN(SELECT tid FROM teacher WHERE tname LIKE '李平%'))) A ON student.sid=A.student_id
SELECT sname FROM (SELECT * FROM student INNER JOIN (SELECT * FROM score WHERE course_id IN(SELECT cid FROM course WHERE teacher_id IN(SELECT tid FROM teacher WHERE tname LIKE '李平%'))) A ON student.sid=A.student_id) B GROUP BY B.student_id ORDER BY AVG(num) DESC LIMIT 1

 “李平”老师课程的学生姓名以及选修的课程名称;
-- SELECT tid FROM teacher WHERE tname LIKE '李平%'
-- SELECT cid FROM course WHERE teacher_id IN (SELECT tid FROM teacher WHERE tname LIKE '李平%')
-- SELECT student_id,course_id FROM score WHERE course_id IN (SELECT cid FROM course WHERE teacher_id IN (SELECT tid FROM teacher WHERE tname LIKE '李平%'))
-- SELECT * FROM student INNER JOIN (SELECT student_id,course_id FROM score WHERE course_id IN (SELECT cid FROM course WHERE teacher_id IN (SELECT tid FROM teacher WHERE tname LIKE '李平%'))) A ON student.sid=A.student_id

SELECT sname,cname FROM (SELECT * FROM student INNER JOIN (SELECT student_id,course_id FROM score WHERE course_id IN (SELECT cid FROM course WHERE teacher_id IN (SELECT tid FROM teacher WHERE tname LIKE '李平%'))) A ON student.sid=A.student_id) B
INNER JOIN course ON B.course_id=course.cid

查询所有选修了学号为1的同学选修过的一门或者多门课程的同学学号和姓名;
SELECT sname,student_id FROM student INNER JOIN score ON student.sid=score.student_id WHERE course_id IN (SELECT course_id FROM score WHERE student_id=1
)

任课最多的老师中学生单科成绩最高的学生姓名
-- SELECT tid FROM teacher INNER JOIN course ON teacher.tid=course.teacher_id GROUP BY tname ORDER BY COUNT(tname) DESC LIMIT 1
-- SELECT cid FROM course WHERE teacher_id=(SELECT tid FROM teacher INNER JOIN course ON teacher.tid=course.teacher_id GROUP BY tname ORDER BY COUNT(tname) DESC LIMIT 1))
-- SELECT * FROM score WHERE course_id IN(SELECT cid FROM course WHERE teacher_id=(SELECT tid FROM teacher INNER JOIN course ON teacher.tid=course.teacher_id GROUP BY tname ORDER BY COUNT(tname) DESC LIMIT 1))
-- SELECT student_id FROM student INNER JOIN (SELECT * FROM score WHERE course_id IN(SELECT cid FROM course WHERE teacher_id=(SELECT tid FROM teacher INNER JOIN course ON teacher.tid=course.teacher_id GROUP BY tname ORDER BY COUNT(tname) DESC LIMIT 1))) a
-- ON student.sid=a.student_id ORDER BY num DESC LIMIT 1

SELECT sname FROM student WHERE sid=(SELECT student_id FROM student INNER JOIN (SELECT * FROM score WHERE course_id IN(SELECT cid FROM course WHERE teacher_id=(SELECT tid FROM teacher INNER JOIN course ON teacher.tid=course.teacher_id GROUP BY tname ORDER BY COUNT(tname) DESC LIMIT 1))) a ON student.sid=a.student_id ORDER BY num DESC LIMIT 1)
原文地址:https://www.cnblogs.com/c491873412/p/7246771.html