sQL語句求解釋 答案中join不懂?dāng)?shù)據(jù)庫中有如下三個(gè)表:學(xué)生表(學(xué)號id,姓名name,性別sex,系部depart,年齡age)8個(gè)學(xué)生記錄選課表(學(xué)號id,課程號cid,成績grade) 12門課程課程表(課程號cid,課程名cname,學(xué)分Ccredit) 6門課程答案:select 學(xué)生表.姓名,A.學(xué)號from 選課表as A join 選課表as B on A.學(xué)號=B.學(xué)號join 學(xué)生表on 學(xué)生表.學(xué)號=A.學(xué)號
1 回答

慕蓋茨4494581
TA貢獻(xiàn)1850條經(jīng)驗(yàn) 獲得超11個(gè)贊
join兩個(gè)選課表,如果學(xué)生選了2個(gè)及以上的課程,得到的數(shù)據(jù)是翻n倍的,答案不對,至少不完整。
正常思路:
1.得到所有包含C01、C02課程的選課:
select A.學(xué)號,B.課程名 from 選課表 as A join 課程表 as B on A.課程號=B.課程號 where B.課程名 in ('C01','C02')order by A.學(xué)號
2.得到同時(shí)包含C01、C02課程名的學(xué)號:
select A.學(xué)號 from 選課表 as A join 課程表 as B on A.課程號=B.課程號 where B.課程名 in ('C01','C02') group by A.學(xué)號 having count(A.學(xué)號>=2
3.關(guān)聯(lián)學(xué)生表,得到姓名和學(xué)號:
select C.姓名,C.學(xué)號 from 學(xué)生表 as C where C.學(xué)號 in ( select A.學(xué)號 from 選課表 as A join 課程表 as B on A.課程號=B.課程號where B.課程名 in ('C01','C02') group by A.學(xué)號 having count(A.學(xué)號>=2)
測試SQL:
-- 學(xué)生表declare @student table(id int identity(1,1),name nvarchar(20),sex bit default(0),depart nvarchar(20) default '',age int default 18);-- 選課表declare @course table(studentid int,classid int,grade int default 100);-- 課程表declare @class table(cid int identity(1,1),cname nvarchar(20),ccredit int default 100);-- 8個(gè)學(xué)生記錄insert into @student(name) values('a'),('b'),('c'),('d'),('e'),('f'),('g'),('h');-- 6門課程insert into @class(cname) values('C01'),('C02'),('C03'),('C04'),('C05'),('C06');-- 12門課程insert into @course(studentid,classid) values(1,1),(1,2),(1,3),(2,1),(2,2),(3,1),(4,2),(5,3),(6,1),(7,1),(8,2),(8,3)--select * from @student--select * from @course--select * from @classselect c.id,c.name from @student as c where c.id in ( select a.studentid from @course as a inner join @class as b on a.classid=b.cid where b.cname in ('C01','C02') group by a.studentid having count(a.studentid)>=2);
添加回答
舉報(bào)
0/150
提交
取消