sql语句写法问题,一共有三张表,麻烦加上详细的解释

panxiongmao 160 信誉分
2024-06-19T03:22:38.59+00:00

有 3 个表 S(学生表),C(课程表),SC(学生选课表)

S(SNO,SNAME)代表(学号,姓名)

C(CNO,CNAME,CTEACHER)代表(课号,课名,教师)

SC(SNO,CNO,SCGRADE)代表(学号,课号,成绩)

问题:

1,找出没选过“黎明”老师的所有学生姓名。

2,列出 2 门以上(含2 门)不及格学生姓名及平均成绩。

3,即学过 1 号课程又学过 2 号课所有学生的姓名。

1.首先第一题我能在网上找到答案:

首先在C表内找出教师为‘黎明’的CNO

select cno from c where cteacher='黎明'

然后再SC表内找出选择了‘黎明’老师学生的SNO

select sno from sc where cno=( select cno from c where cteacher='黎明')

最后在S表中选出没有选择‘黎明’老师的SNAME:

select sno not in (select sno from sc where cno=( select cno from c where cteacher='黎明'))

这个问题我能够看着答案去理解思路,但是剩下来的 两题我只找到了答案,不是很理解思路


  1. select`` s.sname,``avg``(ssc.SCGRADE)
  2. from`` ssc ``join`` s
  3. where`` ssc.sno``=`` (``select`` sno ``from`` ssc ``where`` SCGRADE ``<60`` ``HAVING`` ``count``(sno)``>=2``)

select s.sname from

s join (select sno,COUNT(*)t from ssc where cno in(1,2) GROUP BY SNO HAVING t=2) ss

where s.sno=ss.sno


第三题 我自己也写了一下:

select sname from s where sno is in (select sno from sc where cno=1 and cno 2)

麻烦帮我看一下 这个思路错在了还哪里。

=====================================================

最后还想问一个比较宽泛的问题:

拿到表格应该做什么去理清思路,如何加快自己对于语句的反应和编写能力

非常感谢

SQL Server
SQL Server
Microsoft 关系数据库管理和分析系统的一个系列,用于实现电子商务、业务线和数据仓库解决方案。
172 个问题
Transact-SQL
Transact-SQL
ANSI SQL 语言的 Microsoft 扩展,包括过程编程、局部变量和各种支持函数。
22 个问题
0 个注释 无注释
{count} 票

接受的答案
  1. LiHongMSFT-4306 28,806 信誉分
    2024-06-19T06:21:45.73+00:00

    你这个第一个答案感觉不太对哦,下面这个语句如果黎明老师的课程不止一个的话就会报错的。

    select sno from sc where cno=( select cno from c where cteacher='黎明')

    所以建议你还是用jion来写:

    SELECT 学号,姓名
    FROM S JOIN SC ON S.学号=SC.学号
    JOIN C ON SC.课号=C.课号
    WHERE C.教师 <> '黎明'
    

    第二个语句逻辑很简单啊,就是先用这个子查询(``select`` sno ``from`` ssc ``where`` SCGRADE ``<60`` ``HAVING`` ``count``(sno)``>=2``)查询出两门不及格的学生的学号,再求这些学生的平均成绩。

    第三个你的思路不太对,select sno from sc where cno=1 and cno 2 这个语句是用来查询学过 1 号课程和学过 2 号课学生的姓名,查不到既学1号也学2号的学生。也就是说你要求1号课程和2号课程的学生的交集。

    参考以下文档:

    SET 运算符 - EXCEPT 和 INTERSECT (Transact-SQL)

    SQLSERVER数据集合的交、并、差集运算(intersect,union,except)


    如果答案是正确的解决方案,请点击“接受答案”并投赞成票。如果您对此答案有其他疑问,请点击“评论”。

    1 个人认为此答案很有帮助。
    0 个注释 无注释

1 个其他答案

排序依据: 非常有帮助
  1. panxiongmao 160 信誉分
    2024-06-19T07:06:55.4066667+00:00

    create table s(

    	sno int(10) primary key,-- 学号
    
    	sname varchar(14)-- 姓名
    
    	);
    
    	
    

    create table c(

    	cno int(10) primary key,-- 课号
    
    	cname varchar(14),-- 课名
    
    	cteacher varchar(14)-- 成绩
    
    	);
    
    	
    

    create table sc(

    	sno int(10),-- 外键,学号
    
    	cno int(10),-- 外键,课号
    
    	scgrade int(10),-- 成绩
    
    	primary key(sno,cno),-- 联合主键
    
    	CONSTRAINT sc_s_fk FOREIGN KEY(sno) REFERENCES s(sno),-- 外键约束
    
    	CONSTRAINT sc_c_fk FOREIGN KEY(cno) REFERENCES c(cno)-- 外键约束
    
    	);
    
    	
    

    insert into s(sno,sname) values(1,'a');

    insert into s(sno,sname) values(2,'b');

    insert into s(sno,sname) values(3,'c');

    insert into s(sno,sname) values(4,'d');

    insert into c(cno,cname,cteacher) values(1,'java','王老师');

    insert into c(cno,cname,cteacher) values(2,'C++','张老师');

    insert into c(cno,cname,cteacher) values(3,'C#','李老师');

    insert into c(cno,cname,cteacher) values(4,'mysql','周老师');

    insert into c(cno,cname,cteacher) values(5,'oracle','黎明');

    insert into sc(sno,cno,scgrade) values(1,1,50);

    insert into sc(sno,cno,scgrade) values(1,2,50);

    insert into sc(sno,cno,scgrade) values(1,3,50);

    insert into sc(sno,cno,scgrade) values(2,2,80);

    insert into sc(sno,cno,scgrade) values(2,3,70);

    insert into sc(sno,cno,scgrade) values(2,4,59);

    insert into sc(sno,cno,scgrade) values(3,1,60);

    insert into sc(sno,cno,scgrade) values(3,2,61);

    insert into sc(sno,cno,scgrade) values(3,3,99);

    insert into sc(sno,cno,scgrade) values(3,4,100);

    insert into sc(sno,cno,scgrade) values(3,5,52);

    insert into sc(sno,cno,scgrade) values(4,3,82);

    insert into sc(sno,cno,scgrade) values(4,4,99);

    insert into sc(sno,cno,scgrade) values(4,5,40);

    select * from s;

    select * from c;

    select * from sc;


你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。