2005年03月30日

[ テクニカルエンジニア(データベース)/H17受験記 ]

HAVING

9氏からのコメント依頼
元ネタ記事

689 :名無し検定1級さん :2005/03/29(火) 15:20:45
HAVING句ではSELECT句で定義した別名は使えないの?

693 :前スレ973:2005/03/29(火) 22:15:58
>>689
> HAVING句ではSELECT句で定義した別名は使えないの?
そう、それ。
アイテックの模試でそんなのがあって、間違えた。というか、配られた正解では
別名は使ってなかった。
模試の解説セミナー受けるから聞いてみようかな?

698 :9:2005/03/30(水) 03:11:22
>>693
ワロタwww
おいおい(;´・∀・)つ HAVING句ってのはあくまでGROUP BY句に対する条件であって、
どうしてSELECT句より先に解釈されるGROUP BY句やHAVING句で、SELECT句の別名が使えるんだよ(プゲラwww

701 :前スレ973:2005/03/30(水) 06:52:12
>>698
頭の中では、FROM→WHERE→GROUP→HAVING→SELECTの順に
トレースしてるんだが、コンピュータも同じことやってるわけか。

良いこと聞いた。サンクス。

ん?MySQLで使えるってのはガセか?

702 :9:2005/03/30(水) 06:55:57
>>690
> MySQL は、GROUP BY 節に記述されていないフィールドを select できるように GROUP BY の使用を拡張しています。
こんな試験では絶対×になるだろう拡張をやってるくらいだから、試験対策としてはまったく使えんだろこれは

>>701
だからその部分だけでいいから問題教えれ…_| ̄|〇
> 頭の中では、FROM→WHERE→GROUP→HAVING→SELECTの順に
そう、選択式の値は、FROM句、WHERE句、GROUP BY句、HAVING句、SELECT句の順に評価される仕様になっている

なんか解決っぽいので,関連する情報を集めてみました。


PostgreSQL 8.0.1 文書 > 第 7章問い合わせ > 7.2.3. GROUP BYとHAVING句

HAVING句内の式は、グループ化された式とグループ化されてない式(この場合は集約関数が必要になります)の両方を参照することができます。


現行バージョンのMySQLは標準SQL準拠になった模様。。。
MySQL Reference Manual for version 4.0.12. > 6.4.1 SELECT 構文

・SELECTの表現では、ASによる別名の指定が可能です。別名は、フィールド名の表現として使われ、ORDER BY及びHAVING節とともに使用することができます。
・HAVING節は、select_expressionにおいてどのフィールドの名前やエイリアス名でも指し示すことができます。これは最後に適用され、クライアントにアイテムが送られる直前に実行されるので、最適化されません。

MySQL バージョン 3.22.5以降では、次のようにクエリを記述することができます:
mysql> SELECT user,MAX(salary) FROM users
GROUP BY user HAVING MAX(salary)<10;

MySQLの古いバージョンでは、この代わりに次のように記述できます:
mysql> SELECT user,MAX(salary) AS sum FROM users
GROUP BY user HAVING sum<10;

と,いうことで,古いバージョンを参照
MySQL Reference Manual for version 3.21.31 > SELECT

select 表現は別名を与えられます。別名はその項目名となり、そしてソートとグループ時に、または HAVING 節内で使用できます。

SQL攻略>>SQL攻略マップ>>SELECT文>>グループ化したテーブルの選択条件(HAVING)

HAVING句に使用される式は、グループごとに一つの値を持たなくてはならないので、グループ化したキーか集合関数のみ比較することが出来ます。

TECHSCORE>SQL>5.5.2. HAVING 句

HAVING 句は WHERE 句が指定する条件で呼び出された行から、グループを選ぶための条件を与えているのです。ですから行を選ぶ WHERE 句には集約関数を置くことはできませんが、HAVING 句では集約関数を置くことができます。


標準SQL(JIS X 3005)
 日本工業標準調査会JIS検索
  JIS規格単語検索 キーワード「SQL」で検索ください。

7.4 HAVING句
機能
<HAVING句>は,<検索条件>を満たさないグループを取り除くことによって導出されるグループ表を指定する。

形式
!! 追加の形式項目なし。

構文規則
1) 【構文規則4)を置き換える】<検索条件>中の<副問合せ>中に含まれ,Tの列を参照する各列参照は,Gに関数従属である列を参照するか,又は<集合関数指定>の集約化引数内に指定しなければならない。
2) 【構文規則4)の後に挿入する】<検索条件>は,<副問合せ>を介在しないで,<ウィンドウ関数>を含んではならない。

