您的位置:首页 > 数据库

SQL练习题

2016-07-23 14:28 344 查看

1.建表

-- Table structure for course
CREATE TABLE `mytest0721`.`course` (
`cno` VARCHAR(10) NOT NULL,
`cname` VARCHAR(25) NOT NULL,
`tno` VARCHAR(20) NULL DEFAULT NULL,
PRIMARY KEY (`cno`, `cname`));

-- Records of course
INSERT INTO `course` VALUES ('c001', 'J2SE', 't002');
INSERT INTO `course` VALUES ('c002', 'Java Web', 't002');
INSERT INTO `course` VALUES ('c003', 'SSH', 't001');
INSERT INTO `course` VALUES ('c004', 'Oracle', 't001');
INSERT INTO `course` VALUES ('c005', 'SQL SERVER 2005', 't003');
INSERT INTO `course` VALUES ('c006', 'C#', 't003');
INSERT INTO `course` VALUES ('c007', 'JavaScript', 't002');
INSERT INTO `course` VALUES ('c008', 'DIV+CSS', 't001');
INSERT INTO `course` VALUES ('c009', 'PHP', 't003');
INSERT INTO `course` VALUES ('c010', 'EJB3.0', 't002');

-- Table structure for sc

CREATE TABLE `sc` (
`sno` varchar(10) NOT NULL,
`cno` varchar(10) NOT NULL,
`score` float(4,2) DEFAULT NULL,
PRIMARY KEY (`sno`,`cno`));

-- Records of sc
INSERT INTO `sc` VALUES ('s001', 'c001', '78.90');
INSERT INTO `sc` VALUES ('s002', 'c001', '80.90');
INSERT INTO `sc` VALUES ('s003', 'c001', '81.90');
INSERT INTO `sc` VALUES ('s004', 'c001', '60.90');
INSERT INTO `sc` VALUES ('s001', 'c002', '82.90');
INSERT INTO `sc` VALUES ('s002', 'c002', '72.90');
INSERT INTO `sc` VALUES ('s003', 'c002', '81.90');
INSERT INTO `sc` VALUES ('s001', 'c003', '59.00');

-- Table structure for student
CREATE TABLE `mytest0721`.`student` (
`sno` VARCHAR(10) NOT NULL,
`sname` VARCHAR(20) NULL DEFAULT NULL,
`sage` int(2) NULL DEFAULT NULL,
`ssex` VARCHAR(5) NULL DEFAULT NULL,
PRIMARY KEY (`sno`));

-- Records of student
INSERT INTO `student` VALUES ('s001', '张三', '23', '男');
INSERT INTO `student` VALUES ('s002', '李四', '23', '男');
INSERT INTO `student` VALUES ('s003', '吴鹏', '25', '男');
INSERT INTO `student` VALUES ('s004', '琴沁', '20', '女');
INSERT INTO `student` VALUES ('s005', '王丽', '20', '女');
INSERT INTO `student` VALUES ('s006', '李波', '21', '男');
INSERT INTO `student` VALUES ('s007', '刘玉', '21', '男');
INSERT INTO `student` VALUES ('s008', '萧蓉', '21', '女');
INSERT INTO `student` VALUES ('s009', '陈萧晓', '23', '女');
INSERT INTO `student` VALUES ('s010', '陈美', '22', '女');

-- Table structure for teacher
CREATE TABLE `mytest0721`.`teacher` (
`tno` VARCHAR(10) NOT NULL,
`tname` VARCHAR(20) NULL DEFAULT NULL,
PRIMARY KEY (`tno`)
);

-- Records of teacher
INSERT INTO `teacher` VALUES ('t001', '刘阳');
INSERT INTO `teacher` VALUES ('t002', '谌燕');
INSERT INTO `teacher` VALUES ('t003', '胡明星');


2. 相关练习

-- 统计每一门课程的最高分、最低分
select cno, max(score), min(score)
from sc
group by cno;

-- 查看和编号001的学生至少选了同一门课程的学生的姓名
SELECT DISTINCT student.sname FROM student
JOIN sc ON student.sno = sc.sno
WHERE sc.cno in (
SELECT cno FROM sc
WHERE sno = 's001'
) AND student.sno <> 's001';

-- 查看所选课程包含编号002的学生课程的学生的姓名、选课数量
SELECT * from (
SELECT sc.sno,count(*) st_cnt from sc
WHERE sc.sno <> 's002' AND sc.cno in (SELECT cno from sc WHERE sc.sno = 's002')
GROUP BY sc.sno) t
WHERE st_cnt = (SELECT count(cno) from sc WHERE sc.sno = 's002');

