[Java 풀스택 과정 강의] 2월 11일

부트캠프 일지/Java 풀스택 과정 강의
2026.02.21
※ TIL와는 별개로 적는 개인 개발 일지라서 말은 좀 편하게하는 페이지입니다.
일지이기 때문에 일기의 성격이 더 강합니다.

 

 

SUBQUERY

10일에 이은 subquery 관련이다.

 

EXISTS/NOT EXISTS

EXISTS 및 NOT EXISTS는 서브 쿼리의 결과에 따라 true와 false를 반환한다. EXISTS는 한 건이라도 존재할 경우 true를, NOT EXISTS는 한 건도 존재하지 않을 경우 true를 반환한다.

 

IN과 비슷해보이지만, IN과 다르게 NULL인 레코드도 TRUE로 반환한다.

아래와 같이 사용한다.

 

SELECT *
FROM [테이블A]
WHERE EXISTS (SELECT *
              FROM [테이블 B]
              WHERE [테이블A].컬럼 = [테이블B].컬럼);

 

 

ALL/ANY

관계 연산자 뒤에 위치하여 사용한다.

ALL의 경우 검색 조건이 서브 쿼리의 결과의 모든 값에 만족하면 true를 반환한다. ANY의 경우 하나 이상이라도 만족하면 true를 반환한다.

아래처럼 사용한다.

 

SELECT *
    FROM [테이블A]
    WHERE [조건 컬럼] > ALL(SELECT [조건 컬럼] FROM [테이블] WHERE [조건절]);
    
SELECT *
    FROM [테이블A]
    WHERE [조건 컬럼] > ANY(SELECT [조건 컬럼] FROM [테이블] WHERE [조건절]);

 

테이블은 테이블A일수도, 다른 테이블일 수도 있다.

 

SUBQUERY 유형

SUBQUERY 유형 관련 정리다.

 

스칼라 서브 쿼리(Scholar Subquery)

SELECT 절에서 주로 사용한다. 스칼라란 한 번에 한 가지만 처리한다는 뜻이다. 따라서 한 행만 반환될 수 있어야 한다. 다음과 같이 사용한다.

 

SELECT [테이블A].*,
       (SELECT [테이블B].컬럼
        FROM [테이블B]
        WHERE [테이블A].컬럼 = [테이블B].컬럼) AS 서브컬럼
FROM [테이블A];

 

 

인라인뷰 서브쿼리 (Inline-view Subquery)

FROM 절에서 주로 사용한다. 하나의 임시 테이블을 사용하는 느낌의 가상의 뷰를 제공한다. 다중행이나 다중 열이어도 상관없다. 다음과 같이 사용된다.

SELECT *
FROM (SELECT *
      FROM [테이블A]
      WHERE [테이블A].조건컬럼 = '값') AS 인라인뷰
WHERE 인라인뷰.컬럼 = '추가조건';

 

ORACLE 내장함수

이어서 ORACLE 내장 함수를 확인했다.

 

 

ROUND

javascript 등에서도 자주 사용되는 반올림 함수. 여기서는 ROUND(값, 자리수)로 사용할 수 있다. 자리수가 음수일 경우, 소수점 왼쪽부터 세고, 양수라면 소수점 오른쪽부터 센다.

 

 

문자함수

문자함수다. 여기에서 사용되는 것들은 컬럼명이 아닌 문자열 자체도 사용이 가능하다. 이 경우 작은 따옴표를 양옆에 붙여야 한다.(ex: '문자열')

 

REPLACE()

문자열을 치환하는 함수다. REPLACE(컬럼명, 찾을 값, 바꿀 값)처럼 사용한다.

LENGTH()

글자수를 반환하는 함수이다. LENGTH(컬럼명)처럼 사용한다.

 

LENGTHB()

바이트 수를 반환하는 함수이다. LENGTHB(컬럼명)처럼 사용한다.

 

SUBSTR()

문자열을 자르는 함수. 지정한 길이만큼의 문자열을 반환한다. SUBSTR(컬럼명, 시작 위치, 길이)처럼 사용한다.

 

CONCAT()

문자열을 연결한다. CONCAT(컬럼명, '연결자')처럼 사용한다. 혹은 문자열 || 사용으로도 연결이 가능.

 

 

LOWER() / UPPER() / INITCAP()

알파벳의 대소문자를 조정하는 함수. lower라면 소문자로, upper라면 대문자로, initcap이라면 맨 앞글자를 대문자로 나타내게 한다.

 

 

