0

私は次の表とデータを持っています:ここのデータのスクリーンショット

course:
course#     ctitle               units
---------   -------------------  -----
ACCT 201    Financial Account      3
CHEM 356    Organic Chemistry      4
HIST 101    US History             5
MINS 235    Database Design        4
MINS 301    Intro to Business IS   3
MINS 350    Systems Analysis       4
PHED 434    Advanced Gym           2

class:
class#  course#      sec#   semyr
------  ----------   -----  -----
203     ACCT 201       03    F11
204     ACCT 201       04    F11
307     MINS 301       07    F11
418     MINS 235       04    F11
438     MINS 350       01    F11
624     PHED 434       02    F11

student:
sid  sname       major
---  ----------  ----------
 1    Bob        MINS
 2    Mary       POMG
 3    Joe        MGMT
 4    Sue        MKTG
 5    Jim        ACCT

class_student:
class  sid   grade
-----  ----  -----
 203     2     B
 203     5     D
 204     1     C
 204     4     C
 307     1     B
 307     2     B
 307     4     A
 418     1     A
 418     2     B
 418     5     C
 438     1     B
 438     4     C
 634     5     F

grade:
grade  grade_pts
-----  ---------
  A        4
  B        3
  C        2
  D        1
  F        0

次のクエリを実行すると:

SELECT      *  
FROM        STUDENT 
WHERE       SID NOT IN 
            (   SELECT  SID 
                FROM    CLASS_STUDENT 
                WHERE   GRADE IN ('A' , 'B')
            ) 
ORDER BY    SID;

Oracleがこの出力を生成すると思います。

sid sname major
--- ----- -----
 1  bob   mins
 4  sue   mktg
 5  jim   acct
 5  jim   acct
 5  jim   acct

NOTIN論理演算子がどのように機能するかを理解したいと思います。NOT INオペレーターは上記のクエリでどのように機能して出力を生成しますか?

4

3 に答える 3

3

より成績が悪い学生を返しますB

NOT INその後に定義したものを除外します。

言葉で:

Aすべての学生を選択しますが、成績または成績のある学生は選択しませんB

于 2012-05-01T16:55:33.017 に答える
1

サブクエリ(SELECT SID FROM CLASS_STUDENT WHERE GRADE IN ( 'A' , 'B' ))は、少なくとも 1 つのクラスで A または B の成績を持つすべての学生の SID を選択します。演算子とともに使用するとIN、リストは暗黙的に重複排除されます。学生 1、2、および 4 はすべて、少なくとも 1 つのクラスで A または B を持っていることがデータに表示されるため、このサブクエリの結果セットに含まれます。

次に、完全なクエリはSTUDENT、サブクエリによって返されたリストに含まれていないすべての行を選択するだけです。したがって、SID 3 と 5 の 2 つの行を取得していると思います。

あなたの「期待される結果」はほとんど意味がありません。クエリがすべての学生を選択してから一部を除外する場合、同じ学生に対して複数の行が期待される理由はありません。

クエリが行っていることは、少なくとも 1 つのクラスで A または B の成績を持っていない学生を表示することです。あなたが望むのは、成績が B よりも悪い各学生とクラスの組み合わせを表示することだと思います (これは、期待される結果と一致しているようです)。これを行うには、クエリをCLASS_STUDENTテーブルから追い出し、に参加しSTUDENTて学生の情報を取得することをお勧めします (必要に応じてCLASSCOURSEコースの名前を取得することもできます)。

于 2012-05-01T17:03:59.273 に答える
1
SELECT SID FROM CLASS_STUDENT WHERE GRADE IN ( 'A' , 'B' )

A、Bの成績を持つ学生のsidを選択します。sidのリストになります

SID
2
1
2
4
1
2
1

それから

SELECT  *  FROM STUDENT 
WHERE   SID NOT IN  ...

結果は次のようになります:

SID     sname       Major
3       joe         mgmt
5       jim         acct
于 2012-05-01T17:06:00.047 に答える