質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

4回答

1892閲覧

mysqlの集計関数の挙動に関して

ayu

総合スコア212

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2016/06/25 02:43

こんにちは。

mysqlの集計関数を使っていて、気になることが出てきました。

mysql

1selece item, max(amount_invested) 2 from hoge; 34+--------------+----------------------+ 5| item | max(amount_invested) | 6+--------------+----------------------+ 7| 食費 | 7560 | 8+--------------+----------------------+

これでは食費になります。

サブクエリでmaxを求めます。

mysql

1select item, max(amount_invested) 2 from hoge 3 where amount_invested = (select max(amount_invessted) from hoge); 4 5+-----------------+-----------------+ 6| item | amount_invested | 7+-----------------+-----------------+ 8| 水道光熱費 | 7560 | 9+-----------------+-----------------+

水道光熱費になります。

前者のsqlは「1行の結果」と「複数行の結果」が混在しているからだと思っています。

この考えは合っておりますでしょうか?m(_ _)m

普通はエラーになると思うのですが・・・

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

集計関数を使うためにはグループ化しなくてはいけません。
記述を省略しても内部的にグループされています。
(例示のSQLでは全体を1つのグループとみなしています)
そして一般的にSQLではグループ化に使ったカラム以外を参照するとエラーになります。
※しかし、mysqlはこれをエラーにしません。

item,amount_invested 食費,2000 水道光熱費,7560 家賃,7560

仮にデータがこうだったとします。
最初のSQLでは
maxは7560と確定ですが、itemはamount_investedの値が7560のitemという縛りが無いので、「食費」か「水道光熱費」か「家賃」のどれが選択されても良い状況です。
このような場合、mysqlはユーザには結果が予測できない基準で一つを選択します。
※おそらくデータ的に先頭に近いものが選択されていると思いますが、この順は食費を更新したりすると変化するでしょう。

二つ目のSQLでは
値が7560のレコードに絞り込んでいますので、「水道光熱費」か「家賃」のどちらが選択されます。

もし値が最大のレコードを抽出したいなら次のようなSQLになります。
※最大値のレコードが複数あれば、複数が抽出されます。

SQL

1SELECT item, amount_invested 2FROM hoge 3WHERE amount_invested = (SELECT MAX(amount_invessted) FROM hoge);

投稿2016/06/25 03:54

編集2016/06/25 04:03
hirohiro

総合スコア2068

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ayu

2016/06/25 04:55

丁寧に例までつけて解説していただき、ありがとうございます! >集計関数を使うためにはグループ化しなくてはいけません。 ここは全く意識できていませんでした。 意識するようにしますm(_ _)m >そして一般的にSQLではグループ化に使ったカラム以外を参照するとエラーになります。 >※しかし、mysqlはこれをエラーにしません。 こういう事情があったのですね。 参考書をやっていて、mysqlで期待する答えにならずに気になりました。
guest

0

普通のsqlではエラーになる、MySQLの特殊な動作ですね
集計時でも、非集約カラムの参照ができます。

ただし、値は不定です。
その集計内ならどれでもいいとか、同じ値であることがわかっているのならば
便利かもしれません。

投稿2016/06/25 03:37

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ayu

2016/06/25 04:56

>普通のsqlではエラーになる、MySQLの特殊な動作ですね >集計時でも、非集約カラムの参照ができます。 >ただし、値は不定です。 ありがとうございます。 >その集計内ならどれでもいいとか、同じ値であることがわかっているのならば >便利かもしれません。 こういう考えもできるんですね。 参考になります!
guest

0

SQL Server Express だとエラーになります。
item が集合である以上、エラーにする方がユーザーに優しいと思うのですが、仕様でしょうか?

投稿2016/06/25 03:00

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ayu

2016/06/25 04:57

>SQL Server Express だとエラーになります。 そういうことですよね。 >item が集合である以上、エラーにする方がユーザーに優しいと思うのですが、仕様でしょうか? これは自分が参考書をやっていて気になった部分なので、適当なテーブルです>_<
guest

0

んーごめんなさい!
何が聞きたいのか分かりません。
特に前者のsqlは...ってところですかね

投稿2016/06/25 03:00

YK1037

総合スコア236

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ayu

2016/06/25 04:57

質問がわかりにくくてすいませんm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問