SELECT*FROM(SELECT*FROM score sc WHERE sc.Cid =1)AS cid1,(SELECT*FROM score sc WHERE sc.Cid =2)AS cid2
WHERE
cid1.score > cid2.score
AND cid1.sid = cid2.sid;
1.1查询同时存在" 01 “课程和” 02 "课程的情况
SELECT*FROM(SELECT*FROM score WHERE score.Cid =1)AS cid1,(SELECT*FROM score WHERE score.Cid =2)AS cid2
WHERE
cid1.sid = cid2.sid;
1.2查询存在" 01 “课程但可能不存在” 02 "课程的情况(不存在时显示为 null )
SELECT*FROM(SELECT*FROM score WHERE score.Cid =1)AS cid1
LEFTJOIN(SELECT*FROM score WHERE score.Cid =2)AS cid2 ON cid1.sid = cid2.sid;
1.3查询不存在" 01 “课程但存在” 02 "课程的情况
SELECT*FROM
score
WHERE
score.Sid NOTIN(SELECT score.sid FROM score WHERE score.Cid =1)AND Score.Cid =2;-- 法2SELECT
cid1.*FROM(SELECT*FROM score WHERE score.Cid =2)AS cid1
LEFTJOIN(SELECT*FROM score WHERE score.Cid =1)AS cid2 ON cid1.sid = cid2.sid
WHERE
cid2.Cid ISNULL;
2.查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩
SELECT
Score.Sid,
student.Sname,AVG( Score.Score ) avg_score
FROM
score
LEFTJOIN student ON score.Sid = student.Sid
GROUPBY
score.Sid
HAVINGAVG( score.Score )>=60;
3.查询在 SC 表存在成绩的学生信息
SELECTDISTINCT
student.*FROM
student
LEFTJOIN score ON student.Sid = score.Sid
WHERE
score.Cid ISNOTNULL;-- 法2SELECT*FROM
student
WHERE
student.Sid IN(SELECT score.Sid FROM score );-- 法3SELECTDISTINCT
student.*FROM
student
INNERJOIN score ON score.Sid = student.Sid;
SELECT
student.*FROM
student
LEFTJOIN score ON student.Sid = score.Sid
WHERE
score.Cid IN(SELECT score.Cid FROM score WHERE score.Sid =10)GROUPBY
student.Sid;
查询和" 01 "号的同学学习的课程 完全相同的其他同学的信息
-- 法1SELECT*FROM
student
WHERE
sid IN(SELECT
sid
FROM
score
WHERE
sid NOTIN(SELECT sid FROM score WHERE cid NOTIN(SELECT cid FROM score WHERE sid ='01'))GROUPBY
sid
HAVINGcount(*)=(SELECTcount(*)FROM score WHERE sid ='01')AND sid !='01');-- 法2SELECT*FROM
student
WHERE
Sid IN(SELECT
sid
FROM(SELECT
sid,
cid
FROM
score
WHERE
sid IN(SELECT
sid
FROM
score
WHERE
sid !='01'GROUPBY
sid
HAVINGcount(*)=(SELECTcount(*)FROM score WHERE sid ='01'GROUPBY sid )))AS t1
INNERJOIN(SELECT cid FROM score WHERE sid ='01')AS t2 ON t1.cid = t2.cid
GROUPBY
t1.sid
HAVINGcount( Cid )=(SELECTcount( Cid )FROM score WHERE sid ='01'))
查询没学过"张三"老师讲授的任一门课程的学生姓名
SELECT
student.Sname,
student.Sid
FROM
student
WHERE
student.Sid NOTIN(SELECT
score.Sid
FROM
score
WHERE
score.Cid IN(SELECT course.Cid FROM course WHERE course.Tid =(SELECT teacher.Tid FROM teacher WHERE teacher.Tname ="张三")));
查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
-- 法1SELECT
student.Sid,
student.Sname,
avg
FROM
student
INNERJOIN(SELECT
score.Sid,AVG( score.Score )AS avg
FROM
score
WHERE
score.Score <60GROUPBY score.Sid HAVINGCOUNT( score.Sid )>1)AS t1 ON student.Sid = t1.Sid;-- 法2SELECT
student.Sid,
student.Sname,AVG( score.Score )as avg
FROM
student,
score
WHERE
student.Sid = score.Sid
AND score.Score <60GROUPBY score.Sid HAVINGCOUNT( score.Sid )>1;
检索" 01 "课程分数小于 60,按分数降序排列的学生信息
SELECT
student.*,score.Score
FROM
student
LEFTJOIN score ON student.Sid = score.Sid
WHERE
score.Cid =1AND score.Score <60ORDERBY score.Score DESC;
-- 合并SELECT
a.cid,
a.sid,
a.score,count( b.score )+1AS rank
FROM
score AS a
LEFTJOIN score AS b ON a.score < b.score
AND a.cid = b.Cid
GROUPBY-- 分组后对b表中的score数据计数(此时的计数是按照分组依据删选的)。
a.cid,
a.sid,
a.score
ORDERBY
a.cid,
rank ASC;-- 步骤1SELECT*FROM
score AS a
LEFTJOIN score AS b ON a.cid = b.cid;-- 步骤2SELECT*FROM
score AS a
LEFTJOIN score AS b ON a.score < b.score
AND a.cid = b.cid;-- 步骤3SELECT*FROM
score AS a
LEFTJOIN score AS b ON a.score < b.score
AND a.cid = b.cid
GROUPBY
a.cid,
a.sid,
a.score
ORDERBY
a.cid
15.1 按各科成绩进行排序,并显示排名, Score 重复时合并名次
SELECT
a.Cid,
a.Sid,
a.Score,COUNT(DISTINCT b.Score)+1 rank
FROM
score a
LEFTJOIN score b ON a.Cid = b.Cid
AND a.Score < b.Score
GROUPBY
a.Cid,
a.Sid
ORDERBY
a.Cid,
rank ;
SELECT*FROM(SELECT
a.Cid,
a.sid,COUNT( b.Score )+1 rank
FROM
score a
LEFTJOIN score b ON a.Cid = b.Cid
AND a.score < b.score
GROUPBY
a.Cid,
a.Sid
ORDERBY
a.Cid,
rank
)as b
WHERE
rank<4;
SELECT
student.Sid,
student.Sname
FROM
student
WHERE
student.Sid IN(SELECT Score.Sid FROM score GROUPBY score.Sid HAVINGCOUNT( score.Cid )=2);SELECT
student.Sid,
student.Sname
FROM
student
INNERJOIN(SELECT Score.Sid FROM score GROUPBY score.Sid HAVINGCOUNT( score.Cid )=2) a ON student.Sid = a.Sid;
查询男生、女生人数
SELECT
student.Ssex,COUNT( student.Sid ) count
FROM
student
GROUPBY
student.Ssex;
查询名字中含有「风」字的学生信息
SELECT*FROM
student
WHERE
student.Sname LIKE"%风%";
查询同名同性学生名单,并统计同名人数
-- 法1SELECT
b.*,COUNT(b.Sname)"人数"FROM
student a
LEFTJOIN student b ON a.Sname = b.Sname
AND a.Ssex = b.Ssex
AND a.Sid <> b.Sid;-- 法2SELECT
st.*,COUNT(st.Sname)FROM student st -- GROUP BY 相当于取相同值GROUPBY st.Sname,st.ssex HAVINGCOUNT(st.Sname)>1;
查询 1990 年出生的学生名单
SELECT*FROM
student
WHERE
student.Sage BETWEEN"1990-01-01"AND"1990-12-31";
SELECT
student.Sid,
student.Sname,AVG(score.Score) avg
FROM
score
LEFTJOIN student ON score.Sid = student.Sid
GROUPBY
student.Sid
HAVING
avg >=85;
查询课程名称为「数学」,且分数低于 60 的学生姓名和分数
SELECT
student.Sname,
score.Score
FROM
student
LEFTJOIN score ON student.Sid = score.Sid
WHERE
score.Cid =(SELECT
course.Cid
FROM
course
WHERE
course.Cname ="数学")AND score.Score <60;-- 法2 SELECT
student.Sname,
score.Score
FROM
student,
score
WHERE
student.Sid = score.Sid
AND score.Cid =(SELECT
course.Cid
FROM
course
WHERE
course.Cname ="数学")AND score.Score <60;
查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)
SELECT
student.Sid,
score.Cid,
score.Score
FROM
student
LEFTJOIN score ON score.Sid = student.Sid
ORDERBY
student.Sid
查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数
SELECT
student.Sname,
course.Cname,
score.Score
FROM
student,
score,
course
WHERE
student.Sid = score.Sid
AND score.Cid = course.Cid
AND student.Sid NOTIN(SELECT score.Sid FROM score WHERE score.Score <=70);
查询不及格的课程
SELECT
score.Cid,
course.Cname
FROM
score,
course
WHERE
score.Cid = course.Cid
AND score.Score <60GROUP BYss
score.Cid;
查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名
SELECT student.Sid, student.Sname FROM student WHERE student.Sid IN(SELECT score.Sid FROM score WHERE score.Score >80AND score.Cid =1)
SELECT
student.*,MAX(DISTINCT score.Score ) max
FROM
student
LEFTJOIN score ON score.Sid = student.Sid
LEFTJOIN course ON score.Cid = course.Cid
LEFTJOIN teacher ON course.Tid = teacher.Tname
AND teacher.Tname ="张三";
成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
SELECT
student.*,DISTINCT score.Score ) max
FROM
student
LEFTJOIN score ON score.Sid = student.Sid
LEFTJOIN course ON score.Cid = course.Cid
LEFTJOIN teacher ON course.Tid = teacher.Tid
AND teacher.Tname ="张三";
查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
SELECT*FROM
score
LEFTJOIN student ON score.Sid = student.Sid;
查询每门功成绩最好的前两名
SELECT
c.Cid,
student.Sname,
rank
FROM
student
LEFTJOIN(SELECT
a.Cid,
a.Sid,COUNT( b.Score )+1 rank
FROM
score a
LEFTJOIN score b ON a.Cid = b.Cid
AND a.Score < b.Score
GROUPBY
a.Sid,
a.Cid
ORDERBY
a.Cid,
rank
)AS c ON student.Sid = c.Sid
WHERE
c.rank <3ORDERBY
c.cid,
rank;