부트캠프

내가 보려고 만든 SQLD 정리

Yuuma 2026. 5. 28. 01:05

SQL 2과목 총정리

 

SQL문이 데이터베이스에서 “무엇을 대상으로 어떤 작업을 하느냐”에 따라 나눈 것

DDL 데이터베이스 구조를 다룸 테이블, 뷰, 인덱스 등을 생성/수정/삭제 CREATE, ALTER, DROP, TRUNCATE
DML 테이블 안의 데이터를 다룸 데이터를 조회/삽입/수정/삭제 SELECT, INSERT, UPDATE, DELETE
DCL 사용자 권한을 다룸 권한 부여/회수 GRANT, REVOKE
TCL 트랜잭션을 다룸 변경사항 확정/취소 COMMIT, ROLLBACK, SAVEPOINT

예를 들어서 엑셀로 비유하면:

  • DDL: 엑셀 파일의 시트 구조 만들기
    → 열 추가, 표 만들기, 표 삭제하기
  • DML: 표 안의 실제 값 수정하기
    → 행 추가, 값 변경, 데이터 삭제, 조회
  • DCL: 누가 이 파일을 볼 수 있고 수정할 수 있는지 정하기
    → 편집 권한 주기/빼기
  • TCL: 작업한 내용을 저장할지 되돌릴지 정하기
    → 저장하기, 실행 취소하기

관계대수 연산자

순수 관계 연산자 SELECT σ 조건에 맞는 선택 WHERE
순수 관계 연산자 PROJECT π 원하는 선택 SELECT 컬럼명
순수 관계 연산자 JOIN 두 릴레이션을 조건에 맞게 연결 JOIN
순수 관계 연산자 DIVIDE ÷ 모든 조건을 만족하는 데이터 검색 NOT EXISTS, GROUP BY HAVING 등
일반 집합 연산자 UNION 합집합 UNION
일반 집합 연산자 INTERSECTION 교집합 INTERSECT
일반 집합 연산자 DIFFERENCE 차집합 MINUS, EXCEPT
일반 집합 연산자 CARTESIAN PRODUCT × 가능한 모든 조합 CROSS JOIN

 

SELECT 절

SELECT DISTINCT 사용 시, 중복을 제거하고 유일 값을 선택한다.

* WHERE은 튜플(행)을 필터링하고, SELECT는 속성(열)을 필터링한다.

 

* Oracle에서의 CONCAT은 ||, SQL Server에서의 CONCAT은 +

 

문자함수 정리

LOWER(문자) 문자를 소문자로 변환한다. LOWER('SQLD') 'sqld'
UPPER(문자) 문자를 대문자로 변환한다. UPPER('sql') 'SQL'
CONCAT(문자1, 문자2) 두 문자를 연결한다. CONCAT('SQL', 'D') 'SQLD'
SUBSTR(문자, 시작위치, 길이) 문자에서 지정한 위치부터 원하는 길이만큼 추출한다. SUBSTR('DATABASE', 1, 4) 'DATA'
LENGTH(문자) 문자의 길이를 반환한다. LENGTH('SQLD') 4
LTRIM(문자) 왼쪽 공백을 제거한다. LTRIM(' SQL') 'SQL'
RTRIM(문자) 오른쪽 공백을 제거한다. RTRIM('SQL ') 'SQL'
TRIM(문자) 양쪽 공백을 제거한다. TRIM(' SQL ') 'SQL'
REPLACE(문자, 찾을문자, 바꿀문자) 특정 문자를 다른 문자로 바꾼다. REPLACE('2026-05-27', '-', '/') '2026/05/27'
INSTR(문자, 찾을문자) 찾는 문자가 처음 나타나는 위치를 반환한다. INSTR('DATABASE', 'A') 2
ASCII(문자) 문자의 ASCII 코드 값을 반환한다. ASCII('A') 65
CHR(숫자) ASCII 코드 값에 해당하는 문자를 반환한다. CHR(65) 'A'

 

