sql查询练习

1.表的结构

课程表:课程编号cid,课程名称canme,老师tid,
教师表:教师tid,教师姓名tname
分数表:学生student_sid=,课程 cours_id,,分数score
学生表:学生sid,学生姓名sname,学生性别sex,出生年月sbrith

2.查询

2.1、自己写的正确的查询sql

34、查询课程名称为"数学",且分数低于60的学生姓名和分数

course student score

SELECT
s.sname,sc.scoreFROM
course  cs,score  sc,student sWHEREcs.cname='高数'
ANDcs.cid=sc.cours_id
AND
s.sid=sc.student_sid
AND
sc.score<60

15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

SELECT
s.sid,
s.sname,
AVG(score)FROM
score  sc ,student sWHERE
s.sid=sc.student_sid
AND
score<60GROUP BYsc.student_sidHAVINGcount(cours_id)>=2

2.2、自己写的错误的查询sql

22、23、41、42、43

1、查询"1"课程比"2"课程成绩高的学生的信息及课程分数

方式一
SELECT
c.*,
a.score s01,
b.score  s02FROMscore a,score b,student cWHEREa.cours_id='1'
ANDb.cours_id='2'
AND
a.student_sid=b.student_sid
AND
a.score>b.score
AND
a.student_sid=c.sid;
方式二行转列-- 方式二行转列分析:行            01 01  7001 02  90行转成列01 70  90步骤1.先写框架SELECTFROMWHERE步骤2.再从分数表取学号步骤3.CASE  WHEN ..  THEN.. ELSE  NULL  END
步骤4.MAX
步骤5.GROUP BY步骤6.临时表t,条件课程01>课程02,再与学生表连接(条件是临时表的id跟学生表的id一致)SELECT  
s.*,t.s01,
t.s02
FROM
(SELECTa.student_sid,
max(CASE WHEN a.cours_id='1' then a.score END)  s01,
max(CASE WHEN a.cours_id='2' then a.score END)  s02
FROM
score a
GROUP BY
a.student_sid) t,student  s
WHERE
t.s01>t.s02
AND t.student_sid=s.sid;

2、查询"1"课程比"2"课程成绩低的学生的信息及课程分数

方法一
SELECTs.*,a.score  s01,b.score  s02FROM
score a,score b,student sWHERE
a.cours_id='1'AND b.cours_id='2'AND a.student_sid=b.student_sid
AND  a.score<b.score
AND s.sid=a.student_sid
方法二:SELECTc.*,t.s01,
t.s02FROM(SELECTs.student_sid,max(CASE WHEN s.cours_id='1' THEN  s.score ELSE NULL  END) s01,max(CASE WHEN s.cours_id='2' THEN  s.score ELSE NULL  END) s02FROMscore sGROUP BYs.student_sid) t ,student cWHEREt.student_sid=c.sid
AND
t.s01<t.s02

3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩

方式一:
SELECT
sc.student_sid,
s.sname,avg(score) avg_s
FROMscore  sc,student  sWHEREs.sid=sc.student_sidGROUP BY sc.student_sidHAVINGavg_s>=60方式二:SELECTs.student_sid,(select sname
FROM
student s01WHEREs.student_sid=s01.sid
)  sname,avg(score) avg_sFROMscore  sGROUP BYs.student_sidHAVING
avg_s>=60

4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩

方式一:
SELECTs.student_sid,(SELECTs01.snameFROMstudent s01WHERE
s01.sid=s.student_sid)sname,avg(score) avg_sFROMscore sGROUP BY
s.student_sidHAVINGavg_s<60方式二:SELECT
s.student_sid,
s01.sname,avg(score) avg_sFROMscore  s
RIGHT  JOINstudent s01ons.student_sid=s01.sidGROUP BY
s.student_sidHAVINGavg_s<60
    -- (包括有成绩的和无成绩的)

5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩

SELECTsc.student_sid,
s.sname,
count(sc.cours_id),
sum(sc.score)FROM
student s
LEFT JOIN
score sc
ons.sid= sc.student_sidGROUP BYsc.student_sid

8、查询没学过"张三"老师授课的同学的信息(与14重复)

SELECT 
*
FROM
student s
WHEREs.sid NOT  IN(SELECTc.student_sidFROM
tearcher a,course b,score cWHERE
a.tid=b.tid
AND
c.cours_id=b.cidAND a.tname='王老师');

12、查询至少有一门课与学号为"01"的同学所学相同的同学的信息

