質問: 従業員、従業員の部署、給料のグレードを示す三つのテーブルが与えられた中で 部署名とその部署の給料グレード、部署にいる従業員の最低給料、平均のコミッションを紐ずけた形で 表示させるSQL文を書くことを求められています。 ``` SQL> select * 2 from dept; DEPTNO DNAME LOC ---------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 50 training San Francisco ``` ``` SQL> select * 2 from salgrade; GRADE LOSAL HISAL ---------- ---------- ---------- 1 700 1200 2 1201 1400 3 1401 2000 4 2001 3000 5 3001 9999 ``` ``` SQL> select * 2 from emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM ---------- ---------- --------- ---------- --------- ---------- ---------- DEPTNO ---------- 7839 KING PRESIDENT 17-NOV-81 5000 10 7698 BLAKE MANAGER 7839 01-MAY-81 2850 30 7782 CLARK MANAGER 7839 09-JUN-81 2450 10 EMPNO ENAME JOB MGR HIREDATE SAL COMM ---------- ---------- --------- ---------- --------- ---------- ---------- DEPTNO ---------- 7566 JONES MANAGER 7839 02-APR-81 3000 20 7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30 7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 EMPNO ENAME JOB MGR HIREDATE SAL COMM ---------- ---------- --------- ---------- --------- ---------- ---------- DEPTNO ---------- 7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30 7900 JAMES CLERK 7698 03-DEC-81 950 30 7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30 EMPNO ENAME JOB MGR HIREDATE SAL COMM ---------- ---------- --------- ---------- --------- ---------- ---------- DEPTNO ---------- 7902 FORD ANALYST 7566 03-DEC-81 3000 20 7369 SMITH CLERK 7902 17-DEC-80 800 20 7788 SCOTT ANALYST 7566 09-DEC-82 3000 20 EMPNO ENAME JOB MGR HIREDATE SAL COMM ---------- ---------- --------- ---------- --------- ---------- ---------- DEPTNO ---------- 7876 ADAMS CLERK 7788 12-JAN-83 1100 20 7934 MILLER CLERK 7782 23-JAN-82 1300 10 1456 John Smith Analyst 7566 01-JAN-02 3000 20 15 rows selected. ``` 正解のSQL文とテーブルは下記のようになるようなのですが わからない点が4点ほどあります。 ご存知でしたらお伺いできますと幸いです。 1 どのように給料グレード(grade)を部署のテーブルに結合して 表示しているのか。 where句では従業員テーブルと部署テーブルのみが内部結合で 紐づけられているように見えます。 WHERE d.deptno=e.deptno 2そもそもこの方法は結合なのでしょうか。 3having句がこの時、どのような操作の為にあるのかよくわかりません。。 4group by句に以下の5つのカラムを含めないといけないことは 文法上の制約なのでわかるのですが これがどのような動作を与えるのか イメージがつきません。 GROUP BY d.deptno,d.dname,s.grade,s.losal,s.hisal ``` SQL> SELECT d.dname,s.grade,MIN(e.sal) "Min Sal",AVG(NVL(e.comm,0)) "AVG Comm" FROM emp e,dept d,salgrade s WHERE d.deptno=e.deptno GROUP BY d.deptno,d.dname,s.grade,s.losal,s.hisal HAVING MIN(e.sal) BETWEEN s.losal AND s.hisal; DNAME GRADE Min Sal AVG Comm -------------- ---------- ---------- ---------- SALES 1 950 366.666667 ACCOUNTING 2 1300 0 RESEARCH 1 800 0 ``` テーブルの表がずれてしまっていて申し訳ございません。
回答: > > 1 どのように給料グレード(grade)を部署のテーブルに結合して表示しているのか。 > > 2そもそもこの方法は結合なのでしょうか。 > > > from句で,で区切られているものは直積(クロス結合)と言い総当たりで結合されます。 DBMSによってはcross join として記述できるものもあります。 > > 3having句がこの時、どのような操作の為にあるのかよくわかりません。。 > > > where → group by → having → select という実行順序で処理が行われると考えてください。 havingはgroup by 後の条件節です。 min()を条件にしているので、group by の後の条件である必要があり、havingで指定しています。 > > 4group by句に以下の5つのカラムを含めないといけないことは文法上の制約なのでわかるのですが > > これがどのような動作を与えるのかイメージがつきません。 > > > 文法上の制約ではありません。明確な集計の単位です。 salgradeの項目は集計結果には関係していませんが、havingの条件に含まれていますから。