* REGEXP 함수 ex)REGEXP_SUBSTR('ABCD' , '.C') 는 BC

표현식 의미 예시 패턴 매칭 예시
. 아무 문자 1개 A.C ABC, A1C
\ 특수문자를 문자 그대로 인식하게 하는 이스케이프 문자 \. 실제 점 .
^ 문자열 시작 ^A ABC, APPLE
$ 문자열 끝 A$ KOREA, DATA
* 앞 문자가 0개 이상 반복 AB* A, AB, ABB
+ 앞 문자가 1개 이상 반복 AB+ AB, ABB
? 앞 문자가 0개 또는 1개 AB? A, AB
{n} 정확히 n번 반복 A{3} AAA
{n,} n번 이상 반복 A{2,} AA, AAA
{n,m} n번 이상 m번 이하 반복 A{2,4} AA, AAA, AAAA
[ ] 대괄호 안 문자 중 하나 [ABC] A, B, C
[^ ] 대괄호 안 문자를 제외 [^0-9] 숫자가 아닌 문자
| OR 조건 CAT|DOG CAT, DOG
( ) 그룹 묶기 (AB)+ AB, ABAB

 

숫자함수 정리

ABS(숫자) 숫자의 절댓값을 반환한다. ABS(-10) 10
SIGN(숫자) 숫자가 양수, 음수, 0인지 반환한다. SIGN(-10) -1
ROUND(숫자, 자리수) 지정한 자리수까지 반올림한다. ROUND(123.456, 2) 123.46
TRUNC(숫자, 자리수) 지정한 자리수까지 남기고 버린다. TRUNC(123.456, 2) 123.45
CEIL(숫자) 숫자보다 크거나 같은 가장 작은 정수를 반환한다. CEIL(123.1) 124
FLOOR(숫자) 숫자보다 작거나 같은 가장 큰 정수를 반환한다. FLOOR(123.9) 123
MOD(숫자1, 숫자2) 숫자1을 숫자2로 나눈 나머지를 반환한다. MOD(10, 3) 1
POWER(숫자, 제곱값) 숫자의 거듭제곱 값을 반환한다. POWER(2, 3) 8
SQRT(숫자) 숫자의 제곱근을 반환한다. SQRT(9) 3

 

날짜함수 정리

SYSDATE Oracle 현재 날짜와 시간을 반환 SELECT SYSDATE FROM DUAL;
GETDATE() SQL Server 현재 날짜와 시간을 반환 SELECT GETDATE();
날짜 + 1 하루 뒤
날짜 + 2 이틀 뒤
날짜 + 7 일주일 뒤
날짜 + 1/24 1시간 뒤
날짜 + 1/(24*60) 1분 뒤
날짜 + 1/(24*60*60) 1초 뒤

 

1/24는 하루를 24시간으로 나눈 1시간, 1/24*(60/6)은 60분을 6으로 나눈 10분으로 1시간을 나누면? 6분이다.

 

변환함수 정리

TO_CHAR(숫자/날짜, 형식) 숫자 또는 날짜를 문자로 변환 TO_CHAR(SYSDATE, 'YYYY-MM-DD') 현재 날짜를 '2026-05-27' 같은 문자 형식으로 변환
TO_DATE(문자, 형식) 문자를 날짜로 변환 TO_DATE('2026-05-27', 'YYYY-MM-DD') 문자 '2026-05-27'을 날짜 데이터로 변환
TO_NUMBER(문자) 문자를 숫자로 변환 TO_NUMBER('1000') 문자 '1000'을 숫자 1000으로 변환

문자는 연산/비교가 불가능하기 때문에 변환해줘야 한다.

 

집계함수 정리

