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

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

新規登録して質問してみよう
ただいま回答率
85.49%
GROUP BY

GROUP BYとはSQL文のひとつで、SELECT文において特定の列の値が等しい行ごとに表をグループ化します。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

1回答

946閲覧

SQLのGROUP BYについて聞きたいことがあります!!

dekasan

総合スコア0

GROUP BY

GROUP BYとはSQL文のひとつで、SELECT文において特定の列の値が等しい行ごとに表をグループ化します。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2021/05/17 12:04

編集2021/05/17 12:09

musicテーブル

idname

favoriteテーブル

idmusic_idmember_id

music.idとfavorite.music_idは外部結合されています。
favorite.member_idはその音楽が好きな人のIDを指しています。

このときに楽曲の名前(music.name)とその音楽が好きな人の数を抽出したいです。(0人のときは0を)

そこで自分は

sql

1SELECT 2 music.name, 3 COALESCE(COUNT(favorite.music_id) , 0 ) 4FROM 5 music 6LEFT OUTER JOIN 7 favorite ON music.id = favorite.music_id 8GROUP BY 9 music.id 10

としました。

その際、GROUP BYをmusic.nameにしてはいけないのかの疑問が浮かびました。

GROUP BYをmusic.nameにしてはいけない理由などありましたら、ご回答したいただけると幸いです

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

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

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

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

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

takasima20

2021/05/17 12:26

同名の曲はない前提なのかな?
dekasan

2021/05/17 12:28

同名の曲はない前提です!
takasima20

2021/05/17 12:56

ならどっちでもいいんじゃ?
guest

回答1

0

同名の曲は存在しないという前提で回答します。

musicテーブルはidがPKで、nameに対しては索引が作られていないとすると、
music.idでgroup by したほうが music.name でgroup by するより若干速度が速いです。

試しにpostgresqlにmusicを1000件、favoriteを100000件入れて速度差を比較すると、
idでgroupbyした場合は平均0.042秒ほどで、nameでgroupbyした場合は平均0.046秒ほどかかりました。
データ数が少ないので一概には言えませんが、nameの方が1割ほど時間がかかります。

集計速度に差が出る原因として考えられるのは、以下の点です。

  • 索引の差。idはPKなので索引がついている。
  • 型の差。idはserial(整数型)だがnameはvarcharなので比較そのものに時間がかかる

とういことで、速度面を考えるとidで集計したほうが好ましいということになるかと思います。
nameで集計したらいけない、とまでは言えないとは思いますが、結果が同じであれば実行速度の速い方を採用すべきです。

投稿2021/05/17 15:22

hope_mucci

総合スコア4447

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問