アクセス規則
追加のアクセス規則になし。

一般規則
1) 【一般規則2)を置き換える】<探索条件>がRの与えられたグループに適用されるとき,<集合関数指定>中の<列参照>が外への参照でない限り,そのグループは,<探索条件>中に直接含まれる各<集合関数指定>の引数の入力とする。

適合性規則
1) 【適合性規則2)を置き換える】機能T301“関数従属性”なしでは,<探索条件>中の<副問合せ>中に含まれ,Tの列を参照する各列参照は,次のうち一つでなければならない。
a) Tのグループ化列へのあいまい性のない参照である。
b) <集合関数指定>の集約化引数に含まれる。


JISは何が言いたいのか良く分からん。。。

Posted by g@kko at 2005/03/30 21:28 | 個別記事表示 | コメントを見る (15) |
この記事をLicWikiに埋め込む:
コメント
2 :g@kko:05/03/30 21:32:29 [RES]

午後I に出るかというと微妙ですね。。。
午前の選択問題なら問題ないと思われますが。。。

午後I で出題されるとしたら,
SQLの穴埋めではなく

平成13年午後I 問3 設問2のような形式ではないでしょうか・・・
ORDER BY COUNT(*) DESC がエラーの理由は何?のような感じの設問かなと。


3 :前スレ973:05/03/30 21:45:16 [RES]

まじでセミナーで質問してみよっかな。
せっかく高い金払って行くんだし。


4 :9:05/03/31 00:01:17 [RES]

>>2
いや、だから・・
・gakkoはどう解答したの?
・その調査の結果、結局どう結論付けたの?
一番聞きたかったこの二つがなぜまったくない…_| ̄|〇

>>3
あっちでも書いたけど絶対聞けって
どんな回答がくるか気になるし、ここは講師の腕を図れるいいチャンスだしw
つか講師誰(´・ω・)?


5 :前スレ973:05/03/31 06:57:01 [RES]

>>4
俺的には9の説明でかなり納得なので、聞かないことにするよ。
ほかの受講生に「あいつが前スレ973か!」ってばれるのも恥ずいし。

講師は、・・・分からない。


6 :g@kko:05/03/31 13:06:16 [RES]

>>4
>いや、だから