개수 COUNT(*) COUNT(*) 전체 행의 개수를 센다. NULL 포함 COUNT(*)
개수 COUNT(컬럼명) COUNT(컬럼명) 해당 컬럼의 값 개수를 센다. NULL 제외 COUNT(급여)
합계 SUM(컬럼명) SUM(컬럼명) 합계를 구한다. SUM(급여)
평균 AVG(컬럼명) AVG(컬럼명) 평균을 구한다. NULL 제외 AVG(급여)
최댓값 MAX(컬럼명) MAX(컬럼명) 가장 큰 값을 구한다. MAX(급여)
최솟값 MIN(컬럼명) MIN(컬럼명) 가장 작은 값을 구한다. MIN(급여)

NULL 제외 계산이 원칙이며, WHERE 절에서는 사용할 수 없다.

NULL + 숫자 = NULL 이며, SUM은 NULL을 제외하고 집계한다. 

 

NULL 관련 함수

구분 Oracle SQL Server 설명 사용 예시
NULL 대체 NVL(값, 대체값) ISNULL(값, 대체값) 값이 NULL이면 대체값을 반환 NVL(급여, 0) / ISNULL(급여, 0)
NULL 여부에 따른 처리 NVL2(값, 결과1, 결과2) 없음 값이 NULL이 아니면 결과1, NULL이면 결과2 반환 NVL2(급여, '있음', '없음')
두 값 비교 후 NULL 반환 NULLIF(값1, 값2) NULLIF(값1, 값2) 두 값이 같으면 NULL, 다르면 값1 반환 NULLIF(급여, 0)
첫 번째 NULL 아닌 값 반환 COALESCE(값1, 값2, ...) COALESCE(값1, 값2, ...) 여러 값 중 NULL이 아닌 첫 번째 값을 반환 COALESCE(전화번호, 휴대폰번호, '없음')
NVL Oracle에서 NULL을 다른 값으로 바꿈
ISNULL SQL Server에서 NULL을 다른 값으로 바꿈
NVL2 NULL 여부에 따라 서로 다른 값 반환
NULLIF 두 값이 같으면 NULL 반환
COALESCE 여러 값 중 NULL이 아닌 첫 번째 값 반환

 

CASE 문 / DECODE 함수

구분 Oracle SQL Server 설명 사용 예시
CASE문 CASE WHEN 조건 THEN 결과 ELSE 결과 END CASE WHEN 조건 THEN 결과 ELSE 결과 END 조건에 따라 결과를 다르게 반환 CASE WHEN 점수 >= 60 THEN '합격' ELSE '불합격' END
DECODE 함수 DECODE(값, 비교값1, 결과1, 비교값2, 결과2, 기본값) 없음 값이 비교값과 같으면 해당 결과 반환 DECODE(등급, 'A', '우수', 'B', '보통', '기타')

 

WHERE 절

기본 비교 연산자

비교 항목 Oracle SQL Server
같음 = =
같지 않음 <>, !=, ^= <>, !=
대소 비교 >, <, >=, <= >, <, >=, <=

 

<>는 모든 운영체제에서 지원한다.

 

조건 표현 연산자

연산자 설명 사용 예시 결과/의미
BETWEEN A AND B A 이상 B 이하 범위 조회 WHERE 급여 BETWEEN 3000 AND 5000 3000 이상 5000 이하
IN (값1, 값2, ...) 목록 중 하나와 일치하는 값 조회 WHERE 부서 IN ('영업', '마케팅') 영업 또는 마케팅
LIKE 문자 패턴 검색 WHERE 이름 LIKE '김%' 김으로 시작하는 이름
IS NULL NULL 값 조회 WHERE 급여 IS NULL 급여가 NULL
NOT 조건의 반대 WHERE 부서 NOT IN ('영업') 영업이 아닌 부서

NULL 비교 시, = NULL 혹은 != NULL 의 표현은 오류가 발생한다.

 

* 연산자 우선순위는 괄호() → 비교연산자 → NOT → AND → OR , 이 정도만 알아두면 된다.

 

GROUP BY 절 / HAVING 절

GROUP BY: 특정 컬럼을 기준으로 행들을 그룹화하여 집계함수 결과를 산출

HAVING: 그룹화된 결과에 대한 조건(WHERE은 튜플(행) 단위, HAVING은 그룹단위), 단독 사용도 가능(집계함수 활용)

