用一條SQL語句 查詢出每門課都大於80分的學生姓名,表(MarkList)如下:


用一條SQL語句   查詢出每門課都大於80分的學生姓名,表(MarkList)如下:
  
Name Course Mark
張三 語文 81
張三 數學 75
李四 語文 76
李四 數學 90
王五 英語 100
王五 語文 81
…… …… ……

今天的面試題目,我是按下面寫的,在查詢中可以出來結果.但主考官說,這樣不好,有更好的辦法,他沒告訴我,特此來求答案,謝謝.

SELECT DISTINCT Name
FROM MarkList
WHERE (Name IN
          (SELECT name
         FROM marklist
         WHERE mark > 80))

27 个解决方案

#1


create table #test
(
Name varchar(10),
Course varchar(10),
Mark float
)

insert into #test
select '張三', '語文', 81 union
select '張三', '數學', 75 union
select '李四', '語文', 76 union
select '李四', '數學', 90 union 
select '王五', '英語', 100 union 
select '王五', '語文', 81

select distinct Name
from #test A
where not exists(select Course
 from #test
 where Mark < 80 and Name = A.Name)

將 #test 改成MarkList 就行了

#2


你那樣寫是把有一科成績高於80的學生選出來

#3


create table tb(
Name varchar(20),
Course varchar(20),
Mark int
)

drop table tb
insert tb select '張三','語文',81
union all select '張三','數學',75
union all select '李四','語文',76
union all select '李四','數學',90
union all select '王五','英語',100
union all select '王五','語文',81

select * from tb a where mark > 80 and 
(select count(*) from tb where name=a.name)=
(select count(*) from tb where name=a.name and mark > 80)

#4


方法太笨了,再看看

#5


select distinct name from tb a where not exists(select * from tb where a.name=name and mark<80)

#6


select distinct name from tb where 
name not in (
select name from tb where mark<=80
)

#7


select name from MarkList
where Course >=80
group by name 

#8


在此感謝各位回答,特別是Lyw110 ,這種辦法真簡潔,佩服.

#9


若考濾數據完整性,這語句還需改進.

比如,張三有"化學"這門科的成績,李四沒參加考試,那這里就存在 李四沒有化學科的成績記錄的情況.

所以要先 (select distinct 科目 from 表) x
每個人的記錄與 x 左連,沒有某科成績的用isnull替換為0 ,然后再用 not exists處理才是准確的
(當然,如果每個人都沒參加'化學'這門科的考試, 也就是說,每個人都逃了一門課的考試,這個實際中不太現實, 如果確實有這種情況, 那么 select distinct 科目 from 表 得到的結果不能表述所有的科目, 還需要建立科目表)

#10


select distinct name from tb a where not exists(select * from tb where a.name=name and mark<80)

#11


DECLARE @test table (
Name varchar(10),
Course varchar(10),
Mark float)
insert into @test
select  '張三 ',  '語文 ', 81 union
select  '張三 ',  '數學 ', 75 union
select  '李四 ',  '語文 ', 76 union
select  '李四 ',  '數學 ', 90 union 
select  '王五 ',  '英語 ', 100 union 
select  '王五 ',  '語文 ', 81 
SELECT * FROM @test
/*查詢出每門課都大於80分的學生姓名??*/
SELECT DISTINCT NAME FROM @test WHERE Mark>80

#12


要是不考濾逃考某課的問題,不用not exists的一種寫法:

DECLARE @test table ( 
Name varchar(10), 
Course varchar(10), 
Mark float) 
insert into @test 
select   '張三  ',   '語文  ', 81 union 
select   '張三  ',   '數學  ', 75 union 
select   '李四  ',   '語文  ', 76 union 
select   '李四  ',   '數學  ', 90 union  
select   '王五  ',   '英語  ', 100 union  
select   '王五  ',   '語文  ', 81  

SELECT NAME FROM @test GROUP BY name HAVING count(*)=count(case when mark>=80 then 1 else null end)
--或者
SELECT NAME FROM @test GROUP BY name HAVING count(*)=sum(case when mark>=80 then 1 else 0 end)

#13


select name,min(mark) from Marklist group by name having min(mark)>80

#14


再簡化一下
select name from Marklist group by name having min(mark)>80

#15


我覺得wzy_love_sly 的好
先找出至少一科的分數低於80的學生姓名,再排除

#16


樓主自己查詢的結果不正確

#17


服了,我昨天面試的時候,也遇到了這個題目,咱倆不會去的同一公司吧!
我當時是這么回答的:
select name from marklist mal
where mark>80
group by name
having count(*)=(select count(*) from marklist where name=mal.name)
不知道這樣寫好不好?

#18


仔細一看,lz的代碼是不正確的,這樣的查詢結果是:至少一門功課在80分以上的學生!

#19


f05982和Lyw110的方法都比我寫的強,學到了!

#20


select distinct name
from marklist a
where not exists(select * from marklist where name=a.name and mark<=80)

#21


select distinct 姓名 from 成績表 group by 姓名 having min(成績)>80 

#22


我看書上說”由Exists引出的子查詢,其目標列表達式通常為 *”,為什么樓上各位的都不是呢?什么原因啊。

#23


引用 1 樓 lyw110 的回復:
create table #test
(
Name varchar(10),
Course varchar(10),
Mark float
)

insert into #test
select '張三', '語文', 81 union
select '張三', '數學', 75 union
select '李四', '語文', 76 union
select '李四', '……



這個好像不完整,如果有人沒有選課,沒有成績,那他也會被選出來,這實際上是跟要求違背了吧?

#24


select distinct name from table  where  name not in (select distinct name from table where fenshu<=80)

#25


按姓名進行分組查詢 然后指定條件 分組中分數的最小值都大於80的
select Name from MarkList group by Name having min(Mark) > 80

#26


學習了

#27


select distinct name from A 
minus
select name from A
where fenshu<=80

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: