方便Mysql 鞏固提升
創建表并插入數據:
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`sname` varchar(32) DEFAULT NULL,
`sage` int(11) DEFAULT NULL,
`ssex` varchar(8) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('1', '劉一', '18', '男');
INSERT INTO `student` VALUES ('2', '錢二', '19', '女');
INSERT INTO `student` VALUES ('3', '張三', '17', '男');
INSERT INTO `student` VALUES ('4', '李四', '18', '女');
INSERT INTO `student` VALUES ('5', '王五', '17', '男');
INSERT INTO `student` VALUES ('6', '趙六', '19', '女');
-- ----------------------------
-- Table structure for teacher
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
`id` int(11) DEFAULT NULL,
`tname` varchar(16) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of teacher
-- ----------------------------
INSERT INTO `teacher` VALUES ('1', '葉平');
INSERT INTO `teacher` VALUES ('2', '賀高');
INSERT INTO `teacher` VALUES ('3', '楊艷');
INSERT INTO `teacher` VALUES ('4', '周磊');
-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
`id` int(11) DEFAULT NULL,
`cname` varchar(32) DEFAULT NULL,
`tid` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES ('1', '語文', '1');
INSERT INTO `course` VALUES ('2', '數學', '2');
INSERT INTO `course` VALUES ('3', '英語', '3');
INSERT INTO `course` VALUES ('4', '物理', '4');
-- ----------------------------
-- Table structure for sc
-- ----------------------------
DROP TABLE IF EXISTS `sc`;
CREATE TABLE `sc` (
`sid` int(11) DEFAULT NULL,
`cid` int(11) DEFAULT NULL,
`score` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of sc
-- ----------------------------
INSERT INTO `sc` VALUES ('1', '1', '56');
INSERT INTO `sc` VALUES ('1', '2', '78');
INSERT INTO `sc` VALUES ('1', '3', '67');
INSERT INTO `sc` VALUES ('1', '4', '58');
INSERT INTO `sc` VALUES ('2', '1', '79');
INSERT INTO `sc` VALUES ('2', '2', '81');
INSERT INTO `sc` VALUES ('2', '3', '92');
INSERT INTO `sc` VALUES ('2', '4', '68');
INSERT INTO `sc` VALUES ('3', '1', '91');
INSERT INTO `sc` VALUES ('3', '2', '47');
INSERT INTO `sc` VALUES ('3', '3', '88');
INSERT INTO `sc` VALUES ('3', '4', '56');
INSERT INTO `sc` VALUES ('4', '2', '88');
INSERT INTO `sc` VALUES ('4', '3', '90');
INSERT INTO `sc` VALUES ('4', '4', '93');
INSERT INTO `sc` VALUES ('5', '1', '46');
INSERT INTO `sc` VALUES ('5', '3', '78');
INSERT INTO `sc` VALUES ('5', '4', '53');
INSERT INTO `sc` VALUES ('6', '1', '35');
INSERT INTO `sc` VALUES ('6', '2', '68');
INSERT INTO `sc` VALUES ('6', '4', '71');
1. 查詢“001”課程比“002”課程成績高的所有學生的學號
SELECT
a1.sid
FROM
(SELECT * FROM sc WHERE cid = 1) a1,
(SELECT * FROM sc WHERE cid = 2) a2
WHERE
a1.score > a2.score
AND a1.sid = a2.sid
select sid,GROUP_CONCAT(score),count(sid)from sc GROUP BY sid;
2. 查詢平均成績大于60分的學生的平均成績
select sid,AVG(score) from sc GROUP BY sid HAVING AVG(score)>60;
3. 查詢所有同學的學號、姓名、選課數、總成績
select a1.id,a1.sname from student a1;
select sid,count(cid),sum(score) from sc GROUP BY sid;
SELECT
a1.id,
a1.sname,
a2.number,
a2.score
FROM
student a1,
(
SELECT
sid,
count(cid) AS number,
sum(score) AS score
FROM
sc
GROUP BY
sid
) a2
WHERE
a1.id = a2.sid;
4. 查詢姓“周”的老師的個數
SELECT
count(DISTINCT(tname))
FROM
teacher
WHERE
tname LIKE '周%';
5.查詢沒學過“葉平”老師課的同學的學號、姓名
select id from course a where a.tid = (SELECT id from teacher where tname='葉平');
select sid,GROUP_CONCAT(cid ORDER BY cid ASC) as cids from sc GROUP BY sid;
SELECT
sid
FROM
(
SELECT
sid,
GROUP_CONCAT(cid ORDER BY cid ASC) AS cids
FROM
sc
GROUP BY
sid
) a
WHERE
! FIND_IN_SET('1', cids);
6. 查詢學過“001”并且也學過編號“002”課程的同學的學號、姓名
方法一:
select sid from (select sid,GROUP_CONCAT(cid ORDER BY cid ASC) as cids from sc GROUP BY sid) a where FIND_IN_SET('1',cids) and FIND_IN_SET('2',cids);
SELECT id,sname from student where student.id in (select sid from (select sid,GROUP_CONCAT(cid ORDER BY cid ASC) as cids from sc GROUP BY sid) a where FIND_IN_SET('1',cids) and FIND_IN_SET('2',cids));
方法二:
select student.id,student.sname from student,sc where student.id = sc.sid and sc.cid = '001' and EXISTS(select * from sc sc2 where sc.sid = sc2.sid and sc2.cid='002');
7.查詢學過“葉平”老師所教的所有課的同學的學號、姓名
SELECT student.id,student.sname from student where student.id in(SELECT DISTINCT(sid) from sc,course,teacher WHERE sc.cid = course.id and course.id = teacher.id and teacher.tname = '葉平');
8. 查詢課程編號“002”的成績比課程編號“001”課程低的所有同學的學號、姓名
select a2.sid from (select * from sc where sc.cid ='002') a1,(select * from sc where sc.cid ='001') a2 where a1.score < a2.score and a1.sid = a2.sid;
select student.id,student.sname from student where student.id in(select a2.sid from (select * from sc where sc.cid ='002') a1,(select * from sc where sc.cid ='001') a2 where a1.score < a2.score and a1.sid = a2.sid)
9. 查詢所有課程成績小于60分的同學的學號、姓名
select GROUP_CONCAT(score ORDER BY score asc) from sc GROUP BY sid
select * from student where student.id not in(select sid from student,sc where student.id = sc.sid and sc.score>60);
10.查詢沒有學全所有課的同學的學號、姓名
SELECT count(1) from course;
SELECT sid from sc GROUP BY sid HAVING count(cid)
select a.id,a.sname from student a,(SELECT sid from sc GROUP BY sid HAVING count(cid)
select a.id,a.sname from student a,sc b where a.id = b.sid GROUP BY a.id HAVING count(a.id)<4;
11.查詢至少有一門課與學號為“1001”的同學所學相同的同學的學號和姓名
select DISTINCT(student.id),student.sname from student,sc where student.id = sc.sid and sc.cid in(SELECT sc.cid from sc where sc.sid='1');
12.把“SC”表中“葉平”老師教的課的成績都更改為此課程的平均成績
select course.id from course,teacher where course.tid = teacher.id and teacher.tname ='葉平';
select sc.cid,avg(score) from sc where sc.cid= 1 GROUP BY cid;
UPDATE sc set sc.score = 12 where sc.cid =5;
13.查詢和“1002”號的同學學習的課程完全相同的其他同學學號和姓名
SELECT sc.sid,GROUP_CONCAT(cid ORDER BY cid ASC) as cids from sc GROUP BY sid;
SELECT cids from (SELECT sc.sid,GROUP_CONCAT(cid ORDER BY cid ASC) as cids from sc GROUP BY sid) a where a.sid = 1;
select * from (SELECT sc.sid,GROUP_CONCAT(cid ORDER BY cid ASC) as cids from sc GROUP BY sid) a where a.cids = (SELECT cids from (SELECT sc.sid,GROUP_CONCAT(cid ORDER BY cid ASC) as cids from sc GROUP BY sid) a where a.sid = 1);
14.刪除學習“葉平”老師課的SC表記錄
SELECT * from sc,course,teacher where sc.cid = course.id and course.id = teacher.id and teacher.tname = '葉平';
15.查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分
SELECT cid,MAX(score) as '最高分',MIN(score) as '最低分' from sc GROUP BY sc.cid
select cid,GROUP_CONCAT(score) from sc GROUP BY cid;