select cno, CONVERT(sum(case when score>=60 then 1 else 0 end)/count(*), decimal(4,2))
from sc
group by cno;
-- 查看选课情况情况和编号002完全相同的学生的姓名、编号
SELECT student.sname, t_others.sno FROM student, (
SELECT sno, count(*) same_course_cnt FROM sc
WHERE sno <> 's002' AND cno in (SELECT cno FROM sc WHERE sno = 's002')
GROUP BY sno
) t_others
LEFT JOIN (
SELECT sc.sno, COUNT(*) all_course_cnt
FROM sc
GROUP BY sno) t_all
ON t_others.sno = t_all.sno
WHERE t_others.same_course_cnt = t_all.all_course_cnt
AND t_others.same_course_cnt = (SELECT COUNT(cno) FROM sc WHERE sno = 's002')
AND student.sno = t_others.sno
;

-- 查看每门课程的平均分,保留小数点后两位
SELECT cno, CONVERT(AVG(score), DECIMAL(5,2)) AVG_SCORE FROM sc
GROUP BY cno
;

-- 统计每名学生各门成绩在60~90分的分布情况
SELECT sno,
SUM(CASE WHEN score >=90 THEN 1 ELSE 0 END) AS '>90',
SUM(CASE WHEN score >=80 AND score < 90 THEN 1 ELSE 0 END) AS '80~90',
SUM(CASE WHEN score >=70 AND score < 80 THEN 1 ELSE 0 END) AS '70~80',
SUM(CASE WHEN score >=60 AND score < 70 THEN 1 ELSE 0 END) AS '60~70',
SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS '<60'
FROM sc
;

-- 统计每门课程的选课学生数量
SELECT cno, COUNT(sno) FROM sc
GROUP BY cno;

-- 查看只选了一门课的学生编号
SELECT sno, COUNT(cno) course_cnt
FROM sc
GROUP BY sno
HAVING course_cnt = 1;

-- 学生性别情况统计
SELECT ssex, COUNT(*)
FROM student
GROUP BY SSEX
;

-- 重名学生数量
SELECT sname, COUNT(*) cnt
FROM student
GROUP BY sname
HAVING cnt > 1;

-- 统计每门课程平均分并按降序排列
SELECT cno, AVG(score) avg_score
FROM sc
GROUP BY cno
ORDER BY avg_score, cno DESC
;

-- 查询选了J2SE这门课程得分高于80分的学生姓名及成绩
SELECT sname, score FROM student
JOIN sc ON sc.sno = student.sno
JOIN course ON course.cno = sc.cno
WHERE course.cname = 'J2SE' AND score > 80
;

-- 查询所有学生的得分情况
SELECT student.*,sc.cno, course.tno  FROM student, course, sc
WHERE student.sno = sc.sno AND sc.cno = course.cno
;

-- 查询每门课程得分最高的两名学生姓名、得分、学生编号及课程号
SELECT sname, sc_1.score, sc_1.sno, sc_1.cno
FROM sc AS sc_1, student
WHERE (
SELECT COUNT(*) FROM sc AS sc_2
WHERE sc_2.cno = sc_1.cno AND sc_2.score >= sc_1.score
) <= 2 AND sc_1.sno = student.sno
ORDER BY sc_1.cno, sc_1.score DESC;

-- 查询每名学生得分在70分以上的课程名称
SELECT student.sname, course.cname, sc.*
FROM student, course, sc
WHERE student.sno = sc.sno AND course.cno = sc.cno AND sc.score > 70
;

-- 查询所有成绩都在70分以上的学生
SELECT DISTINCT sno FROM sc
WHERE sno not in (
SELECT sno from sc
WHERE score < 70
);

-- 统计选了c001、c002两门课程且前者成绩高于后者的学生姓名、编号、课程编号及得分
SELECT student.sname,crs_1.* FROM
student,
(SELECT * FROM sc crs_1 WHERE crs_1.cno = 'c001') crs_1,
(SELECT * FROM sc crs_2 WHERE crs_2.cno = 'c002') crs_2
WHERE student.sno = crs_1.sno AND crs_1.sno = crs_2.sno AND crs_1.score > crs_2.score;

-- 统计平均成绩在60分以上的学生标号
SELECT sno, AVG(score) avg_score FROM sc
GROUP BY sno
HAVING avg_score > 60
;

-- 统计每名学生编号、姓名、选课数量、总分
SELECT student.sno, student.sname, COUNT(sc.cno) course_cnt, SUM(sc.score) all_score
FROM student
LEFT JOIN sc ON student.sno = sc.sno
GROUP BY student.sno
;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: