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.score

FROM
course  cs,score  sc,student s

WHERE

cs.cname='高数'
AND

cs.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 s

WHERE
s.sid=sc.student_sid
AND
score<60

GROUP BY

sc.student_sid

HAVING

count(cours_id)>=2

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

22、23、41、42、43

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

方式一
SELECT
c.*,
a.score s01,
b.score  s02


FROM

score a,score b,student c


WHERE

a.cours_id='1'
AND

b.cours_id='2'
AND
a.student_sid=b.student_sid
AND
a.score>b.score
AND
a.student_sid=c.sid;
方式二行转列

-- 方式二行转列


分析:行            01 01  70

                    01 02  90

      行转成列

                    01 70  90


步骤1.先写框架

SELECT


FROM



WHERE

步骤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
(SELECT

a.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"课程成绩低的学生的信息及课程分数

方法一
SELECT
   s.*,
   a.score  s01,
   b.score  s02


FROM
score a,score b,student s


WHERE
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
方法二:


SELECT
  c.*,
 t.s01,
t.s02

FROM


(SELECT

   s.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) s02


FROM
  score s

GROUP BY
 s.student_sid) t ,student c

WHERE

t.student_sid=c.sid
AND
t.s01<t.s02

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

方式一:
SELECT
sc.student_sid,
s.sname,




avg(score) avg_s
FROM

score  sc,student  s


WHERE

s.sid=sc.student_sid



GROUP BY 


sc.student_sid


HAVING


avg_s>=60






方式二:



SELECT

s.student_sid,


(select 

sname
FROM
student s01

WHERE

s.student_sid=s01.sid
)  sname,

avg(score) avg_s


FROM
 score  s



GROUP BY


s.student_sid

HAVING
avg_s>=60

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

方式一:
SELECT

s.student_sid,


(SELECT

s01.sname

FROM
 student s01

WHERE
s01.sid=s.student_sid


)sname,


avg(score) avg_s



FROM

score s


GROUP BY
s.student_sid

HAVING

avg_s<60





方式二:




SELECT
s.student_sid,
s01.sname,

avg(score) avg_s




FROM

score  s
RIGHT  JOIN

student s01

on

s.student_sid=s01.sid

GROUP BY
s.student_sid

HAVING

avg_s<60
    -- (包括有成绩的和无成绩的)

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

SELECT
 sc.student_sid,
s.sname,
count(sc.cours_id),
sum(sc.score)


FROM
student s
LEFT JOIN
score sc
on
 s.sid= sc.student_sid


GROUP BY
 sc.student_sid

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

SELECT 
*
FROM
student s
WHERE

s.sid NOT  IN(

SELECT

c.student_sid

FROM
tearcher a,course b,score c

WHERE
a.tid=b.tid
AND
c.cours_id=b.cid

AND a.tname='王老师');

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

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

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

SELECT s.sid,s.sname,avg(sc.score) 
from student s
 INNER  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) 
group by s.sid;

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  c



select 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 >2

 
select * 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  s

WHERE
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_sid
 where 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
SELECT

s1.*

FROM
course c


LEFT JOIN
score  s

ON
c.cid=s.cours_id



LEFT JOIN
student s1

ON

s1.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,按分数降序排列的学生信息

错误的sql

SELECT

s.*,sc.score,sc.cours_id
FROM

score   sc,student  s

WHERE
sc.student_sid=s.sid
GROUP BY

sc.cours_id=1

HAVING
sc.score<60


ORDER BY

sc.score

DESC
正确的sql
SELECT

s.*,sc.cours_id,sc.score
FROM

score   sc,student  s

WHERE

sc.cours_id=1

AND
sc.student_sid=s.sid
AND
sc.score<60


ORDER BY

sc.score

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


