본문 바로가기

문돌이 존버/DB 및 SQL 스터디

SQLD RANK(), PARTITION BY, EXISTS(), LPAD() 예제

반응형

1. 윈도우 함수(Window Function): 여러 행 간의 관계 정의 함수, 중첩 불가

RANK(): 중복 순위 포함
SELECT cost_center, RANK() OVER (ORDER BY cost_center DESC) AS rk
FROM employees;

DENSE_RANK(): 중복 순위 무시
SELECT cost_center, DENSE_RANK() OVER (ORDER BY cost_center DESC) AS rk
FROM employees;

2. 윈도우 함수 문법

PARTITION BY: 그룹핑 기준
SELECT deptno, ename, sal, 
RANK() OVER (PARTITION BY deptno ORDER BY sal DESC ) as rk 
FROM emp ;

3. 서브쿼리 다중행 비교 연산자

WHERE EXISTS: 서브쿼리의 결과를 만족하는 값이 존재하는지 여부를 확인하는 조건

상관 서브쿼리의 칼럼을 테이블 별칭으로 한정하지 않으면, 서브쿼리 테이블의 칼럼을 우선적으로 검색한다. 즉 아래에서 dname은 dept 테이블의 dname 컬럼이라고 인식하게 된다. 따라서 X.dname = dname 조건은 항상 True기 때문에 emp 테이블의 전체 행이 반환된다. 

SELECT *
FROM emp A
WHERE EXISTS (SELECT 1
              FROM dept X
              WHERE X.dname = dname);
              
# 서브쿼리의 SELECT 1은 단순히 값이 존재하는지를 알려주는 지표일뿐, 숫자 1은 아무 의미가 없다
# 1 대신 0, 2 등으로 해도 무방하다

4. LPAD(), RPAD() 함수

LPAD: 지정한 길이만큼 왼쪽부터 특정한 문자로 채운다

LPAD("값", "총 문자길이", "채움문자") 

SELECT empno
     ,ename
     ,deptno
     ,LPAD(deptno, 5)      --1 # 채움문자를 지정하지 않으면 디폴트값은 공백
     ,LPAD(deptno, 5, ' ') --2
     ,LPAD(deptno, 5, '0') --3
     ,LPAD(deptno, 5, 'A') --4
  FROM emp;

RPAD: 지정한 길이만큼 오른쪽부터 특정한 문자로 채운다

RPAD("값", "총 문자길이", "채움문자") 

SELECT empno
     ,ename
     ,deptno
     ,RPAD(deptno, 5)      --1 
     ,RPAD(deptno, 5, ' ') --2
     ,RPAD(deptno, 5, '0') --3
     ,RPAD(deptno, 5, 'A') --4
  FROM emp;

728x90
반응형