SQL查詢全部學生都選修的課程的課程號和課程名問題

2021-04-14 11:16:42 字數 5482 閱讀 4010

1樓:匿名使用者

樓上回答的 很不錯了 可以這樣做的。

這個問題其實真的很簡單的。。。

用sql語句列出全部學員都選修的課程的課程名和課程號

資料庫sql語句中 查詢選修了全部課程的學生的學號和姓名 理解

2樓:匿名使用者

這思路是用了個雙重否定來求解的。因為sql中沒有全稱量詞,於是要把題目轉換成等價的存在量詞表達形式。即根據(∀x)p≡¬∃(¬p)來轉化為雙重否定的表達。

同時由於「學生x選修課程y 」

之間是不定的,需要使用兩個exist。

於是「選修了全部課程的學生」等價於「不存在(有他沒選的課的)學生」

使用了兩次not exists來實現雙重否定。

先查詢在課程裡查詢「沒有學生選的課程」,第一次否定,

然後再在學生裡查詢「沒有屬於上面情況的學生」的名字,第二次否定;

結合起來,就是 「沒有(沒選的課程)的學生」了。

好了,從裡到外寫出來,就是

select sname from student where not exists(

select * from course where not exists(

select * from sc where sno=student.sno and cno=course.cno

))這個只不過是逆向思維來解決問題的方法。舉一反三,比如要查「被全部學生都選的課程名」

則是求「不存在有學生沒選它的課程」

select cname from course where not exists(

select * from student where not exists(

select * from sc where sno=student.sno and cno=course.cno

))再如,查「所有人都沒選修的課程」,這個雖然是單次否定了,但仍需要兩個存在量詞表述。

等價於查詢「不存在有學生選了它的課程」。

select cname from course where not exists (

select * from student where exists (

select * from sc where cno=course.cno and sno=student.sno))

3樓:風嘯無名

沒有資料庫難以具體說明,總的來說,就是一個多表查詢包括學生基本資訊表、課程資訊表、成績表等,學號為主鍵,查詢姓名和課程、分數等資訊,總分用sum算。

1 。 exists 子查詢找到的提交

not exists 子查詢中 找不到的提交說明:不要去翻譯為存在和不存在,把腦袋搞暈。

2 。 建立程式迴圈的概念,這是一個動態的查詢過程。如 for迴圈 。

3 。 exists執行的流程exists首先執行外層查詢,再執行記憶體查詢,與in相反。 流程為首先取出外層中的第一元組, 再執行內層查詢,將外層表的第一元組代入,若內層查詢為真,即有結果時。

返回外層表中的第一元 組,接著取出第二元組,執行相同的演算法。一直到掃描完外層整表 。

4樓:月光雪松

樓主彆著急!

為好理解我們先從這條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的目的(要實現的功能)去理解就好了。

5樓:雨夜的緣分

1,select * from sc where sno= student.sno and cno= course.cno

在sc表中查詢符合sno= student.sno and cno= course.cno這兩個條件的所有資料,

2,select * from course where not exists (select * from sc where sno= student.sno and cno= course.cno);這句的意思是在course表中查詢不滿足1,中的所有資料

3,select sname from student where not exists (select * from course where not exists (select * from sc where sno= student.sno and cno= course.cno));

這整句的意思就是查詢student表中所有不滿足2,資料,就是選修了全部課程的學生了

只所以會有這麼多查詢,可能sno= student.sno and cno= course.cno這兩個條件是是sc表查詢的條件分散在另外兩個表中,引用了雙重否定,也就是肯定的意思,達到可以讓student.

sno ,course.cno,在sc表中作為條件的目的

夠詳細吧!!!!

sql查詢全部學生都選修的課程的課程號和課程名問題

sql資料庫中查詢選修了所有課程的學生的學號和姓名及選修門數

6樓:騰訊電腦管家

select s.sname, s.s*** , s.

sage, s.sdept c.cname g.

grade from student s , course c ,grade g where s.sno = g.sno and g.

cno = c.cno;

7樓:站在風中望著你

??????????????????????????你好,sql是什麼

1.查詢每個學生都選修了哪些課程.並寫出sql語句. 2查詢』資料庫』的先修課程的名稱,並寫出sql語句.

8樓:匿名使用者

1)select a.sname,c.cname from student a,sc b,course c

where a.sno=b.sno and b.cno=c.cno

2)沒看到你的意思啊,查詢課程名是『資料庫』的課程?

9樓:愛未動心已死

學生表和課程表是分開的,多表查詢你要把你的表發出來

sql語句查詢沒有被學生選修過的課程(即課程號沒有在sc表中出現過)的名稱.

10樓:匿名使用者

1、建立學生及課程表,

create table test_student(stu_id number, class_id number);

create table test_class(class_id number, class_name varchar2(30));

2、插入測試資料,

insert into test_student values(1,1001);

insert into test_student values(2,1001);

insert into test_student values(3,1002);

insert into test_student values(4,1003);

insert into test_student values(5,1003);

insert into test_student values(6,1003);

insert into test_class values(1001,'美術');

insert into test_class values(1002,'**');

insert into test_class values(1003,'繪畫');

insert into test_class values(1004,'跆拳道');

3、查詢學生選修的課程,

select * from test_student t, test_class b where t.class_id = b.class_id

4、查詢無學生選修的課程,可以發現1004 跆拳道課程,無人選擇,

select b.*

from test_student t, test_class b

where t.class_id(+) = b.class_id

and t.class_id is null

11樓:偶梅花象婷

一般情況來說,有一個關於選修課程的表,我暫時叫他t_course,pk是courseid

一個學生表,叫t_student,pk是studentid,一個關係表,叫t_join,

pk是joinid,

fk是studentid和courseid我們定義了很多課程,然後有很多學生,如果一個學生選修了一個課程,就會有條關聯的資料放在t_join裡面,這樣的話,我們要知道有多少學生選修了一門課程的話,只需要

select

count(0)

from

t_courese

cinner

join

t_joinjon

c.courseid

=j.courseid

where

c.courseid=

12樓:匿名使用者

1)select a.課程 from 課程表 a where  not exists(

select 1 from sc b where b.課程號=a.課程號);

2)select distinct a.課程 from 課程表 a left join sc b

on a.課程號=b.課程號 where b.課程號 is null;

請按實際調整**中的表名和欄位名。

如果碰到大資料表時在有可利用的索引情況下推薦語句1其效率很高,否則語句1可能效率低下,這種情況下應採用語句2。

13樓:匿名使用者

select a.cno

from sc a

where

not exists

(select b.cno

from sc b

where a.cno=b.cno);

SQL查詢選修了全部課程的學生姓名

第一問 兩個not exists表示雙重否定 沒有一個選了課的學生沒有選course表裡的課程 select sname from student where not exists 沒有一個學生滿足以下條件 select from course where not exists 什麼條件呢?沒有選過...

查詢選修了2號課程的學生的學號,用SQL查詢同時選修了1號課和2號課的學生學號

select distinct sno from sc where cno c02 請根據具體的資料庫對sql語句作出適當的修改!用sql查詢同時選修了1號課和2號課的學生學號 查詢bai 同時選修了1號和2號課的學du生學號 涉及到兩zhi個表.學生表和dao課程表 語句 select from ...

SQL 查詢每門課程的課程名 選課學生姓名及其學號,選課人數

我的學生資料庫跟你的差不多,我就用我的這些表給你做了個 select c.o,s.sname,s.sno,選課人數 from course c left join sc on c.o sc.o left join student s on s.sno sc.sno left join select ...