Joe Celko氏の著書[SQLパズル]より引用 SQLでのgroup by句は、 select文の特別な種類といっただけのものではありません。 group by句は、集合を重複のない空でない部分集合に分割します。 そして、グループ化されたスカラー値を使って、 それぞれの集合を一行に集約します。 グループ化された値には、定数、集計関数、および、これらの値から導かれる式があります。 つまり、グループ化された行は、 グループに関する情報を持っているのであって、 テーブル内の個々の行の情報を持っているわけではありません。
マニュアルより引用 GROUP BY句を含む問合せでは、SELECT構文のリストの要素は、 集計ファンクション、GROUP BY式、定数またはこれらのいずれかを含む式になります マニュアルより引用(英語) In a query containing a GROUP BY clause, the elements of the select list can be aggregate functions, GROUP BY expressions, constants, or expressions involving one of these.
--■■■当然これはエラー■■■ select sum(EMPNO),(select max(b.EMPNO) from emp b where b.EMPName = a.EMPName) from emp a group by EMPNO; --■■■実際にはこれもダメ■■■ select sum(EMPNO),(select max(b.EMPNO) from emp b where b.EMPName = max(a.EMPName)) from emp a group by EMPNO; --■■■これは非相関で定数を返すのでOK■■■ select sum(EMPNO),(select max(b.EMPNO) from emp b) from emp a group by EMPNO; --■■■これは相関だけど、a.EMPNOはgroup byで指定していて、■■■ --■■■GROUP BY式を使っての、定数の作成と扱われるのでOK ■■■ select sum(EMPNO),(select max(b.EMPNO) from emp b where b.EMPNO = a.EMPNO) from emp a group by EMPNO;