SELECT * FROM student s,
(SELECT 
DISTINCT 
sc.student_sid 
FROM score sc 
WHERE 
sc.cours_id IN(
SELECTsc.cours_id 
FROM score scWHERE sc.student_sid  = 1)
)b
WHERE s.sid = b.student_sid

15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

SELECT s.sid,s.sname,avg(sc.score) 
from student sINNER  join score sc 
on s.sid = sc.student_sid
where s.sid in(SELECT 
student_sid
from 
score s1 
where
s1.score<60 
group by s1.student_sid
having count(1)>=2) 

20、查询学生的总成绩并进行排名

set @num :=0;
select (@num := @num + 1) AS '排名',t.* from (
select sco.student_sid stu,stuu.sname,sum(sco.score) sum_s from score sco,student stuu 
where sco.student_sid=stuu.sid GROUP BY sco.student_sid HAVING sum_s  
) t;

在这里插入图片描述

set @num :=0;
select sco.student_sid stu,stuu.sname,sum(sco.score) sum_s,(@num := @num + 1) AS '排名' from score sco,student stuu 
where sco.student_sid=stuu.sid GROUP BY sco.student_sid HAVING sum_s  
--8.0之后可以使用
SELECT student_sid, row_number() OVER(ORDER BY student_sid DESC) as row_num FROM score;

在这里插入图片描述

21、查询不同老师所教不同课程平均分从高到低显示

22、查询所有课程的成绩第2名到第3名的学生信息及该课程成绩

 score s
student st
course  cselect s.cours_id,count(s.cours_id) from score s  GROUP BY s.cours_id--得到课程号
select course_id from (select s.cours_id course_id,count(s.cours_id) number from score s GROUP BY s.cours_id ) t  where t.number >2select * from score s where s.select * from score s INNER JOIN (select course_id from (select s.cours_id course_id,count(s.cours_id) number from score s GROUP BY s.cours_id ) t  where t.number >2) s2 
where s.cours_id =s2.course_id  order by s.cours_id desc limit 1,2; SELECT co.cid 课程,(select sc.student_sid from score sc where sc.cours_id = co.cid order by sc.score desc limit 1, 1) 第二名,
(select sc.student_sid from score sc where sc.cours_id = co.cid order by sc.score desc limit 2, 1) 第三名 from course co;--得到课程/的第2名,第3名 的学生信息
SELECT co.cid 课程,(select sc.student_sid from score sc where sc.cours_id = co.cid order by sc.score desc limit 1, 1) 第二名,
(select sc.student_sid from score sc where sc.cours_id = co.cid order by sc.score desc limit 2, 1) 第三名 from 
(select cid from (select s.cours_id cid,count(s.cours_id) number from score s GROUP BY s.cours_id ) t  where t.number >2) co;(select st.*,sc.score,1 from score sc,student st where sc.student_sid=st.sid and sc.cours_id='1' order by sc.score desc limit 1,2) 
union all
(select st.*,sc.score,2 from score sc,student st where sc.student_sid=st.sid and sc.cours_id='2' order by sc.score desc limit 1,2) 

在这里插入图片描述

23、统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]及所占百分比

select c.cid,c.cname,
Max(sc.score) '最高分',
MIN(sc.score) '最低分',
AVG(sc.score) '平均分',
SUM(case when sc.score<60 then 1 else 0 end) "60分以下的人数",SUM(case when sc.score<60 then 1 else 0 end)/count(sc.student_sid)  "60分的百分比",
SUM(case when sc.score>=60 and sc.score<70 then 1 else 0 end) "60-70分的人数",SUM(case when sc.score>=60 and sc.score<70 then 1 else 0 end)/count(sc.student_sid) "60-70分的百分比",
SUM(case when sc.score>=70 and sc.score<80 then 1 else 0 end) "70-80分的人数",SUM(case when sc.score>=70 and sc.score<80 then 1 else 0 end)/count(sc.student_sid) "70-80分的百分比",
SUM(case when sc.score>=80 and sc.score<90 then 1 else 0 end) "80-90分的人数",SUM(case when sc.score>=80 and sc.score<90 then 1 else 0 end)/count(sc.student_sid) "80-90分的百分比",
SUM(case when sc.score>=90 then 1 else 0 end) "90分以上的人数",SUM(case when sc.score>=90 then 1 else 0 end)/count(sc.student_sid) "90分以上的百分比"
from score sc 
inner join course c on sc.cours_id=c.cid group by c.cid

在这里插入图片描述

29、查询名字中含有"li"字的学生信息

    SELECT
