ただいま初級シスアドのテキストを勉強中です。その中の「SELECT文、比較演算子を使った副問い合わせ」というページです。
例)SELECT 氏名,点数 FROM 学生一覧
WHERE 点数=(SELECT MAX(点数)
FROM 学生一覧)
というのは
SELECT 氏名,点数 FROM 学生一覧
WHERE 点数=MAX(点数)
というのでは何故ダメなのですか?結果同じじゃないのと思ってしまうのですが。
「SELECT文の中で一時的に別のSELECT文を呼び出す」という説明は理解できるのできるのですが、どうしてわざわざ面倒にするのだろうと不思議です。
全く私がわかっていないという事なんでしょうが、どなたかご面倒をお掛けいたしますがお教えください。お願いいたします。
No.4ベストアンサー
- 回答日時:
>ということは、氏名を抜き出さなければならないから副問い合わせにしなくてはならないのであって、もし、点数のみの抜き出しであれば、
>SELECT 点数 FROM 学生一覧
> WHERE 点数=MAX(点数)
>ということでよろしいわけでしょうかね?
集計関数は、単独でWHERE句で使うことは出来ません。
よって、SELECT句で氏名を抜いても抜かなくても上のSQLはエラーになります。
氏名があってもなくても、点数の最大値は一度全表をチェックしないと分かりませんからね。
テキストに、
SELECT 点数 FROM 学生一覧
WHERE 点数>=AVG(点数)
が可能と書かれているそうですが、これも出来ません。
テキストが間違っています。
>ただ、SELECTの後だけではないようで、HAVING句の後でも使われている例題がございました。
集計関数は、HAVING句なら使用可能です。
これは、処理の順番が、
1.SELECT句に示されたフィールドを、表中のレコードから、WHERE句の条件で抽出する。
2.GROUP BY句で指定されたグループで集計を行う。(ここで、レコードが集計済みとなる)
3.2.で求められた表の内容をから、having句で指定された条件の結果を絞り込む。
という流れなので可能なのです。
わかっていただけました?
そうなんですか、駄目なんですか。(No.1さん御免なさい…)100%解ってないんですが、とにかくそういうことで覚えます。ざっくばらんなテキストなので時間をみて又別の本を調べてみたいと思います。何度もご面倒をお掛けしてすいませんでした。有難うございます。
No.3
- 回答日時:
MAX()などの集約関数は、1つの列グループに対する演算機能なので、SELECT文の列のところでしか使用できないと思います。
ですから、副問い合せにして、あなたが示した上の例のように記述するのだと思います。
1つの列グループに対する演算、そうだったのか!わかりました。本当にどうも有難うございました。
ただ、SELECTの後だけではないようで、HAVING句の後でも使われている例題がございました。生意気なこと申しましてすいません。どうか気を悪くなさいませんように…。
No.2
- 回答日時:
では、MAX(点数)を求めるには?
最大値を求めるには、表のすべてを検索しないと求まりませんよね。
最大値を求めた上で、最大値と点数フィールドの値1レコードを比較するから点数が一番高い学生の氏名が求められるのです。
max、min、count、avgのような関数を集計関数といいます。
これらは、表を一通り調べた結果から値を求めるものなので、質問中の下のSQLの記述方法ではエラーになります。
なので、まず、副問い合わせをすることで、表中の点数の最大値を求めるということが必要になります。
この回答への補足
ということは、氏名を抜き出さなければならないから副問い合わせにしなくてはならないのであって、もし、点数のみの抜き出しであれば、
SELECT 点数 FROM 学生一覧
WHERE 点数=MAX(点数)
ということでよろしいわけでしょうかね?
もし、お時間ございましたら又お返事くださいますでしょうか?
忙しいようでしたら、そう理解しておきます。
ご丁寧なご教示まことに有難うございました。
No.1
- 回答日時:
>SELECT 氏名,点数 FROM 学生一覧
>WHERE 点数=MAX(点数)
WHERE句の中でMAX関数は使用できなかったと思います。
なので、一旦
>(SELECT MAX(点数)FROM 学生一覧)
の結果を得てから比較するように
>SELECT 氏名,点数 FROM 学生一覧
>WHERE 点数=(SELECT MAX(点数)
>FROM 学生一覧)
としています。
ご親切にどうも有難うございました。
ただ、MAX関数ではないのですが、テキストによると、
SELECT 点数 FROM 学生一覧
WHERE 点数>=AVG(点数)
というのは有りのようでございます。
失礼を申し上げすいません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 第二回模試の3科目の各得点と合 1 2023/04/25 18:02
- MySQL 三科目合計点のクラス別平均点求めるクエリ式を教えてください 1 2023/07/04 09:44
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「名前(first name) 1 2023/06/24 13:03
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 第二回模試の3科目の各得点と合 1 2023/04/24 01:33
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
- MySQL SQLです。下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「昨年の各月の総降 1 2023/07/01 00:32
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 日本の全市区町村を人口密度が低 1 2023/06/18 19:51
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- PHP PHP MySql ページング 2 2022/09/20 06:38
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ACCESSのクエリで集計で、先頭...
-
FROM の中で CASE を使えるでし...
-
クロス集計の結果を元に戻す方法
-
アクセス レポートのテキスト...
-
桐の集計(集計行設定のこと)...
-
複数列フィールド値のクロス集計
-
AccessからExcelへエクスポート...
-
アンケート集計方法
-
access 存在しない項目を”0件”...
-
「警告 : NULL 値は集計または...
-
レポートウィザードの集計のオ...
-
クエリでの累計の取り方に関し...
-
Accessフォームにクロス集計ク...
-
SQL副問い合わせって?
-
Excel 2019 のピボットテーブル...
-
エクセルVBAで5行目からオート...
-
Accessでコードを入れると名前...
-
Accessでテーブル名やクエリ名...
-
Accessでテーブルの値をテキス...
-
変数が選択リストにありません
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ACCESSのクエリで集計で、先頭...
-
アクセスクエリの計算
-
FROM の中で CASE を使えるでし...
-
AccessからExcelへエクスポート...
-
複数列フィールド値のクロス集計
-
Accessフォームにクロス集計ク...
-
access 存在しない項目を”0件”...
-
VBA 得意先ごと且つ日付ごとに...
-
accessクロス集計で前月21日~...
-
「警告 : NULL 値は集計または...
-
クロス集計の結果を元に戻す方法
-
Accessで年齢から年代ごとの集計
-
MS-Accessのクロス集計クエリと...
-
桐の集計(集計行設定のこと)...
-
アクセスクエリ 締め日毎で絞...
-
アクセス レポートのテキスト...
-
Accessで別テーブルの個数をユ...
-
クロス集計での order by句の使...
-
クエリを使って縦に一行ずつ足...
-
絶対値ごとに集計したい
おすすめ情報