给定四个表:
student
(学生表)
teacher
(老师表)
course
(课程表)
sc
(成绩表)
根据题目要求,写出SQL语句。
「问题列表」
1、查询每个学生的学号、姓名和每门课的成绩2、查询都学过2号同学(sid=2)学习过的课程的同学的学号3、查询“语文(cid=1)”课程比“数学(cid=2)”课程成绩高的所有学生的学号;4、查询平均成绩大于60分的同学的学号和平均成绩;5、查询所有同学的学号、姓名、选课数、总成绩;6、查询姓“李”的老师的个数;7、查询没学过“叶平”老师课的同学的学号、姓名; 8、查询学过“语文(cid=1)”并且也学过“数学(cid=2)”课程的同学的学号、姓名; 9、查询学过“叶平”老师所教的所有课的同学的学号、姓名;10、查询课程编号“数学(cid=2)”的成绩比课程编号“语文(cid=1)”课程低的所有同学的学号、姓名;11、查询所有课程成绩小于60分的同学的学号、姓名; 12、查询没有学全所有课的同学的学号、姓名; 13、按平均成绩从高到低显示所有学生的“语文“、“数学”、“英语”三门的课程成绩,按如下形式显示: 学生 ID,语文,数学,英语,有效课程数,有效平均分 14、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分 15、查询男生、女生人数, 以如下形式显示:男生人数,女生人数16、查询课程名称为“数学”,且分数低于60的学生姓名和分数 17、查询两门以上不及格课程的同学的学号及其平均成绩;18、检索“cid=4”课程分数小于60,按分数降序排列的同学学号
(1)利用隐式内联,只输出两表中都有的字段
SQL语句: SELECT student.sid AS 学生ID, student.sname AS 学生姓名, (SELECT course.cname FROM course WHERE course.cid=sc.cid) AS 课程名称, sc.score AS 成绩 FROM student,sc WHERE student.sid = sc.sid
(2)利用左连接,假如左表有,右表没有,则按左表为准,右表缺省字段置为NULL
SQL语句:
SELECT student.sid AS 学生ID, student.sname AS 学生姓名, (SELECT course.cname FROM course WHERE course.cid=sc.cid) AS 课程名称, sc.score AS 成绩 FROM student LEFT JOIN sc ON student.sid = sc.sid
因为 student 表 和 sc 表没有冗余字段,所以(1)和(2)两种查询方法结果一致。
SQL语句:
SELECT sid FROM sc WHERE cid IN (SELECT cid FROM sc WHERE sid=2) GROUP BY sid HAVING COUNT(*) = (SELECT COUNT(*) FROM sc WHERE sid=2)
SQL语句:
SELECT a.sid FROM (SELECT sid, score FROM sc WHERE cid=1) a, (SELECT sid, score FROM sc WHERE cid=2) b WHERE a.sid=b.sid AND a.score > b.score;
SQL语句:
SELECT sid, AVG(score) FROM `sc` GROUP BY sid HAVING AVG(score) > 60;
SQL:
SELECT a.sid, a.sname, COUNT(a.cid), SUM(a.score) FROM(SELECT student.sid, student.sname, sc.cid, sc.score FROM student JOIN sc WHERE student.sid=sc.sid) a GROUP BY sid;
SQL:
SELECT COUNT(*) FROM `teacher` WHERE tname LIKE '周%';
SQL:
# 参考答案 SELECT student.sid,student.sname FROM student WHERE sid NOT IN ( SELECT DISTINCT(sc.sid) FROM sc, course, teacher WHERE sc.cid=course.cid AND teacher.tid=course.tid AND teacher.tname='叶平' );
SQL:
SELECT student.sid,student.sname FROM student, sc WHERE student.sid=sc.sid AND sc.cid=1 AND EXISTS ( SELECT * FROM sc AS sc_2 WHERE sc_2.sid=sc.sid AND sc_2.cid=2);
SQL:
SELECT student.sid,student.sname FROM student WHERE sid IN ( SELECT sid FROM sc ,course ,teacher WHERE sc.cid=course.cid AND teacher.tid=course.tid AND teacher.tname='叶平' GROUP BY sid HAVING COUNT(sc.cid)= ( SELECT COUNT(cid) FROM course,teacher WHERE teacher.tid=course.tid AND teacher.tname='叶平' ) );
SQL:
SELECT sid,sname FROM student WHERE sid=( SELECT a.sid FROM (SELECT sid, score FROM sc WHERE cid=1) a, (SELECT sid, score FROM sc WHERE cid=2) b WHERE a.sid=b.sid AND a.score > b.score)
SQL:
SELECT sid,sname FROM student WHERE sid NOT IN ( SELECT student.sid FROM student AS s,sc WHERE s.sid=sc.sid AND score>60);
SQL:
SELECT student.sid, student.sname FROM student,sc WHERE student.sid=sc.sid GROUP BY sid HAVING COUNT(cid) < (SELECT COUNT(cid) FROM course)
SQL:
SELECT sid AS 学生ID,(SELECT score FROM sc WHERE sc.sid=sc_2.sid AND cid=1) AS 语文,(SELECT score FROM sc WHERE sc.sid=sc_2.sid AND cid=2) AS 数学,(SELECT score FROM sc WHERE sc.sid=sc_2.sid AND cid=3) AS 英语,COUNT(*) AS 有效课程数, AVG(score)FROM sc AS sc_2 GROUP BY sid ORDER BY AVG(sc_2.score)
SQL:
SELECT cid AS 课程ID, MAX(score) AS 最高分, MIN(score) AS 最低分 FROM sc GROUP BY cid
SQL:
SELECT (SELECT COUNT(ssex) FROM student GROUP BY ssex HAVING ssex='男') AS 男生人数, (SELECT COUNT(ssex) FROM student GROUP BY ssex HAVING ssex='女') AS 女生人数;
SQL:
SELECT student.sid, student.sname FROM student,sc WHERE student.sid=sc.sid AND cid=(SELECT cid FROM course WHERE cname='数学') AND score > 60
SQL:
SELECT sid, AVG(score) FROM sc WHERE sid IN (SELECT sid FROM sc WHERE score < 60 GROUP BY sid HAVING COUNT(*)>1) GROUP BY sid;
SQL:
SELECT sid FROM sc WHERE cid=4 AND score < 60 ORDER BY score DESC
有很多集成环境安装完成之后是没有快捷方式的,例如西部数码的网站管理助手4.0,、 更或者是护卫神PHP套件都是一样的。安装完成最多给你安装一个PhPmyadmin让你管理Mysql,但是对于经常使用命令行的我们来说是非常不方面的,而且还必须安装PhPmyadmin来管理。下面就让我们自己手...
1.MyISAM 建立一个MyISAM引擎的表时,就会在本地磁盘上建立三个文件,.frm格式文件,存储表定义;.MYD格式文件,存储数据;MYI格式文件,存储索引;方便数据迁移,我只需将mysql安装目录下data文件中的表文件复制即可完成数据迁移,之前在搬迁多个dedecms中深有体会。 ...
(1).首先我们需要了解limit分页的工作流程demo: SELECT * FROM table LIMIT 10000,5 通常我们会认为以上SQL会从10000条后面取5条,正确的是取出10005条,然后再抛弃前...
项目和第三方系统对接,由于第三方开发人员属于兼职,数据库结构不一致的问题只能我来处理。此处文章用本地模拟演示。数据库资料:1号服务器: 账号root 密码root IP:127.0.0.1 数据库名称:data1 2号服务器...
概述: 目前我们的表设计,最高级别的范式是6NF,对于PHP程序员而言,我们的表满足3NF即可(范式即规范)【一】1NF (1).所谓1NF,就是指标的属性具有原子性,即表的列不能再分割,不能分割意思是字段本身的含义(例如address字段不能再分割)...
(1).查询至少有2条订单的客户:SELECT cust_id, COUNT( * ) AS orders FROM orders GROUP BY cust_id HAVING orders ...