s.*FROM
student  sWHERE
s.sname LIKE '%li%'

40、查询选修"周老师“所授课程的学生中,成绩最高的学生信息及其成绩

SELECT s.* ,sc.score FROM course c,score  sc,tearcher t,student s 
WHERE
t.tid = c.tid
AND t.tname = '周老师'
AND c.cid = sc.cours_id
AND s.sid = sc.student_sid
ORDER BY sc.score DESC LIMIT 1

41、查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩

  select c1.student_sid,c1.cours_id,c1.score from score  as c1 join score as c2	 on c1.student_sid=c2.student_sidwhere c1.cours_id !=c2.cours_id and c1.score=c2.score group by c1.student_sid,c1.cours_id;

在这里插入图片描述

42、查询每门功成绩最好的前两名

43、统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列

SELECT sc.cours_id,COUNT(1) FROM score sc
LEFT JOIN course c ON c.cid=sc.cours_id
GROUP BY c.cid HAVING COUNT(1)>2
ORDER BY COUNT(1) DESC,sc.cours_id ASC

在这里插入图片描述

45、查询选修了全部课程的学生信息

自己写的错误sql
SELECTs1.*FROM
course cLEFT JOIN
score  sON
c.cid=s.cours_idLEFT JOIN
student s1ONs1.sid=s.student_sid--成功查询的sql1
select * from student  stu
where stu.sid in(
select student_sid from score sco group by sco.student_sid having count(*)=(select count(*) from course)
)--成功查询的sql2
SELECT stu.* FROM score  sco,student stu  where sco.student_sid = stu.sid GROUP BY 
sco.student_sid HAVING count(sco.cours_id) =(select count(1) from course)

16、检索"1"课程分数小于60,按分数降序排列的学生信息

错误的sqlSELECTs.*,sc.score,sc.cours_id
FROMscore   sc,student  sWHERE
sc.student_sid=s.sid
GROUP BYsc.cours_id=1HAVING
sc.score<60ORDER BYsc.scoreDESC
正确的sql
SELECTs.*,sc.cours_id,sc.score
FROMscore   sc,student  sWHEREsc.cours_id=1AND
sc.student_sid=s.sid
AND
sc.score<60ORDER BYsc.scoreDESC
### 29、查询名字中含有"li"字的学生信息```sql
错误的sql
SELECT
s.sname
FROM
student s
WHERE
s.sname LIKE %li
正确的sql
SELECT
s.*FROM
student  sWHERE
s.sname LIKE '%li%'

33、查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩

自己写的错误sqlSELECTs.sname,s.sid, avg(score)  avg_s
FROM
score  sc,student  sWHEREavg_s>=85and
sc.student_sid=s.sid;
正确sql
SELECTs.sname,sc.student_sid, avg(score)  avg_s
FROM
score  sc,student  sWHEREsc.student_sid=s.sidGROUP BYsc.student_sidHAVING
avg_s>=85

37、查询不及格的课程

自己写的sqlselect
cour_sid
from
score
where
score<60;
正确的sql
SELECTs.student_sid,c.cid,c.cname 
FROMscore  s,course  cWHEREc.cid=s.cours_id
ANDscore<60

50、查询下月过生日的学生

自己写的:

SELECT
sname
FROM
student  s
WHERE

正确答案:

SELECT
*fromstudent sWHEREmonth(s.sbrith)=month(CURDATE())+1;

错误分析:1.不知道下个月是用month(字段)=month(curdate())+1这样的写法
2.根据题干过生日的学生,应该是查询学生表的全部信息,而不是查名字

49、查询本月过生日的学生

自己没有写出来

正确答案:

SELECT
*
fromstudent sWHEREmonth(s.sbrith)=month(CURDATE());

错误分析:不知道本月是用month(字段)=month(curdate());

46、查询各学生的年龄

-- 按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一

47、查询本周过生日的学生

自己没有写出来

正确答案:

SELECT
*
FROM
student sWHERE
WEEKOFYEAR(s.sbrith)=WEEKOFYEAR(CURDATE());

错误分析:不知道本周是用weekofyear(字段)=weekyear(curdate());

48、查询下周过生日的学生

自己没有写出来

正确答案:

SELECT
*
FROMstudent  sWHEREWEEKOFYEAR(s.sbrith)=WEEKOFYEAR(CURDATE())+1;

错误分析:不知道下周是用weekofyear(字段)=weekyear(curdate())+1;

44、检索至少选修两门课程的学生学号

自己写的:

SELECTs.student_sid,
count(s.cours_id)  cntFROMscore  sGROUP BY
s.student_sid
HAVING
cnt >=2

正确答案:

SELECT
s.student_sidFROM
score  sGROUP BYs.student_sid
HAVING
count(s.cours_id) >=2

错误分析:题干是学生学号,select后不应加count的字段

39、求每门课程的学生人数

自己写的:
自己分析到两张表:score student

SELECT
s.cours_id,
count(s.student_sid)
FROMscore s,student  s1
WHERE  
s1.sid=s.student_sidGROUP BY
s.cours_id

正确答案:
course score

SELECT
c.cname,
s.cours_id,
COUNT(s.student_sid)FROM
score s,course  cWHERE
s.cours_id=c.cidGROUP BYs.cours_id

错误分析:1.找表找错误,找到score student,而根据题干每门课程的学生人数 应该是course score

38、查询课程编号为1且课程成绩在80分以上的学生的学号和姓名;

score score
自己写的:

SELECT
s01.student_sid,s.sname,s01.score
FROM
score  s01,student  s
WHERE
s01.cours_id=1
AND
s01.score>=80
AND
s.sid=s01.student_sid

正确答案:

SELECT
s01.student_sid,s.snames
FROM
score  s01,student  s
WHERE
s01.cours_id=1
AND
s01.score>=80
AND
s.sid=s01.student_sid

错误分析:1.根据题干select后面应该是学号和姓名,自己多写了个课程

36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数;

score course student
自己没写出来

正确答案:

SELECT
s1.sname,
c.cname,
s.score
FROM
score s, student  s1,course  c
WHERE
s1.sid=s.student_sid
AND
s.cours_id=c.cid
AND
s1.sid IN(
SELECT 
sc.student_sid
FROM
score sc
GROUP BY
sc.student_sid
HAVING
MIN(sc.score)>=70)

错误分析:1.根据题干查询任何一门课程成绩在70分以上,没有想到可以用学号在大于70分中的学号查找
2.没有想到到可以求出最小的成绩都大于70分,则其他也大于70分

35、查询所有学生的课程及分数情况;

student score

自己写的:

SELECT
sc.cours_id,sc.score
FROMscore  sc
LEFT  JOIN
student s
ON
s.sid=sc.student_sid

正确答案:

SELECT
s.sname,cs.cname,sc.score
FROM
student s
LEFT JOIN
score sc
ON s.sid=sc.student_sid
LEFT JOIN
course  cs
ON
cs.cid=sc.cours_id

错误分析:1.题干查询所有学生的课程及分数情况;所有学生,的课程,及分数情况,包含三张表,我找了两表.
2.所有学生,应该是以学生表为准

32、查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列

自己写的:
score course

SELECT
cs.cname,
cs.cid,
avg(sc.score) avg
FROM
score   sc,course cs
WHERE
sc.cours_id=cs.cid
GROUP BY
cs.cid
HAVING
avg DESC
AND
cs.cid 

正确答案1:

SELECT
sc.cours_id,
avg(sc.score) avg
FROM
score  sc
GROUP BY       777
sc.cours_id
ORDER BY
avg DESC,
sc.cours_id

错误分析:1.根据题干结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列 ,后面排序的时候不能用and,用,直接就行
2.找表错误,我找了两张表,直接在score表中,对每门课程id进行分组

30、查询同名同性学生名单,并统计同名人数

自己没写出来:
正确答案:

SELECT
s.sname,s.sex,count(s.sname) cs
from
student s
GROUP BY
s.sname,s.sex
HAVING
cs>1

错误分析:1.思维受限:没有想到同名人数可以用计数方式>1表示只要大于1,就代表同名

31、查询1997年出生的学生名单

自己写的

SELECT
s.*
FROM
student sWHEREsbrith='1997'

正确答案1

SELECT
s.*
FROM
student sWHEREs.sbrith   LIKE '1997%' 

正确答案2

SELECT s.sname FROM student s WHERE YEAR(s.sbrith)='1997'

错误分析:1990出生,不能写成sbrith=‘1997’,而应该写成 LIKE '1997%'或者 YEAR(s.sbrith)=‘1997’

26、查询每门课程被选修的学生数

自己写的:

SELECT
sc.cours_id,
COUNT(sc.student_sid)
FROM
score  sc
GROUP BY
sc.cours_id

正确答案:

SELECT
b.cours_id,a.cname,
COUNT(b.student_sid)  cnt
FROM
course a
LEFT JOIN
score b
ON
a.cid=b.cours_id
GROUP BY
b.cours_id

