21063


HAVING句を「GROUP BY」を使用せず単独で使用可能なのはどういう要件でしょうか？

SELECT句で集約関数を使用する場合か、SELECT句でASを使用する場合であれば、HAVING句を単独で利用可能なのでしょうか？


CC BY-SA 3.0
2016-01-19T02:17:11.563
21047
2016-01-19T08:44:19.797
2016-01-19T02:24:56.263
7886
7886
question
mysql
HAVING句を単独で使用可能な要件は？ 集約関数かASを使用すれば単独使用可能？


GROUP BY を必用としないHAVINGは「グループが無い＝表全体」の集約結果に対して条件が書ける。ということだと思います。

GROUP BYがないので 集約した結果は1行になります。それの結果をHAVINGで条件指定するので
「1行返る」または「1行も返らない」という結果が期待出来ます。

次の例は、having を使って表の行数とseq 列の最大値を比較してます。

[code]

    select '通し番号が歯抜けです' 
    from table
    having count(*) <> max(seq)
    
[/code]

seq が 1から始まる通し番号だとすると 行数と seq
の最大値は一致するはずです。一致しない場合は「通し番号が歯抜けです」という行が1行だけ返り、一致する場合は1行も返りません。


CC BY-SA 3.0
2016-01-19T05:49:17.467
21052
2016-01-19T05:49:17.467
5008
21047
answer


標準SQLにおけるHAVING句は **グループ化を行った後** の表から抽出を行う処理です。

そのため[PostgreSQL](http://www.postgresql.jp/document/9.4/html/sql-
select.html#SQL-
HAVING)などでは（SELECT句の列リスト同様に）グループ化を行った後で一意に決まる式しか使うことができません。具体的には以下のような式です。

  * GROUP BY に指定した列
  * 集約関数
  * その他、列に依存しない式

GROUP
BYに列名を指定しなかったとしても全行をひとつとしてグループ化されるため、SELECT句で列を直接参照することはできませんし、結果は0行または1行になります。

* * *

一方MySQL（[Oracleも？](http://sqlfiddle.com/#!4/8ca29f/56)）では、GROUP
BYや集約関数を使っていない場合にはグループ化が行われず、HAVING句がWHERE句と同じような挙動をするようです。

GROUP BY や集約関数によってグループ化が行われた場合でも、MySQLではGROUP
BYに指定しなかった列もHAVINGに書くことができますが、この場合はグループ内の **適当な**
一行に対して条件式が評価されるのでまた違った挙動を示します。

[code]

    INSERT INTO hoge(a,b) VALUES (1,1), (1,2), (1,3);
    
    SELECT a,b FROM hoge
    HAVING b > 1; -- 結果は2行
    
    SELECT a,b FROM hoge
    GROUP BY 1
    HAVING b > 1; -- 結果は2行
    
    SELECT a,b FROM hoge
    GROUP BY a
    HAVING b > 1; -- 結果は0 or 1行
    
    SELECT a,b FROM hoge
    HAVING b > 1 and count(*) > 0; -- 結果は0 or 1行
    
    SELECT count(*),a,b FROM hoge
    HAVING b > 1; -- 結果は0 or 1行
    
[/code]

そして、ASで指定した列名のエイリアスをHAVINGで使えるのもMySQLの拡張です。

いずれにせよHAVING句に何を指定できるか、その結果がどうなるか、そしてHAVINGを使う意味があるかという問題でしかなく、「××で○○を使わないとHAVING句が使えない」ということはありません。

参考

  * [MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.9 SELECT 構文](https://dev.mysql.com/doc/refman/5.6/ja/select.html)
  * [MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.19.3 MySQL での GROUP BY の処理](https://dev.mysql.com/doc/refman/5.6/ja/group-by-handling.html)
  * [What is the correct result for this query? - Database Administrators Stack Exchange](https://dba.stackexchange.com/a/33791)


CC BY-SA 3.0
2016-01-19T08:10:40.690
21063
2016-01-19T08:44:19.797
2017-04-13T12:43:06.283
-1
8000
21047
answer