* WHERE 절에서는 집계 함수 사용이 불가하지만, HAVING 절에서는 사용한다.

 GROUP BY절은 리소스 소모가 크므로, WHERE 절로 먼저 필터링 후 수행하는 것이 성능상 유리하다.

 

ORDER BY절

결과를 정렬할 때 사용

ASC - 오름차순(기본값, 생략 가능), DESC - 내림차순

* SELECT 절보다 나중에 수행되므로 SELECT 절에서 선언된 별칭(ALIAS)사용 가능

  GROUP BY 절보다 나중에 수행되므로 집계함수 사용 가능

 

* Oracle은 NULL을 최댓값으로, SQL Server는 NULL을 최솟값으로 처리한다.

 

JOIN

조건 형태에 따른 분류

JOIN 종류 의미 조건 형태 예시
EQUI JOIN 두 테이블의 컬럼 값이 같을 때 연결 = 사용 A.부서번호 = B.부서번호
NON-EQUI JOIN 두 테이블을 =이 아닌 조건으로 연결 >, <, BETWEEN 등 사용 A.급여 BETWEEN B.최소급여 AND B.최대급여
NATURAL JOIN 이름이 같은 컬럼을 자동으로 찾아 연결 자동 연결 NATURAL JOIN
CROSS JOIN 조건 없이 모든 행을 조합 조건 없음 A CROSS JOIN B

* NATURAL JOIN은 ON/USING 조건절 없이 조인 가능

 

결과에 따른 분류

JOIN 종류 의미 결과 예시
INNER JOIN 조건이 일치하는 행만 조회 양쪽에 모두 있는 데이터 A JOIN B ON A.ID = B.ID
LEFT OUTER JOIN 왼쪽 테이블은 모두 조회 왼쪽 전체 + 오른쪽 일치 데이터 A LEFT JOIN B ON A.ID = B.ID
RIGHT OUTER JOIN 오른쪽 테이블은 모두 조회 오른쪽 전체 + 왼쪽 일치 데이터 A RIGHT JOIN B ON A.ID = B.ID
FULL OUTER JOIN 양쪽 테이블을 모두 조회 양쪽 전체 데이터 A FULL JOIN B ON A.ID = B.ID
SELF JOIN 같은 테이블끼리 조인 자기 자신과 연결 사원 A JOIN 사원 B

LEFT/RIGHT OUTER JOIN은 가져오는 컬럼이 없으면 NULL

 

Oracle 옛날 외부 조인 문법: + 사용

구분 의미 표준 JOIN으로 바꾸면 예시
A.컬럼 = B.컬럼(+) B 테이블에 없는 값도 A 기준으로 조회 A LEFT OUTER JOIN B A는 전부, B는 맞는 것만
A.컬럼(+) = B.컬럼 A 테이블에 없는 값도 B 기준으로 조회 A RIGHT OUTER JOIN B B는 전부, A는 맞는 것만

 

JOIN에서 사용되는 ON/USING

구분 설명 사용 조건 예시
ON 조인할 조건을 직접 작성 컬럼명이 같아도 되고 달라도 됨 ON A.부서번호 = B.DEPTNO
USING 이름이 같은 컬럼을 기준으로 조인 두 테이블의 조인 컬럼명이 같아야 함 USING (부서번호)

 USING은 별칭을 사용하지 않는다.

 

서브쿼리

개념 SQL문 안에 들어가는 또 다른 SELECT문
단일 행 서브쿼리 결과가 1행, =, >, < 등 사용
다중 행 서브쿼리 결과가 여러 행, IN, ANY, ALL, EXISTS 사용
스칼라 서브쿼리 SELECT절에서 하나의 값처럼 사용
인라인 뷰 FROM절에서 테이블처럼 사용
가장 중요 서브쿼리 결과가 1개인지 여러 개인지에 따라 연산자를 다르게 써야 함
구분 기준 종류 의미 예시
행 개수 기준 단일 행 서브쿼리 결과가 1행만 나오는 서브쿼리 평균 급여 1개
행 개수 기준 다중 행 서브쿼리 결과가 여러 행 나오는 서브쿼리 부서번호 여러 개
컬럼 개수 기준 단일 컬럼 서브쿼리 결과 컬럼이 1개인 서브쿼리 급여 컬럼만 반환
컬럼 개수 기준 다중 컬럼 서브쿼리 결과 컬럼이 여러 개인 서브쿼리 부서번호, 직급 반환

 

