프로젝트 링크 : https://github.com/yesaroun/MoneyLog GitHub - yesaroun/MoneyLog Contribute to yesaroun/MoneyLog development by creating an account on GitHub. github.com 1년 전에 spring 기반의 가계부를 구현하는 프로젝트를 진행했었습니다. 이 프로젝트를 통해서 DB 설계와 정규화를 직접 구현해 볼 수 있었습니다. 전체적인 ERD 구조는 위와 같습니다. 하나씩 구체적으로 살펴보면서 설계한 이유를 적어보겠습니다. 이용자 식별 코드 '이용자식별' 테이블을 만들었습니다. 이렇게 설계한 이유는 후술할 탈퇴 계정과 추가회원정보와 연관이 깊습니다. 저희 서비스는 회원의 정보를 활용한 통계 자..
ROW_NUMBER PARTITION 내에서 ORDER BY절에 의해 정렬된 순서를 기준으로 고유한 값을 반환 e.g. SELECT ROW_NUMBER() OVER(ORDER BY SAL DESC) "테스트" , ENAME "사원명", SAL "급여", HIREDATE "입사일" FROM EMP; --==>> /* 1KING50001981-11-17 2FORD30001981-12-03 3SCOTT30001987-07-13 4JONES29751981-04-02 5BLAKE28501981-05-01 6CLARK24501981-06-09 7ALLEN16001981-02-20 8TURNER15001981-09-08 9MILLER13001982-01-23 10WARD12501981-02-22 11MARTIN125..
그룹 함수는 2LEVEL 까지 중첩해서 사용할 수 있다. MSSQL은 이마저도 불가능하다. 그룹 함수를 중첩 SELECT MAX(SUM(SAL)) FROM EMP GROUP BY DEPTNO; --==>> 10875 RANK(), DENSE_RANK() → ORACLE 9i 부터 적용, MSSQL 2005부터 적용 하위 버전에서는 RANK() 나 DENSE_RANK()를 사용할 수 없다 만약 이전 버전에서 순위를 구하려면 다음과 같이 해야 한다. 만약 급여 순위를 구하고자 한다면 해당 사원의 급여보다 더 큰 값이 몇 개인지를 확인한 후 확인한 값에 +1을 추가 연산해 주면 그 값이 곧 해당 사원의 급여 등수가 된다. SELECT * FROM EMP; -- 급여 확인 -- SMITH 급여 등수 확인 SEL..
HAVING EMP 테이블에서 부서번호가 20, 30 인 부서를 대상으로 부서의 총 급여가 10000 보다 적을 경우만 부서별 총 급여를 조회한다. SELECT DEPTNO, SUM(SAL) FROM EMP WHERE DEPTNO IN (20, 30) AND SUM(SAL) > 에러 발생 -- ORA-00934: group function is not allowed here -- (GROUP 함수를 일반 WHERE에서 쓸 수 없어서 생기는 오류) -- 1 SELECT DEPTNO, SUM(SAL) FROM EMP WHERE DEPTNO IN (20, 30) GROUP BY DEPTNO HAVING SUM(SAL) > 30 94..
CUBE() ROLLUP()보다 더 디테일한 결과 반환 SELECT DEPTNO, JOB, SUM(SAL) FROM EMP GROUP BY CUBE(DEPTNO, JOB) ORDER BY 1, 2; --==>> /* 10 CLERK 1300 10 MANAGER 2450 10 PRESIDENT 5000 10 (null) 8750 20 ANALYST 6000 20 CLERK 1900 20 MANAGER 2975 20 (null) 10875 30 CLERK 950 30 MANAGER 2850 30 SALESMAN 5600 30 (null) 9400 (null)ANALYST 6000 -- 모든 부서 ANALYST 직종의 급여합 (null)CLERK 4150 -- 모든 부서 CLERK 직종의 급여합 (null)M..
ROLLUP 총합 SELECT DEPTNO "부서번호", SUM(SAL) "급여합" FROM TBL_EMP GROUP BY ROLLUP(DEPTNO); --==>> /* 10 8750 2010875 30 9400 (null) 8700 -- 부서번호를 갖지 못한 직원들의 급여합 (null)37725 -- 모든부서 직원들의 급여합 */ -- TBL_EMP의 경우 DEPTNO이 NULL인 경우가 포함되어 있다. SELECT NVL2(DEPTNO, TO_CHAR(DEPTNO), '모든부서') "부서번호", SUM(SAL) "급여합" FROM EMP GROUP BY ROLLUP(DEPTNO); --==>> /* 108750 2010875 309400 모든부서29025 */ -- EMP의 경우 DEPTNO가 NUL..