```sql
错误的sql
SELECT
s.sname
FROM
student s
WHERE
s.sname LIKE %li
正确的sql
SELECT
s.*

FROM
student  s

WHERE
s.sname LIKE '%li%'

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

自己写的错误sql

SELECT
  s.sname,s.sid, avg(score)  avg_s
FROM
score  sc,student  s

WHERE

avg_s>=85

and
sc.student_sid=s.sid;
正确sql
SELECT
  s.sname,sc.student_sid, avg(score)  avg_s
FROM
score  sc,student  s

WHERE

sc.student_sid=s.sid

GROUP BY

sc.student_sid

HAVING
avg_s>=85

37、查询不及格的课程

自己写的sqlselect
cour_sid
from
score
where
score<60;
正确的sql
SELECT

s.student_sid,c.cid,c.cname 
FROM

score  s,course  c

WHERE

c.cid=s.cours_id
AND

score<60


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

自己写的:

SELECT
sname
FROM
student  s
WHERE

正确答案:

SELECT
*

from

student s

WHERE

month(s.sbrith)=month(CURDATE())+1;

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

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

自己没有写出来

正确答案:

SELECT
*
from

student s

WHERE

month(s.sbrith)=month(CURDATE());

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

46、查询各学生的年龄

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

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

自己没有写出来

正确答案:

SELECT
*
FROM
student s

WHERE
WEEKOFYEAR(s.sbrith)=WEEKOFYEAR(CURDATE());

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

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

自己没有写出来

正确答案:

SELECT
*
FROM

student  s

WHERE

WEEKOFYEAR(s.sbrith)=WEEKOFYEAR(CURDATE())+1;

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

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

自己写的:

SELECT

s.student_sid,
count(s.cours_id)  cnt

FROM

score  s

GROUP BY
s.student_sid
HAVING
cnt >=2

正确答案:

SELECT
s.student_sid

FROM
score  s

GROUP BY

s.student_sid
HAVING
count(s.cours_id) >=2


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

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

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

SELECT
s.cours_id,
count(s.student_sid)
FROM
 score s,student  s1
WHERE  
s1.sid=s.student_sid

GROUP BY
s.cours_id

正确答案:
course score

SELECT
c.cname,
s.cours_id,
COUNT(s.student_sid)

FROM
score s,course  c

WHERE
s.cours_id=c.cid

GROUP BY

s.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
FROM
  score  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 s

WHERE

sbrith='1997'

正确答案1

SELECT
s.*
FROM
student s

WHERE

s.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 s

WHERE

s.sid=sc.student_sid

GROUP BY

s.sid
HAVING
count(cnt)>2

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

28、查询男生、女生人数

自己写的:

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

GROUP BY
cg,cs

正确答案

SELECT

s.sex,count(s.sid)  cnt

FROM
student  s

GROUP BY

s.sex 

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

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

score
自己写的:

SELECT

sc.student_sid,

  avg(sc.score) avgs

FROM

score   sc
GROUP BY

sc.student_sid

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

SELECT
t.*,
rank() over(ORDER BY  avgs  DESC) rk

FROM

(

SELECT

sc.student_sid,

  avg(sc.score) avgs


FROM

score   sc
GROUP BY

sc.student_sid)   t

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

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

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

SELECT 

s01.*,cours_id



FROM
student s01,
(

SELECT
sc.cours_id

FROM

score  sc,
student s

WHERE
sc.student_sid=s.sid
AND

s.sid='1')t

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

正确答案2:

CREATE TABLE s01_s_temp AS
SELECT
b.*,s02.cours_id  csid

FROM

(
SELECT 

s01.*,cours_id



FROM
student s01,
(

SELECT
sc.cours_id

FROM

score  sc,
student s

WHERE
sc.student_sid=s.sid
AND

s.sid='1')t )b


LEFT JOIN

score  s02


ON

b.sid=s02.student_sid
AND
b.cours_id=s02.cours_id

UNION





SELECT
b.*,s02.cours_id  csid

FROM

(
SELECT 

s01.*,cours_id



FROM
student s01,
(

SELECT
sc.cours_id

FROM

score  sc,
student s

WHERE
sc.student_sid=s.sid
AND

s.sid='1')t ) b


RIGHT  JOIN

score  s02


ON

b.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 NULL



SELECT  *
 FROM

student
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 
distinct
 sc.cours_id
from 
score sc

where

 sc.student_sid <> '1' 
and 

sc.cours_id
in 

(select
 distinct 
s01.cours_id
 from 
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
WHERE

s.sid NOT  IN(

SELECT

c.student_sid

FROM
tearcher a,course b,score c

WHERE
a.tid=b.tid
AND
c.cours_id=b.cid

AND 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   sc

ON
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.*

FROM
 score 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表找到相关信息

SELECT

d.*

FROM
tearcher a,course b,score c,student d

WHERE
a.tid=b.tid
AND
c.cours_id=b.cid
AND
c.student_sid=d.sid

AND a.tname='王老师'

正确答案二:

SELECT * FROM

student

WHERE

sid in(

SELECT

c.student_sid

FROM
tearcher a,course b,score c

WHERE
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
tearcher

WHERE
tname like '李%'

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

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

自己写的:
score course

SELECT

s.cours_id,s.cname,max(s.score),min(s.score),avg(s.sccore),

FROM

score  s,course  c

GROUP BY

s.cours_id

正确答案:

score course

SELECT

s.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) 优秀率
FROM

course  c
LEFT JOIN
score  s

ON
s.cours_id=c.cid

GROUP BY
s.cours_id

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

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

自己写的:

score  course
SELECT

RAND() over()

FROM
(

SELECT
c.cname,s.score

FROM

score  s ,course  c

WHERE

s.cours_id=cours_id

ORDER BY

s.score desc)

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

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

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

SELECT

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

FROM
score   s

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阶段三:项目开发---大数据系统基础环境准备:任务1:准备系统运行的先决条件

任务描述 知识点&#xff1a; 大数据基础环境准备 重 点&#xff1a; SSH免密码连接 安装配置JDK 安装配置Scala 难 点&#xff1a; 无 内 容&#xff1a; 项目开发测试环境为分布式集群环境&#xff0c;在当前项目中使用多台基于CentOS 64bit 的虚拟机来模拟生产…

在Ubuntu中使用ROS搭建PX4 Gazebo 模拟飞行 四旋翼 固定翼

综合了网上很多教程以及踩了很多坑总结下来的教程 Ubuntu安装 此处不在详细说明&#xff0c;网上可随处搜到 ROS安装 感谢鱼香ROS大佬提供一键安装脚本 wget http://fishros.com/install -O fishros && sudo bash fishros 接下来按顺序按 1 1 2 3 1 再次运行 w…

关于 lvds 屏幕的一些知识

网上的截图&#xff1a; lvds的 通道。 lvds 的协议 关于 sync 模式与 de 模式&#xff1a; ------------------------------------------------------------------------------------------------------------------ 芯片的数据手册的看法。 这个手册 &#xff0c;就指明了…

鸿蒙开发设备管理:【@ohos.update (升级)】

升级 说明&#xff1a; 本模块首批接口从API version 6开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 升级范围&…

协程调度模块

什么是协程和协程调度&#xff1f; 基本概念 协程 协程是一种比线程更轻量级的并发编程结构&#xff0c;它允许在函数执行过程中暂停和恢复执行状态&#xff0c;从而实现非阻塞式编程。协程又被称为用户级线程&#xff0c;这是由于协程包括上下文切换在内的全部执行逻辑都是…

二分查找及其变种

一、概念 二分查找算法&#xff08;Binary Search Algorithm&#xff09;是一种在有序数组中查找特定元素的高效搜索方法。 其基本思想是将目标值与数组中间的元素进行比较&#xff0c;如果目标值等于中间元素&#xff0c;则查找成功&#xff1b;如果目标值小于中间元素&…

Apache SeaTunnel社区首位学生Committer诞生!

采访对象 | 陈炳烨 采访人&编辑 | Debra Chen Apache SeaTunnel社区第一位学生Committer就此诞生&#xff01;这位来自西安交通大学软件工程专业的同学从较为简单的文档修改工作&#xff0c;逐步深入到代码层面&#xff0c;到最后独立负责开发模块&#xff0c;为Apache S…

事务底层与高可用原理

1.事务底层与高可用原理 事务的基础知识 mysql的事务分为显式事务和隐式事务 默认的事务是隐式事务 显式事务由我们自己控制事务的开启&#xff0c;提交&#xff0c;回滚等操作 show variables like autocommit; 事务基本语法 事务开始 1、begin 2、START TRANSACTION&…

【代码随想录】【算法训练营】【第55天】 [42]接雨水 [84]柱状图中最大的矩形

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 55&#xff0c;又是一个周一&#xff0c;不能再坚持~ 题目详情 [42] 接雨水 题目描述 42 接雨水 解题思路 前提&#xff1a;雨水形成的情况是凹的, 需要前中后3个元素&#xff0c;计算该元…

【AI】DeepStream(14):图像分割deepstream-segmentation-test示例演示

【AI】AI学习目录汇总 1、简介 deepstream-segmentation-test示例演示了图像的语义分割。两个配置文件,分别加载U-Net和Res-UNet两种分割模型 unet_output_graph.uffunetres18_v4_pruned0.65_800_data.uffU-Net是一个在生物医学图像分割领域广泛应用的卷积神经网络(CNN),…

中国东方资产管理25届秋招北森测评笔试如何高分通过?真题考点分析看完这篇就够了

一、东方资管校招测评题型分析 中国东方资产管理股份有限公司&#xff08;中国东方资管&#xff09;的校园招聘测评题型主要包括以下几个部分&#xff1a; 1. **计分题&#xff0c;行测知识**&#xff1a;这部分题量大约在56-57题左右&#xff0c;分为不同的模块进行计时测试。…

【高阶数据结构】图的应用--最短路径算法

文章目录 一、最短路径二、单源最短路径--Dijkstra算法三、单源最短路径--Bellman-Ford算法四、多源最短路径--Floyd-Warshall算法 一、最短路径 最短路径问题&#xff1a;从在带权有向图G中的某一顶点出发&#xff0c;找出一条通往另一顶点的最短路径&#xff0c;最短也就是沿…

14个最佳创业企业WordPress主题

您网站的设计使您能够展示产品的独特卖点。通过正确的主题&#xff0c;您将能够解释为什么客户应该选择您的品牌而不是其他品牌。 在本文中&#xff0c;我们将向您介绍14个初创企业WordPress主题。我们将告诉您每个主题的独特之处以及哪些人应该考虑使用它。让我们开始吧&…

Pinia:Vue 2 和 Vue 3 中更好用的状态管理框架

前言 还在用Vuex? 在Vue应用程序的开发过程中&#xff0c;高效且易于维护的状态管理一直是开发者关注的核心问题之一。随着Vue 3的发布&#xff0c;状态管理领域迎来了一位新星——Pinia&#xff0c;它不仅为Vue 3量身打造&#xff0c;同时也向下兼容Vue 2&#xff0c;以其简…

Django学习第四天

启动项目命令 python manage.py runserver 分页功能封装到类中去 封装的类的代码 """ 自定义的分页组件,以后如果想要使用这个分页组件&#xff0c;你需要做&#xff1a; def pretty_list(request):# 靓号列表data_dict {}search_data request.GET.get(q, &…

谷粒商城-个人笔记(集群部署篇二)

前言 ​学习视频&#xff1a;​Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强​学习文档&#xff1a; 谷粒商城-个人笔记(基础篇一)谷粒商城-个人笔记(基础篇二)谷粒商城-个人笔记(基础篇三)谷粒商城-个人笔记(高级篇一)谷粒商城-个…

Excel为数据绘制拆线图,并将均值线叠加在图上,以及整个过程的区域录屏python脚本

Excel为数据绘制拆线图,并将均值线叠加在图上,以及整个过程的区域录屏python脚本 1.演示动画A.视频B.gif动画 2.跟踪鼠标区域的录屏脚本 Excel中有一组数据,希望画出曲线,并且能把均值线也绘制在图上,以下动画演示了整个过程,并且提供了区域录屏脚本,原理如下: 为节约空间,避免…

SpringBoot 启动流程一

SpringBoot启动流程一 我们首先创建一个新的springboot工程 我们不添加任何依赖 查看一下pom文件 我们创建一个文本文档 记录我们的工作流程 我们需要的是通过打断点实现 我们首先看一下启动响应类 package com.bigdata1421.start_up;import org.springframework.boot.Spr…

【Android面试八股文】Android性能优化面试题:怎样检测函数执行是否卡顿?

文章目录 卡顿一、可重现的卡顿二、不可重现的卡顿第一种方案: 基于 Looper 的监控方法第二种方案:基于 Choreographer 的监控方法第三种方案:字节码插桩方式第四种方案: 使用 JVMTI 监听函数进入与退出总结相关大厂的方案ArgusAPMBlockCanaryQQ空间卡慢组件Matrix微信广研参…

linux中与网络有关的命令

本文的命令总览 ifconfig命令 在 Linux 系统中&#xff0c;ifconfig 命令用于配置和显示网络接口的信息&#xff0c;包括 IP 地址、MAC 地址、网络状态等。同时我们也可以利用ifconfig 命令设置网络接口对应的ip地址&#xff0c;子网掩码等 当你使用 ifconfig 命令时&#xf…