错误分析:根据题干每门课程被选修的学生数 ,应该是按每门课程为准,应该是两张表,只有一张表.

27、查询出只有两门课程的全部学生的学号和姓名

自己写的:

SELECT
s.sid,s.sname,count(sc.cours_id)  cnt
FROM
score  sc,
student s
WHERE
s.sid=sc.student_sid
AND
count(cnt)>2

正确答案:

SELECT
s.sid,s.sname,count(sc.cours_id)  cnt
FROM
score  sc,student sWHEREs.sid=sc.student_sidGROUP BYs.sid
HAVING
count(cnt)>2

错误分析:1.没有对学号进行分组

28、查询男生、女生人数

自己写的:

SELECT
count(s.sex='男')  cg,
count(s.sex='女')  cw
FROM
student sGROUP BY
cg,cs

正确答案

SELECTs.sex,count(s.sid)  cntFROM
student  sGROUP BYs.sex 

错误分析:1.没有想到可以根据sex进行分组
2.没有想到统计人数是根据学生id统计

24、查询学生平均成绩及其名次

score
自己写的:

SELECTsc.student_sid,avg(sc.score) avgsFROMscore   sc
GROUP BYsc.student_sid

改:
8.0以上用rank函数,8.0以下5.7用子查询

SELECT
t.*,
rank() over(ORDER BY  avgs  DESC) rkFROM(SELECTsc.student_sid,avg(sc.score) avgsFROMscore   sc
GROUP BYsc.student_sid)   t

错误分析:没有想到名次可以用开窗函数random以及子查询 子查询???,子查询暂时不会,先记录一下

13、查询和"1"号的同学学习的课程完全相同的其他同学的信息

思路:1)根据1所学,构建一张临时表,所有人所学跟的课程跟1所学的课程相同。

SELECT s01.*,cours_idFROM
student s01,
(SELECT
sc.cours_idFROMscore  sc,
student sWHERE
sc.student_sid=s.sid
ANDs.sid='1')t

2)用构建的跟1所需课程相同的临时表b与每个人真实所学的score表连接,真实比较,如学号跟课程号完全对应,即就是所学相同。SELECT

正确答案2:

CREATE TABLE s01_s_temp AS
SELECT
b.*,s02.cours_id  csidFROM(
SELECT s01.*,cours_idFROM
student s01,
(SELECT
sc.cours_idFROMscore  sc,
student sWHERE
sc.student_sid=s.sid
ANDs.sid='1')t )bLEFT JOINscore  s02ONb.sid=s02.student_sid
AND
b.cours_id=s02.cours_idUNIONSELECT
b.*,s02.cours_id  csidFROM(
SELECT s01.*,cours_idFROM
student s01,
(SELECT
sc.cours_idFROMscore  sc,
student sWHERE
sc.student_sid=s.sid
ANDs.sid='1')t ) bRIGHT  JOINscore  s02ONb.sid=s02.student_sid
AND
b.cours_id=s02.cours_id
SELECT *FROM  s01_s_temp
假设左右没有完全对应\有null就是和1所学不相同SELECT *FROM  s01_s_temp  WHERE  csid IS  NULL  OR cours_id IS NULLSELECT  *FROMstudent
WHERE
sid
NOT IN(
SELECT sid FROM  s01_s_temp  WHERE  csid IS  NULL  OR cours_id IS NULL)

正确答案2:

select 
s.* 
from 
student  s 
where s.sid 
in
(select 
distinctsc.cours_id
from 
score scwheresc.student_sid <> '1' 
and sc.cours_id
in (selectdistinct 
s01.cours_idfrom 
score s01
where 
s01.cours_id = '1')
group by sc.cours_id having count(1) 
=(select count(1) from score sc02 where sc02.cours_id='1'))

14、查询没学过"张三"老师讲授的任一门课程的学生姓名

自己写的答案被覆盖了,找不到我写的答案了
正确答案:
tearcher course score student

SELECT 
*
FROM
student s
WHEREs.sid NOT  IN(SELECTc.student_sidFROM
tearcher a,course b,score cWHERE
a.tid=b.tid
AND
c.cours_id=b.cidAND a.tname='王老师');

错误分析:1.没有想到没有学过张三老师即就是查找出的学号不在学过张三老师课程学号的思路
2.根据题干分析学过"张三"老师讲授的任一门课程的学生姓名 ,应该是四张表进行关联

17、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

score
自己写的答案被覆盖了,找不到我写的答案了

