現在我要查詢至少選修了S1選修的全部課程的學生的學號


我有如下的數據表,表名為S,各字段含意分別人,學號,課程號,和分數。
現在我要查詢至少選修了S1選修的全部課程的學生的學號,
請問SQL語句怎么寫?
SNO      CNO      SCORE       
S1 C1 90
S1 C2 85
S2 C5 57
S2 C6 80
S2 C7 80
S3 C1 80
S3 C2 89
S3 C4 23
S4 C1 34
S4 C2 79
S4 C3 34
S5 C2 89

35 个解决方案

#1


沒看懂

#2


至少選修了S1選修的全部課程的學生的學號

--

解釋一下

#3


也就是說S1選修的課程,
目的學生都選修了,
比如說S1選修了C!,C2兩門課,
那么S2選了C!,C2,C3是滿足條件的查詢結果,
不知我有沒有解釋清楚

#4



declare @table table([SNO] varchar(2),[CNO] varchar(2),[SCORE] int)
insert @table
select 'S1','C1',90 union all
select 'S1','C2',85 union all
select 'S2','C5',57 union all
select 'S2','C6',80 union all
select 'S2','C7',80 union all
select 'S3','C1',80 union all
select 'S3','C2',89 union all
select 'S3','C4',23 union all
select 'S4','C1',34 union all
select 'S4','C2',79 union all
select 'S4','C3',34 union all
select 'S5','C2',89

select SNO
from
(
select SNO,count(1) as times from @table
where CNO in (select CNO from @table where SNO = 'S1')
group by SNO
) t
where times = (select count(1) from @table where SNO = 'S1')
--結果
--------------
S1
S3
S4

#5



create table S(SNO varchar(4),CNO varchar(4), SCORE int)
insert into S select 'S1','C1','90' 
union all select 'S1','C2','85'
union all select 'S2','C5','57' 
union all select 'S2','C6','80' 
union all select 'S2','C7','80' 
union all select 'S3','C1','80' 
union all select 'S3','C2','89' 
union all select 'S3','C4','23' 
union all select 'S4','C1','34' 
union all select 'S4','C2','79' 
union all select 'S4','C3','34' 
union all select 'S5','C2','89'
;with tb as
(
select num=count(1),a.SNO 
from S a,S b 
where a.CNO=b.CNO and b.SNO='s1' 
group by a.SNO)
select SNO from tb where num>=(select num from tb where SNO='s1')

--SNO
------
--S1
--S3
--S4
--
--(3 行受影響)

#6


還是沒看懂。還以為等一會會有人答復呢。。在等等。。剛才占沙發好了

#7


這種面試題,太2了!

#8


引用 4 樓 nianran520 的回復:
SQL codedeclare@tabletable([SNO]varchar(2),[CNO]varchar(2),[SCORE]int)insert@tableselect'S1','C1',90unionallselect'S1','C2',85unionallselect'S2','C5',57unionallselect'S2','C6',80unionallselect'S2','C7?-


我這里也有一段代碼能實在同樣的工能,但不知如何理解,代碼如下:
select distinct sno
from sc scx
where not exists
(select *from sc scy
  where scy.sno='s1' and
  not exists
  (select * from sc scz
   where scz.sno=scx.sno
   and scz.cno=scy.cno));

#9


引用 7 樓 bj_kevin51 的回復:
這種面試題,太2了!

沒有說這是面試題啊!
這是本人在做練習時遇到的一個題,沒有看懂書上給的答案,
所以到此求助

#10



create table S(SNO varchar(4),CNO varchar(4), SCORE int)
insert into S select 'S1','C1','90' 
union all select 'S1','C2','85'
union all select 'S2','C5','57' 
union all select 'S2','C6','80' 
union all select 'S2','C7','80' 
union all select 'S3','C1','80' 
union all select 'S3','C2','89' 
union all select 'S3','C4','23' 
union all select 'S4','C1','34' 
union all select 'S4','C2','79' 
union all select 'S4','C3','34' 
union all select 'S5','C2','89'


SELECT SNO FROM
(
SELECT B.SNO,B.CNO FROM S A JOIN S B ON A.CNO=B.CNO AND A.SNO='S1'
)TEMP GROUP BY SNO
HAVING COUNT(1)=(SELECT COUNT(1) FROM S WHERE SNO='S1')

SNO
--------------------
S1
S3
S4

(3 行受影響)

#11




SELECT 'S1' SNO,'C1' CNO,'90' SCORE INTO TB UNION ALL 
SELECT 'S1','C2','85'UNION ALL 
SELECT 'S2','C5','57'UNION ALL 
SELECT 'S2','C6','80'UNION ALL 
SELECT 'S2','C7','80'UNION ALL 
SELECT 'S3','C1','80'UNION ALL 
SELECT 'S3','C2','89'UNION ALL 
SELECT 'S3','C4','23'UNION ALL 
SELECT 'S4','C1','34'UNION ALL 
SELECT 'S4','C2','79'UNION ALL 
SELECT 'S4','C3','34'UNION ALL 
SELECT 'S5','C2','89' 

SELECT DISTINCT SNO FROM TB  A WHERE NOT  EXISTS
(SELECT 1 FROM TB B WHERE SNO='S1' AND NOT EXISTS 
(SELECT * FROM TB C WHERE C.SNO=A.SNO AND C.CNO=B.CNO))
---------
S1
S3
S4 

#12


引用 11 樓 yangdingyu8686 的回復:
SQL codeSELECT'S1' SNO,'C1' CNO,'90' SCOREINTO TBUNIONALLSELECT'S1','C2','85'UNIONALLSELECT'S2','C5','57'UNIONALLSELECT'S2','C6','80'UNIONALLSELECT'S2','C7','80'UNIONALLSELECT'S3','C1','80'UNIONALLSEL?-


這句話如何理解????

#13


---------------------------------------------
--> Author : js_szy
--> Target : 各位大大,小卒就是想要一朵花
--> Date   : 2009-12-01 13:09:42
--> Version: SQL Server 2005
---------------------------------------------
    
--> 測試數據: @tb
declare @tb table (SNO varchar(2),CNO varchar(2),SCORE int)
insert into @tb
select 'S1','C1',90 union all
select 'S1','C2',85 union all
select 'S2','C5',57 union all
select 'S2','C6',80 union all
select 'S2','C7',80 union all
select 'S3','C1',80 union all
select 'S3','C2',89 union all
select 'S3','C4',23 union all
select 'S4','C1',34 union all
select 'S4','C2',79 union all
select 'S4','C3',34 union all
select 'S5','C2',89

select sno from @tb where cno in(
select cno from @tb  where sno='s1'
)
group by sno having(count(*)=(select count(cno) from @tb  where sno='s1'))


sno
----
S1
S3
S4

(3 行受影響)

#14


SELECT DISTINCT SNO FROM TB  A WHERE NOT  EXISTS
(SELECT 1 FROM TB B WHERE SNO='S1' AND NOT EXISTS 
(SELECT * FROM TB C WHERE C.SNO=A.SNO AND C.CNO=B.CNO))
---------
S1
S3
S4 
針對這查詢語句,是雙重否定表肯定??
第一個not exists表示不在什么集合里面??
第二個not exists又是用來做什么的???
能解釋一下嗎??

#15


把題目在說一遍LZ,
LZ看清題目先去搜索下。

#16


引用 10 樓 lidanzi 的回復:
SQL codecreatetable S(SNOvarchar(4),CNOvarchar(4), SCOREint)insertinto Sselect'S1','C1','90'unionallselect'S1','C2','85'unionallselect'S2','C5','57'unionallselect'S2','C6','80'unionallselect'S2','C7',?-

UP

#17


兩種方法 具體可以看小麥的BLOG

#18


.子查詢
這里不知道寫什么重點,我覺得子查詢分2種吧。一種是獨立的子查詢,和外部查詢無關,它只為外部查詢執行一次足矣.還有一種是相關的子查詢,
它是外部查詢沒執行一行它就跑一次,是動態的.
我這里舉個例子:
--學生表
create table #s(sno int,sname varchar(10))
--選課表
create table #sc(sno int,cno int,score int)
--課程表
create table #c(cno int,cname varchar(10))
--插入數據
insert #s select 
1,'a' union all select
2,'b' union all select 
3,'c'
insert #c select 
1,'English' union all select 
2,'Chinese' UNION ALL SELECT
3,'Computer' 
insert #sc select
1,1,90 union all select
1,2,89 union all select 
1,3,87 union all select 
2,2,99 union all select 
3,1,76 union all select 
3,3,65 
---查詢出選修了全部課程的學生姓名-------

--------無關聯子查詢----------
select sname
from #s join #sc on #s.sno=#sc.sno
group by sname
having COUNT(cno)=(select COUNT(*) from #c)--這里就是無關聯的子查詢

-------相關子查詢------------
select sname
from #s s
where not exists(select * from #c  c where not exists 
(select *from #sc where sno=s.sno and cno=c.cno)
)
------結果-----------
/*
sname
----------
a
*/
上面通過學生選課的經典例子說明了用不同的子查詢解決問題的一個用法。

#19


迷糊想了半天沒頭緒。

#20



雙重否定的語句

-- =============================================
-- Author:      T.O.P
-- Create date: 2009/12/01
-- Version:     SQL SERVER 2005
-- =============================================
declare @tb table([SNO] varchar(2),[CNO] varchar(2),[SCORE] int)
insert @tb
select 'S1','C1',90 union all
select 'S1','C2',85 union all
select 'S2','C5',57 union all
select 'S2','C6',80 union all
select 'S2','C7',80 union all
select 'S3','C1',80 union all
select 'S3','C2',89 union all
select 'S3','C4',23 union all
select 'S4','C1',34 union all
select 'S4','C2',79 union all
select 'S4','C3',34 union all
select 'S5','C2',89

select distinct a.sno 
from @tb A
where not exists(
select 1 from @tb b where sno='S1' and 
not exists(select 1 from @tb c where a.sno = c.sno and b.cno=c.cno)
)


--測試結果:
/*
sno
----
S1
S3
S4

(3 row(s) affected)

*/

#21


引用 17 樓 fredrickhu 的回復:
兩種方法 具體可以看小麥的BLOG

我是新來的,
不知小麥是???
他的blog地址是????

#22


頂 學習。。。

#23


create table S(SNO varchar(4),CNO varchar(4), SCORE int)
insert into S select 'S1','C1','90' union all
select 'S1','C1',90 union all
select 'S1','C2',85 union all
select 'S2','C5',57 union all
select 'S2','C6',80 union all
select 'S2','C7',80 union all
select 'S3','C1',80 union all
select 'S3','C2',89 union all
select 'S3','C4',23 union all
select 'S4','C1',34 union all
select 'S4','C2',79 union all
select 'S4','C3',34 union all
select 'S5','C2',89

--查詢語句
select distinct sno from s where 
cno in(select distinct cno from s where sno='S1')


結果
S1
S3
S4
S5

#24


引用 23 樓 yihunshaol 的回復:
SQL codecreatetable S(SNOvarchar(4),CNOvarchar(4), SCOREint)insertinto Sselect'S1','C1','90'unionallselect'S1','C1',90unionallselect'S1','C2',85unionallselect'S2','C5',57unionallselect'S2','C6',80unionallselect'S2','C7',80unionallselect'S3','C1',80unionallselect'S3','C2',89unionallselect'S3','C4',23unionallselect'S4','C1',34unionallselect'S4','C2',79unionallselect'S4','C3',34unionallselect'S5','C2',89--查詢語句selectdistinct snofrom swhere 
cnoin(selectdistinct cnofrom swhere sno='S1')

結果
S1
S3
S4
S5

這個查詢結果顯然是錯的啊

#25



declare @table table([SNO] varchar(2),[CNO] varchar(2),[SCORE] int)
insert @table
select 'S1','C1',90 union all
select 'S1','C2',85 union all
select 'S2','C5',57 union all
select 'S2','C6',80 union all
select 'S2','C7',80 union all
select 'S3','C1',80 union all
select 'S3','C2',89 union all
select 'S3','C4',23 union all
select 'S4','C1',34 union all
select 'S4','C2',79 union all
select 'S4','C3',34 union all
select 'S5','C2',89


select a.SNO
from @table a,@table b
where b.SNO='S1'
And a.SNO!=b.SNO
And a.CNO=b.CNO
group by a.SNO
having COUNT(*)>1

#26




SNO
----
S3
S4

(2 行受影響)

#27


S1應該不算吧。 

#28


create table tb([SNO] varchar(2),[CNO] varchar(2),[SCORE] int)
insert tb
select 'S1','C1',90 union all
select 'S1','C2',85 union all
select 'S2','C5',57 union all
select 'S2','C6',80 union all
select 'S2','C7',80 union all
select 'S3','C1',80 union all
select 'S3','C2',89 union all
select 'S3','C4',23 union all
select 'S4','C1',34 union all
select 'S4','C2',79 union all
select 'S4','C3',34 union all
select 'S5','C2',89
go

select sno from tb where sno <> 'S1' and cno in
(select cno from tb where sno = 'S1')
group by sno having count(1) >= (select count(1) from tb where sno = 'S1')

drop table tb

/*
sno  
---- 
S3
S4

(所影響的行數為 2 行)
*/

#29


我錯了。 

#30


條件選擇語句。

#31


該回復於2009-12-01 23:34:13被版主刪除

#32



-- =============================================
-- Author:      T.O.P
-- Create date: 2009/12/01
-- Version:     SQL SERVER 2005
-- =============================================
declare @tb table([SNO] varchar(2),[CNO] varchar(2),[SCORE] int)
insert @tb
select 'S1','C1',90 union all
select 'S1','C2',85 union all
select 'S2','C5',57 union all
select 'S2','C6',80 union all
select 'S2','C7',80 union all
select 'S3','C1',80 union all
select 'S3','C2',89 union all
select 'S3','C4',23 union all
select 'S4','C1',34 union all
select 'S4','C2',79 union all
select 'S4','C3',34 union all
select 'S5','C2',89

select distinct a.sno 
from @tb A
where sno<>'S1' and not exists(
                    select 1 from @tb b where sno='S1' and 
                        not exists(select 1 from @tb c where a.sno = c.sno and b.cno=c.cno)
                )


--測試結果:
/*
sno  
---- 
S3
S4

(所影響的行數為 2 行)

*/

#33


 select S# from SC where C# in (select C# from SC where S#='s1') 
    group by S# having count(*)>=(select count(*) from SC where S#='s1'); 

#34


8樓,14樓正解啊,怎么理解呢?書上就是這樣的

#35


Select sname  from  S    where  not exists
      (select cno  from  SC  where  sno='s1'  and  cno  not in                       
(select cno from  SC  where S.sno=sno))

注意!

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



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