查詢了選修sql
① 資料庫sql語句中 查詢選修了全部課程的學生的學號和姓名 理解
樓主別著急!
為好理解我們先從這條SQL語句所要實現的功能入手。
功能:查出選修了全部課程的學信息。那麼SQL在查詢數據的時候的遍歷每一個學生信息。判斷該學生是否滿足條件。
1
如果存在這么一條Course記錄A(暫命名為A),
則不選擇該學生。否則該學生就被查詢出來
2
那麼記錄A,是怎麼查出來的呢?A查出的條件是:不存在SC記錄B,只要不存在B,就可查出A
3
那麼B記錄是什麼?B記錄是選課信息表,根據學號和課程號可查出記錄B
如果B為空(該學生有沒有選的課程)也就是不存在,則A就有一條記錄,根據規則2可知:因為有A,所以該學生信息將不被輸出。
如果在SC中每一個課程編號和該學生編號為條件都能夠查出一條記錄B(也就是該學生選修了全部課程),所以A記錄不存在,則輸出該學生的信息。
也就是在選課表中,如果學生選了全部課程(也就是滿足SELECT
*
FROM
SC
WHERE
Sno=
Student.Sno
AND
Cno=
Course.Cno)始終存在,當然,課程編號是任意的)。那麼就輸出該學生的信息。你不要為理解這條SQL而忘記了它本身是要做什麼.
帶著SQL的目的(要實現的功能)去理解就好了。
② 寫一條SQL語句,查詢選修了所有課程的學號。
select 學號 from 學生 A where
select X.學號
from
(select 學號,count(*) as 選修科目數
from (select distinct 學號,課程號 from 學生選修課程 A inner join 課程 B on B.課程號=A.課程號) A
group by 學號) X
where X.選修科目數 = (select count(*) from 課程)
③ 怎樣用sql語句查詢選修了3門及以上課程的學生學號,姓名,選修的課程數
SELECT學號FROM選課表GROUPBY學號HAVINGCOUNT(*)>=3
④ 用SQL語句查詢選修了課程的學員人數
SC表裡應該有個XKLB欄位,看這門課是否選修還是必修,因為有的課程對A來說是必修的,而對B來說就是選修,
SELECT COUNT(DISTINCT SNO) FROM SC WHERE XKLB='選修';
⑤ SQL資料庫中查詢選修了所有課程的學生的學號和姓名及選修門數
所有離開了數據結構(表結構)的SQL語句都是白搭!
先假設數據結構為
學生表(學號 主鍵或設有唯一索引,姓名,性別)
課程表(課程號 主鍵或設有唯一索引,課程名)
選課表(課程號,學號)-- 欄位「課程號」和「學號"設有雙欄位唯一索引
查詢出選修了所有課程的學生的學號、姓名和選修門數:
select a.學號,b.姓名,a.cnt as 選修門數 from
(select 學號,count(1) as as cnt from 選課表 group by 學號
having count(1)=(select count(1) from 課程表)) a,
學生表 b where a.學號=b.學號;
⑥ SQL查詢選修了全部課程的學生姓名
分析原因如下:
第一問:兩個NOT EXISTS表示雙重否定:沒有一個選了課的學生沒有選course表裡的課程
select sname from student where not exists /*沒有一個學生滿足以下條件*/
(select * from course where not exists /*什麼條件呢?沒有選過Course表裡的課*/
(select * from sc where sno =student.sno /*這里兩個=分別指對應的關系,表示選
過課並且是Course里and cno=course.cno) 的課,只不過用not exists否定掉了*/
第二問:其實和NOT IN 是一個意思 exists只返回true 或false 這里not exists里的內容 其實就 是指學生選過的課程,再用NOT EXISTS否定了,就變成了沒有選
⑦ 用SQL語句查詢選修了c課程的學生姓名和只選修了c課程的學生姓名
假設數據結構為
students(sid,sname)
sc(sid,cname)
1)選修了C課程的學生姓名
select
distinct
a.sname
from
students
a,sc
b
where
a.sid=b.sid
and
b.cname='C';
2)只選修了C課程的學生姓名
select
s.sname
from
students
s,
(select
a.sid
from
(select
distinct
sid
from
sc
where
cname='C')
a
left
join
(select
distinct
sid
from
sc
where
cname<>'C')
b
on
a.sid=b.sid
where
b.sid
is
null)
t
where
s.sid=t.sid;
前者只要選修了C課程的學生就會被選出,不管該學生是否選修了其他課程。
後者某學生如果選修了C課程,還不一定能被選出,因為若他(她)還選修了其他課程那麼還會被剔除掉。
"選修了C課程的學生"是"只選修C課程的學生"的父集,前者包含後者,或者說後者是前者的子集。
⑧ 用SQL查詢同時選修了1號課和2號課的學生學號
工具/材料:以Management Studio為例。
1、首先在桌面上,點擊「Management Studio」圖標。
⑨ SQL查詢選修了兩門以上(包括兩門)課程的學生信息
1:select sno(學生的學號) from sc(學生選課表)
group by sno having count(*)>1
2:select s.sno,s.name from student s
where s.sno in(select sno from score sc
group by sc.cno having sum(sc.sno)>2 )
3:應為三張表;學生表A 課程表B 選修表C(cid aid bid)--沒有選修任何課程的學生的學號