这个SQL查询语句要怎么写
AB姓名科目姓名科目成绩a1a1合格a2b1未知b2c1不合格如上,A表和B表,现在要查询出A表中不是合格的人员...
A B
姓名 科目 姓名 科目 成绩
a 1 a 1 合格
a 2 b 1 未知
b 2 c 1 不合格
如上,A表和B表,现在要查询出A表中不是合格的人员 展开
姓名 科目 姓名 科目 成绩
a 1 a 1 合格
a 2 b 1 未知
b 2 c 1 不合格
如上,A表和B表,现在要查询出A表中不是合格的人员 展开
6个回答
展开全部
没有一个对的。
1.select A.姓名,A.科目 from A as A inner join B as B on A.姓名=B.姓名 where B.成绩<>‘合格’
错误,问题在于,如果A中存在姓名与科目,而条件中只有姓名,如果存在多科目就会出错。
2.select 姓名,科目
from A
where 姓名 in (select 姓名 from B where 成绩<>‘合格’);
错误,因为条件只有姓名,所以如果一个人在B中有一科成绩不合格就会把所有科目列出来。
3.select a.姓名,a.科目,b.成绩
from a,b
where a.姓名=b.姓名 and a.科目=b.科目 and b.成绩<>'合格'
错误,这个是1的升级版,修改了姓名、科目的对应问题。但忽略了可能存在A中的姓名、科目不存在B中的情况(如缺考情况下,B表中可能没有数据)。这一SQL不会显示,此时可能是人员缺考,所以人员需要列出。而且题意是要列出A表中不是合格的人员,更合适的理解是列出A表,并不需要列出成绩。
4.select A.姓名 from A,B where A.姓名=B.姓名 and A.科目=B.科目 and B.成绩<>'合格'
错误同上。而且少了科目。
----------------
我的答案:
select A.姓名, A.科目
from A
left join B on A.姓名=B.姓名 and A.科目 = B.科目
where B.成绩 = '不合格' or B.成绩 is null
如果,真的只要姓名,虽然我认为这样信息量太少,实际问题也不合理,则可以
select distinct A.姓名
from A
left join B on A.姓名=B.姓名 and A.科目 = B.科目
where B.成绩 = '不合格' or B.成绩 is null
1.select A.姓名,A.科目 from A as A inner join B as B on A.姓名=B.姓名 where B.成绩<>‘合格’
错误,问题在于,如果A中存在姓名与科目,而条件中只有姓名,如果存在多科目就会出错。
2.select 姓名,科目
from A
where 姓名 in (select 姓名 from B where 成绩<>‘合格’);
错误,因为条件只有姓名,所以如果一个人在B中有一科成绩不合格就会把所有科目列出来。
3.select a.姓名,a.科目,b.成绩
from a,b
where a.姓名=b.姓名 and a.科目=b.科目 and b.成绩<>'合格'
错误,这个是1的升级版,修改了姓名、科目的对应问题。但忽略了可能存在A中的姓名、科目不存在B中的情况(如缺考情况下,B表中可能没有数据)。这一SQL不会显示,此时可能是人员缺考,所以人员需要列出。而且题意是要列出A表中不是合格的人员,更合适的理解是列出A表,并不需要列出成绩。
4.select A.姓名 from A,B where A.姓名=B.姓名 and A.科目=B.科目 and B.成绩<>'合格'
错误同上。而且少了科目。
----------------
我的答案:
select A.姓名, A.科目
from A
left join B on A.姓名=B.姓名 and A.科目 = B.科目
where B.成绩 = '不合格' or B.成绩 is null
如果,真的只要姓名,虽然我认为这样信息量太少,实际问题也不合理,则可以
select distinct A.姓名
from A
left join B on A.姓名=B.姓名 and A.科目 = B.科目
where B.成绩 = '不合格' or B.成绩 is null
更多追问追答
追问
我想先查询出B中合格人员,然后用A表对比,只要不在B表合格中的人员都列出来。
用not in 的话好像只能指定一个条件, 用 not exists不知为何查询不出数据, 是我写错了,还是不能这样用?
select A.姓名,A.科目 from A where not exists (select 姓名,科目 from B where 成绩='合格')
追答
exists 只返回true/false. 并不象in一样可以返回一什结果集。
展开全部
select A.姓名 from A,B where A.姓名=B.姓名 and A.科目=B.科目 and B.成绩<>'合格'
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以用join,也可以用subquery
给个subquery的例子,看起来清楚点,不会产生attri的混淆
select 姓名,科目
from A
where 姓名 in (select 姓名 from B where 成绩<>‘合格’);
给个subquery的例子,看起来清楚点,不会产生attri的混淆
select 姓名,科目
from A
where 姓名 in (select 姓名 from B where 成绩<>‘合格’);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
select A.姓名,A.科目 from A as A inner join B as B on A.姓名=B.姓名 where B.成绩<>‘合格’
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
select a.姓名,a.科目,b.成绩
from a,b
where a.姓名=b.姓名 and a.科目=b.科目 and b.成绩<>'合格'
from a,b
where a.姓名=b.姓名 and a.科目=b.科目 and b.成绩<>'合格'
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
很多写法
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询