この
>これ多分午後Ⅰだと思うんだけどgakkoはどう
フリはそういう意味だったんだ。。。
そのフリへのレスは >>2 のつもりだったんだけど(苦笑

自分の解答はたぶん前スレ氏と同じだと思う。
特にというか全く意識してなかったし。。。

調査結果については,
試験のSQLがJISに拠るので,もうちょっとJISを読んで見ようかなという所。(しかし時間がない。。。)
構文規則にそういった意味が書いてあるのかどうかなんだけど。。。
JISのPDFは検索が出来ないので探しきれていないっす。

>>5
聞かないんですか??せっかくの機会なのに。。。


7 :9:05/03/31 17:10:34 [RES]

> 構文規則にそういった意味が書いてあるのかどうかなんだけど。。。

HAVINGがどうこうってのより、一般的な評価順(SELECTはHAVINGより後?)とかのを見たほうがいいと思う
ちなみに俺も見ようと思ったが、ずっと表示していますとか言って固まったまま(プゲラwww

> >>5
> 聞かないんですか??せっかくの機会なのに。。。

禿同。せっかくの俺らの疑問が解決するかもしれないってのに、何を気にしてんだか。自意識過剰もいいとこだよw
そういうこと聞かないでただ一方的に聞いてるだけじゃ、解説読むのとなんら変わらん。行くだけの金のムダ。セミナーってのは双方向通信ができるから価値があるんじゃないのか?


8 :前スレ973:05/03/31 21:08:35 [RES]

>>7
せっかくの「解脱セミナー」だから、一皮むけて、聞いてみるか。


9 :g@kko:05/03/31 23:48:17 [RES]

>>7
 途中経過っす。
 JIS X 3005-1において,評価順はISO/IECを参照となっている模様。
 ISO/IECのドキュメントって有料なんだよな。。。(苦;

 英語版はgoogleで検索すれば入手可能。
 こっちのPDFは検索も効くし,コピペもできる。


10 :前スレ973:05/04/03 19:08:00 [RES]

セミナーの内容は書かないことにしたんだが、これだけは乗りかかった船なんで。
HAVING句での別名使用については、質問するまでもなく、「今回、こんな間違いをした人が多かったんだが」ということだった。
「シンタックスの問題」なのか「評価順の問題」なのかは聞けなかったが、これってどっちとか言えないでしょ。「なぜ未成年は飲酒しちゃいけないか」って質問に「法律だから」という答えと「体がまだ未成熟で悪影響が大きいから」という答えのどっちも正しいでしょ。
まあ、俺は「体がまだ未成熟で悪影響が大きいから」と理解する方が気持ちいいけどね。だから、9には感謝してるよ。


11 :9:05/04/03 19:18:07 [RES]

> 「シンタックスの問題」なのか「評価順の問題」なのかは聞けなかったが
それ聞かなかったら意味ないだろ…_| ̄|〇
聞く時間がなかったのは、突っ込みに耐えられるだけの実力がN氏にないから?w


12 :g@kko:05/04/03 19:51:58 [RES]

>>10 :前スレ973氏
 情報提供ありがとうございます。

>今回、こんな間違いをした人が多かったんだが
講評どおりの説明ってことですな。
どちらであれ,試験への影響はないので,時間が惜しい今,深入りするのもアレですな。。。

>>11
 9が知りたかったのは,どっちが正しいかではなく。。。
 「アイテックの講師がどう答えるか。」
 だったんだよな。。。残念。


13 :9:05/04/03 19:54:44 [RES]

> 講評どおりの説明ってことですな。
質問する時間もあまりない、つまり逆に言うとほぼ講評どおりのことを機械的に一方的にしゃべってるだけで、ぶっちゃけあまりセミナーの意味ない(;´・ω・)?


14 :前スレ973:05/04/03 21:14:31 [RES]

そうね、講評どおりの部分もあったが、講評より突っ込んだ部分もあった。
でも、説明の途中で講師が「???」と考えてしまってたところもあったよ。
人に言われなくても、模試の復習をする、解説も講評もしっかり目を通して自分の弱い点を自覚する、って人には、あまり意味ないかも。
俺は、「試験終わったー」「成績来たー」「良かったー」で終わってたから、有意義だったよ。


15 :g@kko:05/04/03 23:29:33 [RES]

とりあえずSYNTAX。


Syntax Rules

1) Let HC be the <having clause>. Let TE be the <table expression> that immediately contains
HC. If TE does not immediately contain a <group by clause>, then GROUP BY ( ) is implicit. Let
T be the descriptor of the table defined by the <group by clause> GBC immediately contained in
TE and let R be the result of GBC.

2) Let G be the set consisting of every column referenced by a <column reference> contained in
GBC.

3) Each column reference directly contained in the <search condition> shall unambiguously reference
a column that is functionally dependent on G or be an outer reference.
NOTE 116 – Outer reference is defined in Subclause 6.6, ‘‘<column reference>’’.

4) Each column reference contained in a <subquery> in the <search condition> that references a
column of T shall reference a column that is functionally dependent on G or shall be specified
within a <set function specification>.

5) The <having clause> is possibly non-deterministic if it contains a reference to a column C of
T that has a data type of datetime with a time zone displacement value, character string, or
user-defined type and at least one of the following is true:
a) C is specified within a <set function specification> that specifies MIN or MAX.
b) C is functionally dependent on G.

6) The row type of the result of the <having clause> is the row type RT of T.


16 :g@kko:05/04/04 00:19:20 [RES]

 問合せ指定(SELECT文)の選択リストにおいて,AS句で指定した列名は,WHERE句,GROUP BY句,HAVING句には使用できないが,ORDER BY句では使用できる。
 また,副問合せでAS句を指定した場合は,その外側の問合せ式で参照することができる。