서브쿼리 연산자

연산자 설명 사용 상황 예시
IN 목록 중 하나와 일치 서브쿼리 결과가 여러 개일 때 WHERE 부서번호 IN (...)
ANY 여러 값 중 하나라도 조건 만족 하나 이상 만족하면 참 WHERE 급여 > ANY (...)
ALL 여러 값 모두 조건 만족 전부 만족해야 참 WHERE 급여 > ALL (...)
EXISTS 서브쿼리 결과 존재 여부 확인 결과가 존재하면 참 WHERE EXISTS (...)

 

집합 연산자

집합 연산자 의미 중복 처리 사용 예시
UNION 두 SELECT 결과를 합침 중복 제거 SELECT 컬럼 FROM A UNION SELECT 컬럼 FROM B
UNION ALL 두 SELECT 결과를 모두 합침 중복 포함 SELECT 컬럼 FROM A UNION ALL SELECT 컬럼
FROM B
INTERSECT 두 SELECT 결과의 공통 데이터만 조회 중복 제거 SELECT 컬럼 FROM A INTERSECT SELECT 컬럼
FROM B
차집합 앞 SELECT에는 있고 뒤 SELECT에는 없는 데이터 조회 중복 제거 Oracle: MINUS / SQL Server: EXCEPT

 

그룹 함수

그룹 함수 설명 사용 예시 결과/의미
ROLLUP 지정한 컬럼 순서대로 소계와 총계를 구함 GROUP BY ROLLUP(부서, 직급) 부서+직급별 집계, 부서별 소계, 전체 합계
CUBE 가능한 모든 조합의 소계와 총계를 구함 GROUP BY CUBE(부서, 직급) 부서별, 직급별, 부서+직급별, 전체 합계
GROUPING SETS 원하는 그룹 조합만 직접 지정해서 집계 GROUP BY GROUPING SETS((부서), (직급)) 부서별 집계와 직급별 집계만 조회
GROUPING 해당 행이 소계/총계 행인지 구분 GROUPING(부서) 소계/총계면 1, 일반 행이면 0

* ROLLUP은 컬럼 순서가 바뀌면 결과가 달라진다.

  GROUPING SETS에서 ()는 전체 총계를 구하라는 의미

 

윈도우 함수

 윈도우 함수는 행을 유지한 상태에서 순위, 누적합, 평균, 이전/다음 값 등을 계산하는 함수.
일반 집계 함수처럼 GROUP BY로 행을 줄이지 않고, 각 행 옆에 계산 결과를 붙이는 방식

 

- 집계함수

구문 설명 예시
OVER() 윈도우 함수의 계산 범위를 지정 SUM(급여) OVER()
PARTITION BY 그룹을 나누는 기준 PARTITION BY 부서
ORDER BY 계산 순서를 정하는 기준 ORDER BY 급여 DESC
ROWS / RANGE 계산할 행의 범위 지정 ROWS BETWEEN ...

 

- 순위함수

구문 설명 예시
OVER() 윈도우 함수의 계산 범위를 지정 SUM(급여) OVER()
PARTITION BY 그룹을 나누는 기준 PARTITION BY 부서
ORDER BY 계산 순서를 정하는 기준 ORDER BY 급여 DESC
ROWS / RANGE 계산할 행의 범위 지정 ROWS BETWEEN ...
함수 설명 사용 예시 결과 특징
RANK() 같은 순위가 있으면 같은 순위를 부여하고, 다음 순위는 건너뜀 RANK() OVER(ORDER BY 급여 DESC) 1, 2, 2, 4
DENSE_RANK() 같은 순위가 있어도 다음 순위를 건너뛰지 않음 DENSE_RANK() OVER(ORDER BY 급여 DESC) 1, 2, 2, 3
ROW_NUMBER() 같은 값이어도 각 행마다 고유한 번호를 부여 ROW_NUMBER() OVER(ORDER BY 급여 DESC) 1, 2, 3, 4