正确答案:

SELECT
s.sname,sc.cours_id,c.cname,sc.score,avg(sc.score) avg_s
FROM
student   s
RIGHT  JOIN
score   scON
sc.student_sid=s.sid
RIGHT JOIN
course c
ON
c.cid=sc.cours_id
GROUP BY
s.sid
ORDER BY
avg_s
DESC

错误分析:1.自己做的时候没考虑到所有学生,错误是因为两张表找错,根据题干平均成绩从高到低显示所有学生的所有课程的成绩 学生表,分数表

11、查询没有学全所有课程的同学的信息

正确答案:

SELECT
s.*
FROM
score sc
RIGHT JOIN
student s
ON
sc.student_sid=s.sid
GROUP BY
s.sid
HAVING
count(cours_id)<
(
SELECT
COUNT(sco.cours_id)    
FROM
score  sco
) 

错误分析:没有想到没有学全即就是通过分组后通过having的课程数小于学全课程数,根据两张表student,score

10、查询学过编号为"1"但是没有学过编号为"2"的课程的同学的信息

正确答案:

SELECT
s.*
FROM
score a,student  s
WHERE
a.cours_id=1
AND
s.sid=a.student_sid
AND
s.sid
NOT  IN
(
SELECT
c.student_sid
FROM
score c
WHERE
c.cours_id=2
);

错误分析:1.没有想到没有学过编号为"2"的课程的同学信息即就是学号不在学号为2的课程中的学生

9、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息

自己找的表:course student两表

正确答案:
score a,score b,student s三张表


SELECT
s.*FROMscore a,score b,student s
WHERE
a.cours_id='1'
AND
b.cours_id='2'
AND
a.student_sid=b.student_sid
AND
s.sid=b.student_sid

错误分析:找错表

7、查询学过"张三"老师授课的同学的信息

SELECT
s01.*
FROM
(
SELECT
t.cid tcid
FROM
tearcher t
WHERE
tname='王老师') t,
score s,
student s01
WHERE
t.tcid=s.cours_id
AND
s01.sid=s.student_sid

开始第一遍做的:

SELECT
s2.*
FROM
(SELECT
s.student_sid  sid
FROM
(
SELECT
t.tid,
t.cid,
t.tname
FROM
tearcher t
WHERE
tname='李老师')  t
INNER JOIN
score  s
ON
t.cid=s.cid)   s1,student s2
WHERE
t.sid=s2.sid;

正确答案一:

1.根据张三老师在teacher表找出tid
2.根据查找出的tid在course中的找到对应的cid
3.再根据course中的cid再score表找到对应的sid
4.再根据sid在student表找到相关信息

SELECTd.*FROM
tearcher a,course b,score c,student dWHERE
a.tid=b.tid
AND
c.cours_id=b.cid
AND
c.student_sid=d.sidAND a.tname='王老师'

正确答案二:

SELECT * FROMstudentWHEREsid in(SELECTc.student_sidFROM
tearcher a,course b,score cWHERE
a.tid=b.tid
AND
c.cours_id=b.cid
AND a.tname='王老师')

错误分析:根据题干学过"张三"老师授课的同学的信息 ,应该是四张表

6、查询"李"姓老师的数量

tearcher
自己写的:
SELECT

count(tid)

FROM
tearcher t

WHERE

sname LIKE %李%

正确答案:

SELECT
COUNT(tname)FROM
tearcherWHERE
tname like '李%'

错误分析:没有弄清楚%的用法,%%是找中间含有的字,放在后面是找后面的,这里还需要好好在记录一下s

18.查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率

自己写的:
score course

SELECTs.cours_id,s.cname,max(s.score),min(s.score),avg(s.sccore),FROMscore  s,course  cGROUP BYs.cours_id

正确答案:

score course

SELECTs.cours_id,c.cname,max(s.score),min(s.score) 最低分,avg(s.score)  平均分,
SUM(CASE  WHEN  s.score>=60 THEN   1  ELSE  0  END)/count(1)  及格率,
SUM(CASE  WHEN  s.score>=70 AND   s.score<80 THEN   1  ELSE  0  END)/count(1) 中等率,
SUM(CASE  WHEN  s.score>=80 AND   s.score<90 THEN   1  ELSE  0  END)/count(1) 优良率,SUM(CASE  WHEN  s.score>=90 THEN   1  ELSE  0  END)/count(1) 优秀率
FROMcourse  c
LEFT JOIN
score  sON
s.cours_id=c.cidGROUP BY
s.cours_id

