作者:董存阔(本博客均为原创文章,转载请注明出处)
先把测试环境搭上(本sql测试平台为 Mysql 5.5)
create table `s` (
`sno` double ,
`sname` varchar (60)
);
insert into `s` (`sno`, `sname`) values('1','董存阔');
insert into `s` (`sno`, `sname`) values('2','董存涛');
insert into `s` (`sno`, `sname`) values('3','董存博');
---------------------
create table `c` (
`cno` double ,
`cname` varchar (765),
`cteacher` varchar (765)
);
insert into `c` (`cno`, `cname`, `cteacher`) values('1','语文','李明');
insert into `c` (`cno`, `cname`, `cteacher`) values('2','数学','大四');
insert into `c` (`cno`, `cname`, `cteacher`) values('3','英语','大喜子');
-------------------------
create table `sc` (
`cno` double ,
`sno` double ,
`score` double
);
insert into `sc` (`cno`, `sno`, `score`) values('1','1','30');
insert into `sc` (`cno`, `sno`, `score`) values('1','2','10');
insert into `sc` (`cno`, `sno`, `score`) values('2','1','20');
insert into `sc` (`cno`, `sno`, `score`) values('2','3','100');
insert into `sc` (`cno`, `sno`, `score`) values('3','3','86');
insert into `sc` (`cno`, `sno`, `score`) values('3','1','10');
sql语句:-- 找出没有选修过“李明”老师讲授课程的所有学生姓名
SELECT sname FROM s WHERE sno NOT IN (
SELECT sno FROM
(SELECT cno FROM c WHERE cteacher='李明') c
JOIN sc ON sc.cno = c.cno
)
-- 列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩
SELECT s.sname ,hx.score FROM
( SELECT sno, AVG(score) AS score FROM sc WHERE score <60 GROUP BY sno HAVING COUNT(sno)>=2
)hx JOIN s
ON hx.sno=s.sno
-- 列出既学过“1”号课程,又学过“2”号课程的所有学生姓名
SELECT sname FROM s JOIN (
SELECT sno FROM sc WHERE (cno=1 OR cno=2) GROUP BY sno HAVING COUNT(sno)=2
)t WHERE s.sno=t.sno
-- 列出“1”号课成绩比“2”号同学该门课成绩高的所有学生的学号
SELECT t1.sno FROM
(SELECT sno,score FROM sc WHERE cno=1) t1 JOIN (SELECT sno,score FROM sc WHERE cno=2) t2
WHERE t1.score>t2.score
-- 列出“1”号课成绩比“2”号课成绩高的所有学生的学号及其“1”号课和“2”号课的成绩
SELECT t1.sno,t1.score FROM
(SELECT sno,score FROM sc WHERE cno=1) t1 JOIN (SELECT sno,score FROM sc WHERE cno=2) t2
WHERE t1.score>t2.score