* PARTITION BY 부서 → 부서별로 따로 계산해라.

 

그 외 행 간의 값 참조 함수

함수 의미 사용 예시 결과
LAG(컬럼) 이전 행의 값을 가져옴 LAG(급여) OVER(ORDER BY 입사일) 현재 행보다 앞에 있는 급여
LEAD(컬럼) 다음 행의 값을 가져옴 LEAD(급여) OVER(ORDER BY 입사일) 현재 행보다 뒤에 있는 급여

 

윈도우 함수 범위 지정

ROWS BETWEEN [시작범위] AND [끝 범위]

구조 의미 예시
ROWS BETWEEN 시작점 AND 끝점 실제 행 개수 기준으로 범위 지정 현재 행 기준 앞뒤 몇 행
RANGE BETWEEN 시작점 AND 끝점 값의 범위 기준으로 범위 지정 같은 정렬값은 같은 범위로 처리

 

TOP N 쿼리

구분 문법 설명 사용 예시
SQL Server TOP(N) 조회 결과 상위 N개 행만 가져옴 SELECT TOP(3) * FROM 사원 ORDER BY 급여 DESC;
Oracle ROWNUM 정렬 후 바깥에서 ROWNUM으로 상위 N개 추출 SELECT * FROM (SELECT * FROM 사원 ORDER BY 급여 DESC) WHERE ROWNUM <= 3;
Oracle 12c+ FETCH FIRST N ROWS ONLY 상위 N개 행만 조회 SELECT * FROM 사원 ORDER BY 급여 DESC FETCH FIRST 3 ROWS ONLY;

반드시 ORDER BY와 함께 사용

 

계층형 질의

 

PIVOT/UNPIVOT 절

구분 의미 사용 상황 예시
PIVOT 행으로 되어 있는 값을 열로 변환 과목별 점수를 컬럼으로 보고 싶을 때 수학, 영어, 과학을 각각 컬럼으로 변환
UNPIVOT 열로 되어 있는 값을 행으로 변환 여러 컬럼을 하나의 값 컬럼으로 정리할 때 수학점수, 영어점수 컬럼을 과목/점수 행으로 변환

 

정규표현식 '%'와 '_'

구분 % _
의미 0개 이상의 문자 정확히 1개의 문자
글자 수 제한 없음 한 글자만
예시 LIKE 'A%' LIKE 'A_'
결과 A, AB, ABC 모두 가능 AB처럼 A 뒤에 한 글자만 가능

 

트랜잭션의 특징

특징 영어 의미 설명
원자성 Atomicity 모두 수행되거나 모두 수행되지 않아야 함 중간만 실행되는 상태가 없어야 함
일관성 Consistency 트랜잭션 전후 데이터가 규칙을 만족해야 함 데이터 무결성이 유지되어야 함
고립성 Isolation 동시에 실행되는 트랜잭션이 서로 영향을 주면 안 됨 다른 트랜잭션의 중간 결과를 보면 안 됨
지속성 Durability 완료된 결과는 영구적으로 저장되어야 함 COMMIT 후에는 오류가 나도 결과가 유지됨

 

격리 수준 Dirty Read Non-Repeatable Read Phantom Read 특징
READ UNCOMMITTED 발생 가능 발생 가능 발생 가능 가장 느슨함
READ COMMITTED 방지 발생 가능 발생 가능 COMMIT된 데이터만 읽음
REPEATABLE READ 방지 방지 발생 가능 같은 행 반복 조회 보장
SERIALIZABLE 방지 방지 방지 가장 엄격함