错误分析:没想到可以用case when 1.及格率、中等率,优良率,优秀率是用分数的总和除以总数

19、按各科成绩进行排序,并显示排名(实现不完全)

自己写的:

score  course
SELECTRAND() over()FROM
(SELECT
c.cname,s.scoreFROMscore  s ,course  cWHEREs.cours_id=cours_idORDER BYs.score desc)

正确答案一:
函数8.0以上使用

SELECT
s.*,RANK() over(partition order  by  s_cour_id DESC)
FROM
score  s

正确答案二:
8.0以下使用子查询方式

SELECTs.*,(SELECT count( sc.score) from    score  sc  where sc.cours_id=s.cours_id AND sc.score<s.score) rkFROM
score   s

错误分析:1.排名应该是写rank() over(partion order by 字段 desc)
2.子查询的方式条件是

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/40755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DC/AC电源模块为现代电子设备提供稳定的能源

BOSHIDA DC/AC电源模块为现代电子设备提供稳定的能源 DC/AC电源模块是一种重要的电子设备&#xff0c;它为现代电子设备提供稳定的能源。在今天的高科技社会中&#xff0c;电子设备已经成为人们生活和工作的重要组成部分。从家用电器到计算机、手机、汽车和航天航空设备&…

基于antv x6实现的组织架构图

X6 是基于 HTML 和 SVG 的图编辑引擎&#xff0c;基于 MVC 架构&#xff0c;用户更加专注于数据逻辑和业务逻辑。 一、业务背景 将组织树形结构图形化&#xff0c;更直观的展示个人所在的组织架构。 二、功能点 组织结构按需渲染&#xff0c;支持层级展开、收缩按需求自定义…

【软件测试】之黑盒测试用例的设计

&#x1f3c0;&#x1f3c0;&#x1f3c0;来都来了&#xff0c;不妨点个关注&#xff01; &#x1f3a7;&#x1f3a7;&#x1f3a7;博客主页&#xff1a;欢迎各位大佬! 文章目录 1.测试用例的概念2.测试用例的好处3. 黑盒测试用例的设计3.1 黑盒测试的概念3.2 基于需求进行测…

AI绘画Stable Diffusion画全身图总是人脸扭曲?ADetailer插件实现一键解决!

大家好&#xff0c;我是向阳 你是否遇到过SD生成的人物脸部扭曲、甚至令人恶心的情况&#xff1f;也曾感到束手无策&#xff1f;别担心&#xff0c;这份教程专为你而来。 在使用SD生成人物全身照时&#xff0c;你可能经常发现人物的脸部会出现扭曲问题。这是因为人物面部像素…

【前端】IntersectionObserver 实现图片懒加载和无限滚动

【前端】IntersectionObserver 实现图片懒加载和无限滚动 在前端开发中&#xff0c;性能优化是一个重要的考量因素。随着现代网页和应用的复杂性增加&#xff0c;确保页面快速加载和流畅运行变得越来越重要。本文将介绍一种强大的工具——IntersectionObserver API&#xff0c…

LabVIEW新能源汽车电池性能测试系统

新能源汽车的核心部件之一是电池&#xff0c;其性能直接关系到整车的续航里程、安全性和寿命。为了确保电池的性能和可靠性&#xff0c;测试是必不可少的环节。本文介绍了一种基于LabVIEW的新能源汽车电池性能测试系统&#xff0c;通过LabVIEW与数据采集设备的无缝集成&#xf…

Unity 实现UGUI 简单拖拽吸附

获取鼠标当前点击的UI if(RectTransformUtility.RectangleContainsScreenPoint(rectTransform, Input.mousePosition)) {return rectTransform.gameObject; } 拖拽 在Update 中根据鼠标位置实时更新拖拽的图片位置。 itemDrag.transform.position Input.mousePosition; …

秒拿AI模型API Key!Chat2DB AI模型切换实用秘籍

智谱AI&#xff08;ZhiPu AI&#xff09; 智谱 AI 是由清华大学计算机系技术成果转化而来的公司&#xff0c;致力于打造新一代认知智能通用模型。 1.申请调用权限 智谱AI开放平台网址&#xff1a;https://open.bigmodel.cn/ 点击开始使用&#xff0c;进行登录/注册。 智谱A…

The Sandbox 创作者的幕后采访: 了解创作者的内心世界

