데이터베이스 45

오라클 SQL과 PL/SQL ( JOIN의 이해 )

JOIN 관계형 데이터베이스에서 가장 핵심적인 기능인 join에 대해서 배워보겠습니다. JOIN에 대해서 이야기를 하기 전에 컴퓨터의 원리부터 먼저 이야기를 해야합니다. ORACLE뿐만 아니라 모든 프로그램들이 컴퓨터에서 작동하는 것이기에 컴퓨터의 원리를 아는 것이 프로그램의 원리를 이해하는 데 큰 도움이 됩니다. 대부분의 컴퓨터는 사용자의 데이터를 디스크에 저장해놓고 필요할때 마다 메모리로 복사를 해와서 메모리에서 작업을 합니다. 그리고 작업 도중이나 끝나면 다시 디스크에 저장을 합니다. 즉 메모리는 작업을 하는 공간이고 디스크는 저장을 하는 공간입니다. ORACLE도 컴퓨터에서 동작하는 프로그램이라서 동일한 원리로 작동합니다. 평소에는 데이터들을 하드디스크에 저장해 놓고 필요할 때마다 메모리로 복사해..

오라클 SQL과 PL/SQL ( 누계 / 비율 / 차이 구하기 )

SUM() OVER을 활용한 누계 구하기 사용 예1. PANMAE 테이블을 사용하여 1000번 대리점의 판매 내역을 출력하되 판매일자, 제품코드, 판매량, 누적 판매금액을 아래와 같이 출력하세요. SELECT P_DATE, P_CODE, P_QTY , P_TOTAL, SUM(P_TOTAL) OVER(ORDER BY P_TOTAL) "TOTAL" FROM PANMAE WHERE P_STORE = 1000; 사용 예2. PANMAE 테이블을 사용하여 1000번 대리점의 판매 내역을 제품 코드별로 분류한 후 판매일자, 제품코드, 판매량, 판매금액, 누적판매금액을 아래와 같이 출력하세요. SELECT P_DATE, P_CODE, P_QTY , P_TOTAL, SUM(P_TOTAL) OVER(PARTITION B..

오라클 SQL과 PL/SQL ( 랭킹/순위 함수)

RANK() 함수 - 순위출력함수 RANK함수는 주어진 컬럼 값의 그룹에서 값의 순위를 계산한 후 순위를 출력해 줍니다. 같은 순위를 가지는 순위 기준에 대해서는 같은 출력 값을 가지기 때문에 RANK함수의 출력결과가 연속하지 않을 경우가 있습니다. 이 함수는 TOP-N 과 BOTTOM-N 등 순위를 출력하는 리포팅 작업에 아주 유용하게 사용할 수 있습니다. 이 함수는 특정 데이터의 순위만 볼 수도있고 전체 데이터의 순위를 다 볼 수도 있는데, 두 가지의 경우 문법이 약간 다릅니다. 예제로 확인해보겠습니다. 특정 데이터의 순위 확인하기 RANK(조건값) WITHIN GROUP (ORDER BY 조건값 컬럼명 [ASC | DESC] ) SELECT ENAME FROM EMP ORDER BY ENAME; S..

오라클 SQL과 PL/SQL ( UNPIVOT / LAG / LEAD 함수)

UNPIVOT() 함수 UNPIVOT 테이블은 PIVOT와 반대의 개념으로 합쳐있는 것을 풀어서 보여주는 역할을 합니다. 테스트를 위해 아래와 같이 테이블을 생성하겠습니다. CREATE TABLE UPIVOT AS SELECT * FROM (SELECT DEPTNO, JOB, EMPNO FROM EMP) PIVOT ( COUNT(EMPNO) FOR JOB IN ('CLERK' AS "CELRK", 'MANAGER' AS "MANAGER", 'PRESIDENT' AS "PRESIDENT", 'ANALYST' AS "ANALYST", 'SALESMAN' AS "SALESMAN") ); SELECT * FROM UPIVOT; 이제 UNPIVOT로 합쳐진 결과를 풀어보겠습니다. SELECT * FROM UPIV..

오라클 SQL과 PL/SQL ( PIVOT / 달력만들기 )

PIVOT()함수 / 11g에서 추가 PIVOT 함수는 ROW 단위를 COLUMN 단위로 변경해 주고 UNPIVOT 함수는 반대로 COLUMN 단위를 ROW단위로 변경해 주는 기능을 합니다. CAL테이블로 설명하겠습니다. 이 CAL테이블로 달력을 만들어 보겠습니다. 1. PIVOT를 사용하지 않고 DECODE 함수를 활용하여 달력만들기 SELECT MAX(DECODE(DAY, 'SUN', DAYNO)) SUN, MAX(DECODE(DAY, 'MON', DAYNO)) MON, MAX(DECODE(DAY, 'TUE', DAYNO)) TUE, MAX(DECODE(DAY, 'WED', DAYNO)) WED, MAX(DECODE(DAY, 'THU', DAYNO)) THU, MAX(DECODE(DAY, 'FRI',..

오라클 SQL과 PL/SQL ( GROUPING SETS / LISTAGG )

GROUPING SETS() 함수 이 함수는 그룹핑 조건이 여러 개일 경우 아주 유용하게 사용될 수 있습니다. 예를 들어 STUDENT테이블에서 학년별로 학생들의 인원수 합계와 학과별로 인원수의 합계를 구해야 하는 경우에 기존에는 학년별 인원수 합계를 구하고 별도로 학과별로 인원수 합계를 구한 후 UNION 연산을 해야만 했습니다. SELECT GRADE, COUNT(*) FROM STUDENT GROUP BY GRADE UNION SELECT DEPTNO1, COUNT(*) FROM STUDENT GROUP BY DEPTNO1; SELECT GRADE, DEPTNO1, COUNT(*) FROM STUDENT GROUP BY GROUPING SETS (GRADE, DEPTNO1); 위 그림에서 첫번째 화..

오라클 SQL과 PL/SQL ( CUBE() 함수 / 분석함수 - 2 )

1. CUBE() : 소계와 전체 합계까지 출력하는 함수 CUBE() 함수는 ROLLUP() 함수와 같이 각 소계도 출력하고 추가로 전체 총계까지 출력합니다. 대신 추가로 전체합계까지 보여주기 때문에 집계 컬럼들이 가질 수 있는 모든 경우에 대하여 소계를 생성해야 하므로 ROLLUP() 함수에 비해 시스템 리소스를 더 사용합니다. CUBE() 는 집계컬럼들의 모든 경우에 대한 소계를 구하므로 순서가 바뀌어도 데이터는 같습니다. 만약 보서별 평균 급여와 사원 수, 직급별 평균 급여와 사원 수, 부서와 직급별 평균 급여와 사원 수, 전체 평균 월 급여와 사원수를 구하시오 라는 문제가 주어진다면 1. 부서별 평균 급여와 사원 수 2. 직급별 평균 급여와 사원 수 3. 부서와 직급별 평균 급여와 사원 수 4. ..

오라클 SQL과 PL/SQL ( ROLLUP 함수 / 분석함수 - 1 )

분석 함수 기존 관계형 데이터베이스는 컬럼끼리의 연산, 비교, 집계 등을 앞에서 살펴본 그룹 함수들을 사용해서 쉽게 할 수 있었지만, 행끼리비교 연산하는 것을 하나의 SQL로 처리하는게 힘들었습니다. 만약 그런 작업들을 해야 할 경우가 생기면 PL/SQL과 같은 절차형 프로그램을 작성하거나 아주 복잡한 SQL문을 작성해야 했습니다. 그러나 오라클 버전이 올라가면서 행끼리의 연산이나 비교를 쉽게 지원해주기 위한 함수를 제공하게 되었는데 이 함수를 분석함수(ANALYTIC FUNCTION) 또는 윈도함수(WINDOW FUNCTION) 라고 합니다. 분석 함수를 잘 활용한다면 복잡한 로직을 비교적 간단한 SQL문장으로 해결할 수 있습니다. 1. 각 기준별 소계를 요약해서 보여 주는 ROLLUP() 함수 많은 ..

오라클 SQL과 PL/SQL ( GROUP BY / HAVING )

GROUP BY / 특정 조건으로 세부적인 그룹화 하기 특정 조건을 주고 해당 조건에 맞는 결과들을 모아서 조금 더 구체적인 결과를 만드는건 GROUP BY를 사용합니다. SELECT DEPTNO, AVG(NVL(SAL, 0)) "AVG" FROM EMP GROUP BY DEPTNO; 위 예제는 EMP 테이블을 조회하여 부서별로 평균 급여 금액을 구하는 예제입니다. 위 처럼 세부적인 그루핑을 하고싶으면 GROUP BY절에 해당컬럼명을 적으면 됩니다. 위 내용은 전체의 평균 급여를 구하는 것이 아니라 각 학과별로 평균 급여를 조회하는 것이므로 대상 데이터를 전부 읽은 후 GROUP BY절에 적혀있는 컬럼인 DEPTNO로 분류합니다. 그 후 DEPTNO별로 급여를 계산해서 결과를 출력 했습니다. GROUP ..

오라클 SQL과 PL/SQL ( 복수행 함수(그룹 함수) )

1. GROUP 함수의 종류 SQL 복수행 함수는 단일행 함수와 달리 한꺼번에 여러건의 데이터가 함수로 입력됩니다. 하지만 사용방법은 일반함수와 비슷합니다. 모든 그룹 함수에서 중요한 부분은 NULL 값의 포함여부입니다. 거의 대부분 그룹 함수는 함수에 *를 사용하면 NULL을 포함하고 컬럼이름을 쓰면 해당 컬럼에 데이터가 있는 경우 즉 NULL을 제외하고 작업을 해서 출력하게 됩니다. 주로 사용하는 그룹 함수들을 아래와 같습니다. 1) COUNT() 함수 / 입력되는 데이터의 총 건수를 반환 합니다. SELECT COUNT(*), COUNT(COMM) FROM EMP; COUNT(*)는 NULL 포함 COUNT(COMM) 는 NULL 미포함 2) SUM() 함수 / 입력된 데이터들의 합계를 구하는 함수..

728x90