INSTR

문자열에서 지정된 문자열 검색해서 첫번째로 위치한 위치를 반환한다. indexOf 같은 것.

SELECT INSTR(컬럼명, 검색할 문자열, 찾기를 시작할 위치(1,-1), 찾은 결과의 순번(1...n)) 형태로 사용한다. 뒤 두가지는 옵션 형태이며, 못 찾으면 0을 반환한다.

 

 

TRIM()

해당 문자열의 앞뒤 공백을 지운다. TRIM(컬럼명) 형태로 사용한다. 공백 아닌 다른 문자 제거도 가능하는데, 이 경우

TRIM(BOTH/LEADING/TRAILING 문자열 FROM 컬럼명) 형태로 사용한다. BOTH는 문자열의 앞뒤 양쪽, LEADING은 앞쪽만, TRAILING은 뒷쪽만 삭제한다는 것이다.

 

 

DATE 함수

SYSDATE

데이터베이스 서버의 현재 날짜/시간을 출력한다. DB 서버에 따라서 달라진다.

 

CURRENT_DATE

현재 세션의 날짜/시간을 출력한다. 세션 타임존 설정을 기준으로 한다

 

ADD_MONTHS

달 단위로 경과를 추가 감소할 수 있다. ADD_MONTHS(날짜, 경과일)처럼 사용한다. 1이라면 1달 후, -1이라면 1달 전이 된다.

 

EXTRACT

날짜 데이터에서 년,월,일을 추출한다. EXTRACT(옵션 FROM 날짜)처럼 사용한다. 이 옵션에는 YEAR, MONTH, DAY 등이 포함된다.

 

 

CURRENT_TIMESTAMP

현제 세션의 현재 시간을 출력한다.

 

TO_CHAR()

날짜/숫자를 문자로 사용할때 쓰는 함수이다. TO_CHAR(값, '형식') 형태로 사용한다. 날짜일 경우, TO_CHAR(SYSDATE, 'YYYY-MM-DD') 이런 식으로 사용할 수 있다.

 

 

데이터 정리 함수

순위 검색 함수

RANK()

값의 순위를 반환한다. 동일 값이 있으면 다음 순위는 동일값 만큼의 수가 증가한다. 즉, 1등 2등 2등 4등 이렇게 된다는 의미.

 

SELECT 컬럼명
RANK() OVER (ORDER BY 컬럼명 DESC)
FROM 테이블;

 

DENSE RANK()

값의 순위를 반환한다. 동일 값이 있어도 다음 순위는 1 증가한다. 즉, 1등 2등 2등 3등 이렇게 된다는 의미.

 

RANK()와 같은 사용법이다.

 

 

ROW_NUMBER()

행번호를 출력해준다. 사용은 RANK() 와 같다.

 

 

ROWNUM

위에서 아래로 몇개만 잘라 나타낼때 사용한다. BETWEEN과 같이 사용. 아래처럼 쓴다.

SELECT ROWNUM, 컬럼명
FROM 테이블명
WHERE ROWNUM BETWEEN 시작숫자 AND 끝숫자;

 

 

 

그룹 요약 함수

그룹의 소계 등을 요약한다.

 

ROLLUP()

그룹의 소계와 총계를 산출한다.

컬럼 순서에서 맨 앞에 위치한 것부터 차례대로 산출한다.

 

SELECT 부서,
       직급,
       SUM(급여) AS 급여합계
FROM 사원
GROUP BY ROLLUP(부서, 직급);

 

 

CUBE()

각 그룹의 모든 경우의 수에 대한 소계와 총계를 산출한다.

항목들간 다차원적인 소계를 계산하며, ROLLUP과 다르게 컬럼 순서가 중요하지 않다.

 

SELECT 부서,
       직급,
       SUM(급여) AS 급여합계
FROM 사원
GROUP BY CUBE(부서, 직급);

 

 

GROUPING SETS()

특정 항목에 대한 소계를 산출한다. 총계는 산출되지 않는다.

SELECT 부서,
       직급,
       SUM(급여) AS 급여합계
FROM 사원
GROUP BY GROUPING SETS(부서, 직급);

 

 

PIVOT()

ROW였던 단위를 COLUMN 단위로 변경한다. 특정 열의 값을 기준으로 데이터를 재배치하고자 할 때 사용한다.

 

SELECT *
FROM 테이블
PIVOT ( 집계함수(집계대상컬럼)
        FOR 피벗대상컬럼
        IN (값1, 값2, 값3) );