我们采访了一些在 "创作者挑战" 中脱颖而出的顶尖创作者&#xff0c;探讨他们成功的秘诀以及在创造玩家喜爱的体验方面的心得。 The Sandbox 创作者挑战涌现出许多才华横溢的创作者&#xff0c;他们在游戏制作机制上的创新和突破引起了 The Sandbox 社区的广泛关注。…

大白菜U盘启动工具

大白菜如何u盘启动进winpe装系统大白菜是一款非常实用的U盘启动盘制作工具&#xff0c;可以帮助用户快速地将U盘制作成启动盘&#xff0c;从而方便地进行系统安装、维护和修复等操作。官方网站&#xff1a; 大白菜u盘启动盘制作工具_大白菜u盘装系统_大白菜pe_大白菜官网-首页…

Spring AI 1.0.0 新变化,从 0.8.1 如何升级

Spring AI 1.0.0-M1 版本已经发布&#xff0c;距离 1.0.0 正式版又更近了一步。同时这也意味着&#xff0c;Spring AI 1.0.0 的 API 已经基本确定&#xff0c;不会发生大的改动。这里介绍一下&#xff0c;相对于上一个发布版本 0.8.1&#xff0c;Spring AI 1.0.0 的一些重要的变…

轻松跨越国界:使用WildCard畅享全球AI服务

大家好&#xff0c;现在AI技术已经深入到我们的日常生活中。然而&#xff0c;许多朋友仍然难以获取优质的AI工具和应用。那么&#xff0c;如何才能使用像ChatGPT这样的AI服务呢&#xff1f; 今天我为大家介绍一个“一劳永逸”的解决方案&#xff0c;它就是我们的主角——WildC…

阿里云 ECS 服务器的安全组设置

阿里云 ECS 服务器的安全组设置 缘由安全组多个安全组各司其职一些常见的IP段百度 IP 段华为云 IP 段搜狗蜘蛛 IP 段阿里云 IP 段 。。。 缘由 最近公司规模缩减&#xff0c;原有的托管在 IDC 机房的服务器&#xff0c;都被处理掉了&#xff0c;所有代码都迁移到了阿里云的云服…

腾讯云函数部署环境[使用函数URL]

使用函数URL 之前使用的是网关API,最近腾讯云的网关API说要关闭了,所以没有办法这里改成函数URL,使用后发现只要不是在浏览器直接访问的情况,函数URL都可以满足! 这里结合腾讯云函数node.js返回自动带反斜杠这篇文章来做说明,比如这里的URL如下: 结合文章腾讯云函数node.js返…

T113基于评估板SDK配置PD引脚异常

使用PD0/PD1/PD2作为IO输入时,发现输入检测到的值异常,断开输入的信号,直接示波器打IO口,还能发现波形信号,猜测该引脚存在引脚复用情况。 原因 这三个引脚在默认系统是作为显示相关引脚功能。 解决方法 1 ) Uboot修改

99. 岛屿数量

题目描述&#xff1a;给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的矩阵&#xff0c;你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成&#xff0c;并且四周都是水域。你可以假设矩阵外均被水包围。 输入描述&#xff1a…

SSZipArchive 解压后 中文文件名乱码问题

不知道什么情况&#xff0c;做为一个三方广泛使用的框架库&#xff0c;会出现这种比较低级的问题&#xff01; 还有中文的文件名解压后显示乱码&#xff01; 经过深入研究排查&#xff0c;发现目录或文件名编码错误&#xff01;但是POD库&#xff0c;不可能直接在里面改&#…

Objective-C语法基础

注&#xff1a;编译器版本 XCode 15.4 新建一个XCode项目 新建一个类 1、成员变量、属性 1.1、类内使用成员变量&#xff0c;类外使用属性 Role.h #import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGINinterface Role : NSObject {//成员变量&#xff1a;只能…

Ubuntu18.04安装AutoWare.ai(完整版)

目录 目录 一、安装Opencv 1.1 下载安装包Opencv官网 1.2 安装opencv_contrib 二、安装Eigen库 1. 解压文件 2. 安装Eigen 3. 配置路径&#xff1a; 三、安装Ros和rosdepc 四、安装Autoware.ai-1.14.0 4.1 安装依赖 4.2 下载Autoware.ai 1.在home路径下打开终端输…

RUP开发模型-系统架构师(二十三)

1、RUP是一个二维软件开发模型&#xff0c;其核心特点之一是&#xff08;&#xff09;。RUP将软件开发周期划分多个循环&#xff0c;每个循环由4个连续阶段组成&#xff0c;每个阶段完成确定的任务。设计及确定系统的体系结构&#xff0c;制定工作计划及资源要求在&#xff08;…