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 ;
相关文章推荐
- linux & windows php操作redis
- memcached 常用命令及使用说明
- mysql修改root密码
- 本地服务端 使用 sqlplus / as sysdba 报ORA-12547: TNS:lost contact
- MySQL启动相关知识
- mysql passwd
- spring data redis 配置
- MySql导出一个数据库的表到另一个数据库的表中
- Oracle插入/更新CLOB字段报ORA-01704:字符串文字太长【解决方案】
- oracle遇到问题整理
- hibernate的一对一映射-外键映射-双向-mysql数据库
- windows和linux的redis的安装
- mysql主从复制
- Linux下Lamp环境 和 Lnmp环境 PHP使用Redis安装教程
- 转载 :sql server 2005 无法删除数据库 "#Test",因为该数据库当前正在使用
- 数据库连接池c3p0与Hibernate的整合
- MFC+mongodb+nodejs 数据库的读取与写入操作
- debian 安装vesta,mysql1045错误
- NOSQL资料
- MySQL关键字Distinct用法介绍