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

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

新規登録して質問してみよう
ただいま回答率
85.48%
データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

421閲覧

関係データベース HAVING文とSELECT文の優先順位について

ikanosasimi

総合スコア32

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2017/10/19 17:09

編集2017/10/19 17:18

SELECT 費目、SUM(出金額)AS費目別の出金額合計
FROM 家計簿
GROUP BY 費目
HAVING SUM(出金額)>0

この場合、結果は変化しないのでしょうが、SELECT文のSUMとHAVING文のSUMはどちらが先に集計されるのでしょうか。
書籍にはHAVING文は集計結果がすべてそろった最後の段階で実行されると表記がありますが、インターネットで調べてみるとHAVING文の後でSELECT文が実行されるとあります。

また、having句にあらわれるのは、基本的には、selectのリストにあらわれている項目名だけだと思いますが
例外はありますか?

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

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

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

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

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

guest

回答2

0

書籍にはHAVING文は集計結果がすべてそろった最後の段階で実行されると表記がありますが、インターネットで調べてみるとHAVING文の後でSELECT文が実行されるとあります。

HAVINGはselectというよりも、Group By後に行われます。
処理自体全部が行われるという意味ではなく、判定が行われるということです。
例えばSum(項目)>0であれば、Sum(項目)自体はgroup by中に行われ、判定のみがgroup by後に行われる。

また、having句にあらわれるのは、基本的には、selectのリストにあらわれている項目名だけだと思いますが例外はありますか?

Select項目である必要はありません。
Group by項目も記述可能ですが、Where条件として記述する方が先に絞り込みが行われるので、高速です。

投稿2017/10/20 01:25

編集2017/10/20 01:30
sazi

総合スコア25173

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

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

0

ベストアンサー

優先順位となるとサブクエリの有無によっても変わってきますが、ご質問の内容ですと、HAVINGのSUMが先に実行されて、対象行が抽出される動きとなるのではないかと思います。
抽出された行について、SELECTで指定した列に対するSUMが実行されます。

HAVING句にはGROUP BYで集計した内容に基づいた抽出条件を記載できますので、SELECTで取得する内容以外の条件を指定することも可能です。
下記はMySQLでの例を記載しますが、tax列の合計が1000を超える費目に対して金額の合計を取得するという内容でSELECT文を実行しています。
ここでは食費のSUM(tax)の結果は705となるので、SELECT文の結果として抽出されません。

sql

1-- CREATE TABLE kakeibo (himoku VARCHAR(32), kingaku INT, tax INT); 2 3-- INSERT INTO kakeibo VALUES ('食費', 1000, 80); 4-- INSERT INTO kakeibo VALUES ('食費', 500, 25); 5-- INSERT INTO kakeibo VALUES ('食費', 1500, 120); 6-- INSERT INTO kakeibo VALUES ('食費', 2000, 160); 7-- INSERT INTO kakeibo VALUES ('食費', 4000, 320); 8-- INSERT INTO kakeibo VALUES ('光熱費', 5000, 400); 9-- INSERT INTO kakeibo VALUES ('光熱費', 6000, 480); 10-- INSERT INTO kakeibo VALUES ('光熱費', 7000, 560); 11-- INSERT INTO kakeibo VALUES ('交際費', 3000, 240); 12-- INSERT INTO kakeibo VALUES ('交際費', 5000, 400); 13-- INSERT INTO kakeibo VALUES ('交際費', 2000, 160); 14-- INSERT INTO kakeibo VALUES ('交際費', 3000, 240); 15-- INSERT INTO kakeibo VALUES ('家賃', 50000, 4000); 16 17SELECT himoku, SUM(kingaku) FROM kakeibo GROUP BY himoku HAVING SUM(tax) > 1000; 18+-----------+--------------+ 19| himoku | SUM(kingaku) | 20+-----------+--------------+ 21| 交際費 | 13000 | 22| 光熱費 | 18000 | 23| 家賃 | 50000 | 24+-----------+--------------+

投稿2017/10/19 21:09

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問