首页 > 试题广场 >

写出以下sql语句。

[问答题]
已知存在以下表
S 表保存着学生关系,有两列,其中SNO 为学号,SNAME 为姓名
C 表保存着课程关系,有三列,其中CNO 为课程号,CNAME 为课程名,CTEACHER 为老师
SC表保存着选课关系,有三列,其中SNO为学号,CNO为课程号,SCORE 为成绩
1. 找出没有选“小易”老师课程的所有学生姓名
2. 列出有三门(包括三门)以上课程分数>90的学生姓名及其平均成绩
第一问:
select SNAME from SC join S
    on SC.SNO = S.SNO
where CNO not in( select distinct CNO
    from C
    where CTEACHER = "小易" )

# 第二题:

select SNAME ,AVG(SCORE)
from SC join S ON SC.SNO = S.SNO
where SNO in (
    select distinct SNO 
    from SC 
    group by SNO
    having count(SCORE > 90) > 2 
    )

发表于 2018-08-11 11:51:59 回复(0)
更多回答
1.select SNAME from S where SNO not in (
       select SNO from SC where CNO in (
             select CNO from C where CTEACHER = "小易“));

2.select SNAME, avg(SCORE) as AverageScore from S natural join SC
         group by SNO
         having SNO in (
               select SNO from SC
                   where SCORE > 90
                       group by SNO
                       having count(*) >= 3)
             
发表于 2018-08-10 13:14:30 回复(2)
1.
with temp as
(select distinct sc.sno
from sc inner join c on sc.cno = c.cno
where c.cteacher = "小易")

select distinct sname
from s
where sno not in (select * from temp)

2.
with temp as
(select sno, avg(score) as average_score
from sc 
group by sno
having sum(case when score > 90 then 1 else 0 end) >= 3)

select s.sname, average_score
from temp t inner join s on t.sno = s.sno

1. 注意distinct的用法,因为一学生可以enroll多节课,单纯的用where会导致重复
编辑于 2020-11-12 08:48:36 回复(0)
SELECT S.SNAME 
FROM S
WHERE S.SNO NOT IN 
(SELECT SC.SNO FROM C,SC
 WHERE C.CNO=SC.CNO AND C.CTEACHER='小易')

SELECT S.SNAME,AVG(SC.SCORE)
FROM S,SC
WHERE S.SNO=SC.SNO
GROUP BY S.SNAME
HAVING COUNT(CASE WHEN SC.SCORE>90 THEN 1 ELSE 0 END)>=3
发表于 2020-04-27 12:20:21 回复(0)
第一问(亲测无误):SELECT DISTINCT SNAME FROM S WHERE SNAME NOT IN
 (SELECT SNAME FROM S,C,SC WHERE S.SNO=SC.SNO AND SC.CNO=C.CNO AND C.CTEACHER='小易');
编辑于 2020-04-05 11:37:03 回复(2)
1.
select s.sname
from sc inner join c
on sc.cno = c.cno
inner join s
on s.sno = sc.sno
where c.cteacher != "小易";
2.
select s.sname,,avg(sc.score) as avg
from (select sc.sno,count(sc.score) as cn
          from sc
          where sc.score > 90
          group by sc.sno) as a inner join s
on s.sno = a.sno
inner join sc
on sc.no = s.sno
where a.cn >= 3
group by s.sname;

发表于 2019-04-07 15:12:14 回复(0)
1.
select distinct A.SNAME
from
((select SNAME,SNO
from S) as A
join
(select SNO,CNO
from SC) as B
on A.SNO = B.SNO
join
s(elect CNO,CTEACHER
fromC
where CTEACHER != '小易' ) as C
on B.CNO = C.CNO)

2.
select B.SNAME,avg(A.SCORE)
from
((select SNO,SCORE form SC 
where SNO in
(select SNO
from SC 
group by SNO
having count(distinct if(SCORE >90,CNO,null)) >=3)) as A
join
(select distinct SNO,SNAME form S
where SNO in
(select SNO
from SC 
group by SNO
having count(distinct if(SCORE >90,CNO,null)) >=3)) as B
on A.SNO = B.SNO)
group by 1
发表于 2018-08-05 21:37:28 回复(0)
1.没有选“小易”老师课程的所有学生姓名所需要的程序语句如下:
SELECT S.SNAME FROM S,C,SC WHERE S.SNO=SC.SNO AND SC.CNO=C.CNO AND S.SNAME NOT IN
(SELECT S.SNAME FROM S,C,SC WHERE S.SNO=SC.SNO AND SC.CNO=C.CNO AND C.CTEACHER="小易");

2.有三门(包括三门)以上课程分数>90的学生姓名及其平均成绩程序语句如下:
SELECT S.SNAME, AVG(SC.SCORE) FROM S,C,SC WHERE S.SNO=SC.SNO AND SC.CNO=C.CNO GROUP BY S.NAME HAVING COUNT(SC.SCORE>90)>=3;
发表于 2018-08-10 23:45:42 回复(12)
sql
1.
select cname
from
(
select sno
 ,cname
from s
)a1 join 
(
select a.sno
from 
(
select sno
, cno
from sc
)a join 
(
select cno
from c
where cteacher='小易'
)b on a.cno =b.cno
)b1 on a1.sno=b1.sno

2.
已知存在以下表 
S 表保存着学生关系,有两列,其中SNO 为学号,SNAME 为姓名 
C 表保存着课程关系,有三列,其中CNO 为课程号,CNAME 为课程名,CTEACHER 为老师 
SC表保存着选课关系,有三列,其中SNO为学号,CNO为课程号,SCORE 为成绩 
1. 找出没有选“小易”老师课程的所有学生姓名
2. 列出有三门(包括三门)以上课程分数>90的学生姓名及其平均成绩

select sname,avg_score
from
(
select sno,sname
from s 
)a join
(
select sno,count(distinct cno) as cno_num,avg(score) as avg_score
from
(
select sno,cno, score
from sc
where score>90
)
group by sno
having count(distinct cno) >=3
)b on a.sno=b.sno







发表于 2019-08-01 20:53:30 回复(0)
1.
select
    SNAME
from
    (select
         S.SNAME,
         SC.CNO,
         C.CTEACHER
     from SC
     left join S on SC.SNO=S.SNO
     left join C on SC.CNO=C.CNO
     where C.CTEACHER<>'小易') temp;
2.
select
    SNAME
from
    (select
         SC.SNO
         S.SNAME,
         sum(case when SC.SCORE > 90 then 1 else 0 end) as gt90lines
     from SC
     left join S on SC.SNO=S.SNO
     group by SC.SNO) temp
where gt90lines >= 3;



发表于 2020-12-17 10:36:32 回复(0)
--选出选择小易的所有学生的学号
CREATE VIEW T1 AS(select   DISTINCT   SNO
    FROM S,C,SC
    WHERE S.SNO=SC.SNO
    AND SC.CNO=C.CNO
    AND C.CTEACHER="小易");

--不选其的学生
SELECT SNAME 
FROM S,T1
WHERE S.SNO NOT IN T1.SNO


--三门以上90以上的学生姓名和平均成绩
SELECT DISTINCT SNAME ,AVG(SCORE)
 FROM S,SC
WHERE S.SNO=SC.SNO
AND COUNT(SC.SCORE>90 OR NULL)  OVER(PARTION BY SC.SNO)>=3
GROUP BY SNO
编辑于 2022-03-26 19:08:53 回复(0)
select S.SNAME from S join 
(select SNO 
from SC 
join C
on C.CNO=SC.CNO
where C.CTEACHER=`小易`) a
on a.SNO=S.SNO;

select  c.SNAME  avg(SC.SCORE) from SC join
(
select b.SNAME,count(*)  from 
(select SNAME, SCORE from SC
left join S on S.SNO=SC.SNO
where SCORE>90)b
group by b.SNAME
having count(*)>2
) c
on c.SNO=SC.SNO 
group by c.SNAME;





发表于 2022-03-07 17:42:43 回复(0)
1.

发表于 2022-03-06 22:19:02 回复(0)
select SNAME
from S
and SNO not in
    (select distinct SNO
     from C,SC
     where SC.CNO=C.CNO
     and C.CTEACHER='小易');

select SNAME, AVG(SCORE)
from S,SC
where S.SNO=SC.SNO
group by SNO
having AVG(SCORE) > 90;
发表于 2021-10-09 16:02:55 回复(0)
1.
select disticnt S.SNAME
from C,SC,S
where C.CNO = SC.CNO
and S.SNO = SC.SNO
and C.CTEACHER != '小易'
group by S.SNAME
2.
select S.SNAME,
    average(SC.SCORE) as '平均成绩'
from S,SC
where S.SNO = SC.SNO
and S.SNAME in 
(
select S.SNAME,
    sum(case when score > 90 then 1 else 0 end) as times
from C,SC,S
where C.CNO = SC.CNO
and S.SNO = SC.SNO
group by S.SNAME
having times>=3
)
group by S.SNAME
发表于 2021-08-26 21:24:42 回复(0)
select 
s.sname
from s join c join sc
on s.sno = sc.sno and c.cno = sc.cno
where c.CTEACHER = '小易'
发表于 2021-08-25 10:02:56 回复(0)
1. 找出没有选“小易”老师课程的所有学生姓名
思路:连接s 和 sc,where子查询不在小易老师的课程号内
select
sno
,sname 
from s
left join sc 
on s.sno = sc.sno 
where cno not in (
				  select
				  cno 
				  from c
				  where cteacher = '小易')
2. 列出有三门(包括三门)以上课程分数>90的学生姓名及其平均成绩
思路:连接S和SC表,分组求出平均分、90分以上课程数,然后筛选出90分以上课程数>=3的学生
select
sname
,avg(score) 平均成绩
from s 
left join sc 
on s.sno = sc.sno 
group by 1
having sum(case when score>90 then 1 else 0 end)>=3



发表于 2021-08-23 22:37:16 回复(0)
1.
select distinct s.sname 
from sc
left join s
on s.sno = sc.sno 
left join c 
on sc.cno = c.cno 
where c.cteacher <> '小易‘ ;


发表于 2021-03-25 20:01:53 回复(0)
1. 
SELECT SNAME FROM S WHERE SNAME NOT IN 
(
 SELECT SNAME FROM S 
 INNER JOIN SC 
 ON S.SNO = SC.NO 
 INNER JOIN  C 
ON C.CNO = SC.CNO
WHERE C.CTEACHER = '小易'
)
2.
SELECT SNAME, AVG(SCORE) FROM SC
INNER JOIN S 
ON SC.SNO = S.SNO
WHERE SCORE > 90  
GROUP BY SNAME 
HAVING COUNT(CNO) >= 3 

发表于 2021-01-27 16:52:23 回复(0)
select S.SNAME
from S C SC
WHERE S.SNO=SC.SNO 
 AND      SC.CNO=C.CNO
 AND      C.CTEACHER not in(select CTEACHER 
                                                             
from S C SC
WHERE S.SNO=SC.SNO 
 AND      SC.CNO=C.CNO
 AND       c.cteacher = '小易')    
select S.SNAME avg(score) as mean
from s c sc
WHERE S.SNO=SC.SNO 
 AND      SC.CNO=C.CNO
 AND      (select count(*)
                 from S C SC
WHERE S.SNO=SC.SNO 
 AND      SC.CNO=C.CNO
and score >90) >3
group by S.SNAME

发表于 2020-09-23 15:52:42 回复(0)
1.
select s.sname from s,c,sc
on s.sno = sc.sno
and c.cno = sc.cno
and c.cteacher != '小易'

2.select s.sname, sc.avg(score) from s
left join sc on s.sno = sc.sno
groupby s.sname
having count(cno)>=3 and score>90
发表于 2020-09-01 12:59:58 回复(0)