본문 바로가기

Programming/DB

[Mysql] rollup과 join 사용연습하기!

거의 오라클 10g 아니면 apmsetup phpAdmin만 사용해봤던지라...

HeidiSQL은 뭔가 불안함.. 똑같은 mysql 쓰는건데도... 왠지 내가 막 실수할꺼같움..ㅠ.ㅠ

어쨋든 학원에서 배웠었던 join 함수나 distinct 등등...

다 까먹었다..............


그래서 오늘은 하루종일 쿼리문만 쳐다보고 있었다ㅠ.ㅠ

관리자사이트 php 페이지에 있는 쿼리문들을 이해하기 위해서 기초적인 것들부터 파다보니

그냥 간단하게 예제 db를 만들어서 쿼리문들도 날려보자 싶어서 오라클클럽(http://www.oracleclub.com/)에 나오는 자료를 참고했다.


일단, professor 라는 테이블을 생성 후 레코드 입력. (콘솔창에서 할려니깐 하나하나 insert into 다하느라 노가다ㅠㅠ)


mysql> select * from professor;

+-------+--------+-----------+------+--------+

| empno | ename  | job       | sal  | deptno |

+-------+--------+-----------+------+--------+

|  7369 | smith  | clerk     |  800 |     20 |

|  7499 | allen  | sales     | 1600 |     30 |

|  7521 | ward   | sales     | 1250 |     30 |

|  7566 | jones  | manager   | 2975 |     20 |

|  7654 | martin | sales     | 1250 |     30 |

|  7698 | blake  | manager   | 2850 |     30 |

|  7782 | clark  | manager   | 2450 |     10 |

|  7839 | king   | president | 5000 |     10 |

|  7844 | turner | sales     | 1500 |     30 |

|  7900 | james  | clerk     |  950 |     30 |

|  7902 | ford   | analyst   | 3000 |     20 |

|  7934 | miller | clerk     | 1300 |     10 |

+-------+--------+-----------+------+--------+

12 rows in set (0.00 sec)


간단하게 입력된 값으로 group by와 rollup을 연습해 보았다.

처음엔 오라클클럽에 있는 내용을 보고 연습해볼려고 했더니 mysql이랑 오라클의 rollup 사용방법이 다르....

다는걸 몇번이고 에러를 띄우고나서야 느꼈다.ㅋㅋㅋㅋㅋ


오라클에서는,


GROUP BY deptno, ROLLUP(empno);


위와 같이 rollup을 쓸 수 있지만


mysql의 경우에는,


GROUP BY deptno,empno WITH ROLLUP;


위와 같이 with rollup과 같은 형태로 사용이 된다고.....


그래서 부서번호를 기준으로 사원들의 급여를 정렬하기 위해서는


mysql> select deptno, empno, ename, sum(sal) sal from professor group by deptno, empno with rollup;

+--------+-------+--------+-------+

| deptno | empno | ename  | sal   |

+--------+-------+--------+-------+

|     10 |  7782 | clark  |  2450 |

|     10 |  7839 | king   |  5000 |

|     10 |  7934 | miller |  1300 |

|     10 |  NULL | miller |  8750 |

|     20 |  7369 | smith  |   800 |

|     20 |  7566 | jones  |  2975 |

|     20 |  7902 | ford   |  3000 |

|     20 |  NULL | ford   |  6775 |

|     30 |  7499 | allen  |  1600 |

|     30 |  7521 | ward   |  1250 |

|     30 |  7654 | martin |  1250 |

|     30 |  7698 | blake  |  2850 |

|     30 |  7844 | turner |  1500 |

|     30 |  7900 | james  |   950 |

|     30 |  NULL | james  |  9400 |

|   NULL |  NULL | james  | 24925 |

+--------+-------+--------+-------+

16 rows in set (0.00 sec)


요런 형태로 쿼리문을 날려야한다.

그런데 이 형태에서 급여의 합이 나오는 라인의 ename값이 empno와 같이 null값이 안나오고 왜 하위에 있는 값과 똑같이 뜨는지는...

계속 찾아보고있다=.=..ㅋㅋㅋㅋㅋㅋ

그리고 맨 마지막 라인에 모든 사원들의 총 급여합이 안나오게 하는 방법도....

따로 이중쿼리문을 써야하는 것 같은데.. 머리가 나쁜 나는 이중쿼리문을 생각할려니 머리가 안돌아가서...

이것도 천천~히 생각해 보기로함.ㅋㅋㅋㅋㅋ(완전 내맘대로임)


그리고나서 join 함수에 대해서도 연습을 해보고 싶어서 또 다른 테이블을 하나 더 생성!


mysql> select * from emp;

+-------+------+----------+

| empno | mgr  | hiredate |

+-------+------+----------+

|  7369 | 7902 | 80/12/17 |

|  7499 | 7698 | 81/02/20 |

|  7521 | 7698 | 81/02/22 |

|  7566 | 7839 | 81/04/02 |

|  7654 | 7698 | 81/09/28 |

|  7698 | 7839 | 81/05/01 |

|  7782 | 7839 | 81/06/09 |

|  7839 | NULL | 81/11/17 |

|  7844 | 7698 | 81/09/08 |

|  7900 | 7698 | 81/12/03 |

|  7902 | 7566 | 81/12/03 |

|  7934 | 7782 | 82/01/23 |

+-------+------+----------+

12 rows in set (0.00 sec)


공통된 empno를 기준으로 두 테이블에서 사원들의 사원들의 이름과 부서, 입사일과 MGR을 출력하려면 join을 써야한다.





이런식으로?