dポイントプレゼントキャンペーン実施中!

ただいま初級シスアドのテキストを勉強中です。その中の「SELECT文、比較演算子を使った副問い合わせ」というページです。
例)SELECT 氏名,点数 FROM 学生一覧
     WHERE 点数=(SELECT MAX(点数)
     FROM 学生一覧)
というのは
   SELECT 氏名,点数 FROM 学生一覧
     WHERE 点数=MAX(点数)
というのでは何故ダメなのですか?結果同じじゃないのと思ってしまうのですが。
「SELECT文の中で一時的に別のSELECT文を呼び出す」という説明は理解できるのできるのですが、どうしてわざわざ面倒にするのだろうと不思議です。
全く私がわかっていないという事なんでしょうが、どなたかご面倒をお掛けいたしますがお教えください。お願いいたします。

A 回答 (4件)

>ということは、氏名を抜き出さなければならないから副問い合わせにしなくてはならないのであって、もし、点数のみの抜き出しであれば、


>SELECT 点数 FROM 学生一覧
> WHERE 点数=MAX(点数)
>ということでよろしいわけでしょうかね?

集計関数は、単独でWHERE句で使うことは出来ません。
よって、SELECT句で氏名を抜いても抜かなくても上のSQLはエラーになります。

氏名があってもなくても、点数の最大値は一度全表をチェックしないと分かりませんからね。


テキストに、
SELECT 点数 FROM 学生一覧
 WHERE 点数>=AVG(点数)
が可能と書かれているそうですが、これも出来ません。
テキストが間違っています。

>ただ、SELECTの後だけではないようで、HAVING句の後でも使われている例題がございました。

集計関数は、HAVING句なら使用可能です。
これは、処理の順番が、

1.SELECT句に示されたフィールドを、表中のレコードから、WHERE句の条件で抽出する。
2.GROUP BY句で指定されたグループで集計を行う。(ここで、レコードが集計済みとなる)
3.2.で求められた表の内容をから、having句で指定された条件の結果を絞り込む。

という流れなので可能なのです。

わかっていただけました?
    • good
    • 0
この回答へのお礼

そうなんですか、駄目なんですか。(No.1さん御免なさい…)100%解ってないんですが、とにかくそういうことで覚えます。ざっくばらんなテキストなので時間をみて又別の本を調べてみたいと思います。何度もご面倒をお掛けしてすいませんでした。有難うございます。

お礼日時:2002/09/20 19:42

MAX()などの集約関数は、1つの列グループに対する演算機能なので、SELECT文の列のところでしか使用できないと思います。


ですから、副問い合せにして、あなたが示した上の例のように記述するのだと思います。
    • good
    • 0
この回答へのお礼

1つの列グループに対する演算、そうだったのか!わかりました。本当にどうも有難うございました。
ただ、SELECTの後だけではないようで、HAVING句の後でも使われている例題がございました。生意気なこと申しましてすいません。どうか気を悪くなさいませんように…。

お礼日時:2002/09/17 19:26

では、MAX(点数)を求めるには?



最大値を求めるには、表のすべてを検索しないと求まりませんよね。

最大値を求めた上で、最大値と点数フィールドの値1レコードを比較するから点数が一番高い学生の氏名が求められるのです。

max、min、count、avgのような関数を集計関数といいます。

これらは、表を一通り調べた結果から値を求めるものなので、質問中の下のSQLの記述方法ではエラーになります。

なので、まず、副問い合わせをすることで、表中の点数の最大値を求めるということが必要になります。

この回答への補足

ということは、氏名を抜き出さなければならないから副問い合わせにしなくてはならないのであって、もし、点数のみの抜き出しであれば、
SELECT 点数 FROM 学生一覧
 WHERE 点数=MAX(点数)
ということでよろしいわけでしょうかね?
もし、お時間ございましたら又お返事くださいますでしょうか?
忙しいようでしたら、そう理解しておきます。
ご丁寧なご教示まことに有難うございました。

補足日時:2002/09/17 19:33
    • good
    • 0

>SELECT 氏名,点数 FROM 学生一覧


>WHERE 点数=MAX(点数)

WHERE句の中でMAX関数は使用できなかったと思います。
なので、一旦

>(SELECT MAX(点数)FROM 学生一覧)

の結果を得てから比較するように

>SELECT 氏名,点数 FROM 学生一覧
>WHERE 点数=(SELECT MAX(点数)
>FROM 学生一覧)
としています。
    • good
    • 0
この回答へのお礼

ご親切にどうも有難うございました。
ただ、MAX関数ではないのですが、テキストによると、
SELECT 点数 FROM 学生一覧
 WHERE 点数>=AVG(点数)
というのは有りのようでございます。
失礼を申し上げすいません。

お礼日時:2002/09/17 19:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!