1. RDB 개요 & 테이블 관리 (DDL)
1-1. 관계형 데이터베이스 (RDB) 개요
- 테이블 (Table): 행(Row)과 열(Column)로 구성된 데이터 저장 구조
- 행 (Row / Tuple): 하나의 데이터 레코드
- 열 (Column / Attribute): 데이터 항목(속성)
- 기본키 (PK, Primary Key): 각 행을 유일하게 식별하는 값 (NULL 불가, 중복 불가)
- 외래키 (FK, Foreign Key): 다른 테이블의 PK를 참조하는 값 (참조 무결성 유지)
1-2. DDL (Data Definition Language) — 구조를 정의하는 언어
| 명령어 | 설명 | 특징 |
|---|---|---|
CREATE | 테이블/뷰/인덱스 등 객체 생성 | - |
ALTER | 기존 객체의 구조 변경 | 컬럼 추가/삭제/변경 |
DROP | 객체 자체를 삭제 | 테이블 구조까지 완전히 삭제, ROLLBACK 불가 |
TRUNCATE | 테이블의 데이터만 전체 삭제 | 구조는 유지, ROLLBACK 불가, DELETE보다 실행 속도 빠름 |
RENAME | 객체 이름 변경 | - |
📌 DROP vs TRUNCATE vs DELETE 비교 (★ 필수 암기)
| 구분 | DROP | TRUNCATE | DELETE |
|---|---|---|---|
| 분류 | DDL | DDL | DML |
| 삭제 대상 | 테이블 구조 + 데이터 전체 | 데이터 전체 (구조 유지) | 데이터 (조건별 행 단위 삭제 가능) |
| ROLLBACK | 불가 | 불가 | 가능 |
| 실행 속도 | - | 빠름 (내부적으로 공간 초기화) | 느림 (한 행씩 로그 기록) |
| WHERE 절 | 불가 | 불가 | 가능 |
-- 예시 SQL
CREATE TABLE 사원 (
사원번호 NUMBER(5) PRIMARY KEY,
사원명 VARCHAR2(20) NOT NULL,
입사일 DATE,
부서번호 NUMBER(3)
);
ALTER TABLE 사원 ADD (연봉 NUMBER(10)); -- 컬럼 추가
ALTER TABLE 사원 MODIFY (사원명 VARCHAR2(30)); -- 컬럼 변경
ALTER TABLE 사원 DROP COLUMN 연봉; -- 컬럼 삭제
TRUNCATE TABLE 사원; -- 데이터만 삭제, 구조는 남음 (ROLLBACK 불가)
DROP TABLE 사원; -- 테이블 자체 삭제 (ROLLBACK 불가)💡 시험 단골 체크:
TRUNCATE는WHERE조건을 사용할 수 없음.DROP과TRUNCATE는 DDL이므로 Auto Commit되어ROLLBACK이 불가능함 (DELETE는 DML이므로ROLLBACK가능).
2. DML & 기본 SELECT
2-1. DML (Data Manipulation Language) — 데이터를 조작하는 언어
| 명령어 | 설명 |
|---|---|
INSERT | 새로운 행 추가 |
UPDATE | 기존 행의 값 수정 |
DELETE | 행 삭제 (조건 지정 가능) |
SELECT | 데이터 조회 (일부 분류에서는 DQL로 다루기도 함) |
INSERT INTO 사원 (사원번호, 사원명, 입사일, 부서번호)
VALUES (1001, '홍길동', TO_DATE('2024-01-15', 'YYYY-MM-DD'), 10);
UPDATE 사원 SET 부서번호 = 20 WHERE 사원번호 = 1001;
DELETE FROM 사원 WHERE 사원번호 = 1001;2-2. 기본 SELECT문
SELECT 컬럼명1, 컬럼명2
FROM 테이블명
WHERE 조건
ORDER BY 정렬기준;- ALIAS (별칭):
SELECT 사원명 AS 이름, 부서번호 "부서 번호" -- AS 생략 가능, 공백/특수문자 포함 시 큰따옴표("") 필수 FROM 사원; - 합성 연산자 (Concatenation Operator):
- Oracle:
||사용 - SQL Server:
+사용
-- Oracle 예시 SELECT 사원명 || '님의 부서는 ' || 부서번호 || '입니다' AS 안내 FROM 사원; - Oracle:
- DISTINCT (중복 제거):
SELECT DISTINCT 부서번호 FROM 사원;
💡 SELECT 처리 순서 (논리적 실행 순서 ★★★):
FROM→WHERE→GROUP BY→HAVING→SELECT→ORDER BY
(작성 순서와 처리 순서가 다르므로 반드시 암기!)
3. 조건 필터링 (WHERE절)
3-1. 비교 연산자
=, >, <, >=, <=, <> 또는 != (같지 않음)
3-2. SQL 연산자
| 연산자 | 설명 |
|---|---|
BETWEEN A AND B | A 이상 B 이하 (양쪽 경계값 포함) |
IN (list) | 목록 중 하나와 일치 |
LIKE | 패턴 매칭 (%: 0개 이상 문자, _: 1개 문자) |
IS NULL / IS NOT NULL | NULL 여부 판단 (NULL은 = 로 비교 불가!) |
SELECT * FROM 사원 WHERE 연봉 BETWEEN 3000 AND 5000;
SELECT * FROM 사원 WHERE 부서번호 IN (10, 20, 30);
SELECT * FROM 사원 WHERE 사원명 LIKE '김%';
SELECT * FROM 사원 WHERE 연봉 IS NULL;3-3. 논리 연산자
AND, OR, NOT
- 연산 우선순위:
NOT>AND>OR(괄호()를 사용하여 의도를 명확히 하는 것이 권장됨)
3-4. NULL 연산 및 함수 처리
NULL과의 산술연산 결과는 항상NULL(NULL + 100➔NULL)NULL비교는= NULL이 아니라 반드시IS NULL/IS NOT NULL사용 (= NULL사용 시UNKNOWN반환되어 조회 안 됨)
| 함수 | 설명 |
|---|---|
NVL(a, b) | a가 NULL이면 b 반환 (Oracle) |
NVL2(a, b, c) | a가 NULL이 아니면 b, NULL이면 c 반환 (Oracle) |
COALESCE(a, b, c...) | 인자 중 NULL이 아닌 첫 번째 값 반환 (ANSI 표준) |
ISNULL(a, b) | a가 NULL이면 b 반환 (SQL Server) |
SELECT 사원명, NVL(연봉, 0) AS 연봉 FROM 사원;
SELECT COALESCE(연봉, 보너스, 0) FROM 사원;⚠️ 함정 포인트:
WHERE 연봉 = NULL은 작동하지 않음(결과 0건) → 반드시WHERE 연봉 IS NULL사용
4. 내장 함수 & 조건문 & 그룹핑
4-1. 내장 함수 종류
| 구분 | 주요 함수 | 설명 |
|---|---|---|
| 문자 함수 | SUBSTR, LENGTH, UPPER, LOWER, TRIM, LPAD/RPAD, REPLACE | 문자열 처리 |
| 숫자 함수 | ROUND, TRUNC, CEIL, FLOOR, MOD | 숫자 계산 / 반올림 / 버림 |
| 날짜 함수 | SYSDATE, ADD_MONTHS, MONTHS_BETWEEN, EXTRACT | 날짜 계산 및 추출 |
| 변환 함수 | TO_CHAR, TO_NUMBER, TO_DATE | 데이터 타입 변환 (Oracle) |
SELECT SUBSTR('SQLD자격증', 1, 4) FROM DUAL; -- 'SQLD'
SELECT ROUND(1234.567, 2) FROM DUAL; -- 1234.57
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM DUAL; -- 오늘 날짜 문자열 변환4-2. 조건문 (CASE, DECODE)
-- CASE문 (ANSI 표준, 다양한 조건식 가능)
SELECT 사원명,
CASE WHEN 연봉 >= 5000 THEN '고연봉'
WHEN 연봉 >= 3000 THEN '중간'
ELSE '저연봉'
END AS 연봉등급
FROM 사원;
-- DECODE 함수 (Oracle 전용, 등가 비교만 가능)
SELECT 사원명,
DECODE(부서번호, 10, '인사부', 20, '개발부', '기타') AS 부서명
FROM 사원;💡
DECODE는 등가(=) 비교만 가능(부등호 불가)하며 Oracle 전용.CASE문은 범용 ANSI 표준이며 복잡한 조건 표현이 가능.
4-3. 그룹핑 (GROUP BY, HAVING)
- 집계 함수:
COUNT,SUM,AVG,MAX,MIN GROUP BY: 지정한 컬럼 기준으로 그룹화HAVING: 그룹화된 결과에 대한 조건 필터ing (WHERE는 그룹화 전 행 단위 필터,HAVING은 그룹화 후 결과 필터)
SELECT 부서번호, COUNT(*) AS 인원수, AVG(연봉) AS 평균연봉
FROM 사원
GROUP BY 부서번호
HAVING COUNT(*) >= 3;💡 집계 함수의 NULL 처리:
- 대부분의 집계 함수(
SUM,AVG,COUNT(컬럼명),MAX,MIN)는NULL값을 제외하고 연산.- 단,
COUNT(*)는NULL을 포함한 전체 행 수를 카운트함.
5. 관계형의 꽃, JOIN
5-1. JOIN 종류 요약
| JOIN 종류 | 설명 |
|---|---|
| EQUI JOIN (등가 조인) | = 연산자로 두 테이블 연결 (가장 일반적) |
| NON-EQUI JOIN | = 이외의 연산자 (BETWEEN, >, < 등)로 연결 |
| INNER JOIN | 양쪽 테이블에 모두 존재하는 데이터만 반환 |
| OUTER JOIN | 한쪽 테이블 기준으로 일치하지 않아도 반환 (LEFT, RIGHT, FULL) |
| SELF JOIN | 같은 테이블을 자기 자신과 조인 (자기참조관계 조회) |
| CROSS JOIN | 카티션 곱 (Cartesian Product, 모든 경우의 수 결합) |
| NATURAL JOIN | 두 테이블의 동일한 이름을 가진 모든 컬럼을 자동 매칭하여 조인 |
| USING 절 | NATURAL JOIN과 유사하며, 조인할 컬럼을 명시적으로 지정 |
-- 1. EQUI JOIN (Oracle 전통 방식)
SELECT E.사원명, D.부서명
FROM 사원 E, 부서 D
WHERE E.부서번호 = D.부서번호;
-- 2. INNER JOIN (ANSI 표준 방식)
SELECT E.사원명, D.부서명
FROM 사원 E
INNER JOIN 부서 D ON E.부서번호 = D.부서번호;
-- 3. LEFT OUTER JOIN (ANSI 표준) : 사원은 모두 출력, 매칭되는 부서 없으면 NULL
SELECT E.사원명, D.부서명
FROM 사원 E
LEFT OUTER JOIN 부서 D ON E.부서번호 = D.부서번호;
-- 4. Oracle 전통 OUTER JOIN 표기 (+)
-- (+)가 붙은 쪽이 "부족하여 NULL로 채워지는 쪽"
SELECT E.사원명, D.부서명
FROM 사원 E, 부서 D
WHERE E.부서번호 = D.부서번호(+); -- LEFT OUTER JOIN과 동일
-- 5. NATURAL JOIN
SELECT 사원명, 부서명
FROM 사원 NATURAL JOIN 부서;
-- 6. USING 절
SELECT 사원명, 부서명
FROM 사원 JOIN 부서 USING (부서번호);
-- 7. SELF JOIN (자기참조 조인)
SELECT A.사원명 AS 사원, B.사원명 AS 관리자
FROM 사원 A, 사원 B
WHERE A.관리자번호 = B.사원번호;💡 OUTER JOIN 주의사항:
- Oracle
(+)표기 시,(+)가 붙은 테이블 쪽에NULL이 채워집니다 (즉, 붙지 않은 쪽이 기준 테이블).FULL OUTER JOIN은 Oracle(+)기호로 표현할 수 없으며, ANSI 표준 문법이나LEFT OUTER JOIN+RIGHT OUTER JOIN(UNION) 조합을 사용해야 합니다.
📌 2단계 최종 암기 요약
- DDL 5종:
CREATE,ALTER,DROP,TRUNCATE,RENAME - DROP / TRUNCATE / DELETE:
ROLLBACK가능한 것은 **DELETE**뿐 (DML), DDL(DROP/TRUNCATE)은 불가 - SELECT 처리 순서:
FROM→WHERE→GROUP BY→HAVING→SELECT→ORDER BY - NULL 비교:
= NULL불가, 반드시IS NULL/IS NOT NULL사용 - NULL 처리 함수:
NVL,NVL2,COALESCE,ISNULL(SQL Server) - CASE vs DECODE:
CASE(표준, 조건식 자유) vsDECODE(Oracle 전용, 등가 비교만) - WHERE vs HAVING:
WHERE(그룹화 전 행 단위 필터) vsHAVING(그룹화 후 집계 결과 필터) - JOIN 종류:
EQUI,NON-EQUI,INNER,OUTER(LEFT/RIGHT/FULL),SELF,CROSS,NATURAL,USING - Oracle (+) 표기:
(+)가 붙은 쪽이 데이터가 부족하여 NULL로 대체되는 테이블 - 집계 함수와 NULL:
COUNT(*)는 NULL 포함, 그 외 집계 함수(SUM,AVG,COUNT(컬럼)등)는 NULL 제외
✏️ 예상 문제 (2단계 종합, 15문항)
Q1. 다음 중 DDL(Data Definition Language)에 해당하지 않는 명령어는?
① CREATE
② ALTER
③ DELETE
④ DROP
Q2. DROP, TRUNCATE, DELETE에 대한 설명으로 옳지 않은 것은?
① DROP은 테이블 구조 자체를 삭제한다.
② TRUNCATE는 WHERE절을 사용하여 조건부 삭제가 가능하다.
③ DELETE는 ROLLBACK이 가능하다.
④ TRUNCATE는 DELETE보다 실행 속도가 빠르다.
Q3. 테이블 사원에서 부서번호가 NULL인 사원을 조회하는 SQL로 옳은 것은?
① WHERE 부서번호 = NULL
② WHERE 부서번호 IS NULL
③ WHERE 부서번호 == NULL
④ WHERE 부서번호 <> NULL
Q4. SELECT문의 논리적 처리 순서로 옳은 것은?
① SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY
② FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
③ FROM → SELECT → WHERE → GROUP BY → HAVING → ORDER BY
④ WHERE → FROM → GROUP BY → HAVING → SELECT → ORDER BY
Q5. 사원 테이블에서 연봉이 NULL인 경우 0으로 처리하여 조회하고자 할 때 사용할 수 있는 함수로 옳지 않은 것은?
① NVL
② COALESCE
③ DECODE
④ SUBSTR
Q6. CASE문과 DECODE문에 대한 설명으로 옳은 것은?
① DECODE는 부등호 조건(예: 연봉 >= 3000)도 자유롭게 표현할 수 있다.
② CASE문은 ANSI 표준으로 다양한 조건식(부등호, 범위 등) 표현이 가능하다.
③ DECODE는 여러 DBMS에서 공통으로 사용 가능한 표준 문법이다.
④ CASE문은 Oracle에서만 사용할 수 있다.
Q7. WHERE절과 HAVING절의 차이에 대한 설명으로 옳은 것은?
Q8. 다음 SQL의 실행 결과로 반환되는 행의 개수 조건은 무엇을 의미하는가?
SELECT 부서번호, COUNT(*)
FROM 사원
GROUP BY 부서번호
HAVING COUNT(*) >= 3;Q9. 두 테이블을 조인할 때, 두 테이블에 동일한 이름을 가진 모든 컬럼을 기준으로 자동으로 매칭하여 조인하는 방식은 무엇인가?
Q10. 다음 Oracle 전통 OUTER JOIN 구문에서 (+) 표기에 대한 설명으로 옳은 것은?
SELECT E.사원명, D.부서명
FROM 사원 E, 부서 D
WHERE E.부서번호 = D.부서번호(+);① 사원 기준으로 부서가 없어도 사원은 모두 조회된다.
② 부서 기준으로 사원이 없어도 부서는 모두 조회된다.
③ 두 테이블에 공통으로 존재하는 데이터만 조회된다.
④ 문법 오류로 실행되지 않는다.
Q11. 같은 테이블을 자기 자신과 조인하여, 사원과 그 사원의 관리자 정보를 함께 조회할 때 사용하는 조인 기법은 무엇인가?
Q12. FULL OUTER JOIN을 표현할 수 없는 방식은?
① ANSI 표준 FULL OUTER JOIN 구문
② Oracle 전통 (+) 표기법
③ LEFT OUTER JOIN과 RIGHT OUTER JOIN을 UNION으로 결합
④ 표준 SQL 조인 구문
Q13. 다음 중 집계 함수(COUNT, SUM, AVG, MAX, MIN)의 NULL 처리에 대한 설명으로 옳은 것은?
① 모든 집계 함수는 NULL 값을 0으로 취급하여 연산한다.
② COUNT(*)는 NULL이 포함된 행도 포함하여 개수를 센다.
③ SUM, AVG는 NULL 값도 포함하여 평균/합계를 계산한다.
④ 집계 함수는 NULL이 하나라도 있으면 오류를 반환한다.
Q14. 다음 중 합성 연산자(문자열 연결)에 대한 설명으로 옳지 않은 것은?
① Oracle에서는 ||를 사용한다.
② SQL Server에서는 +를 사용한다.
③ 합성 연산자는 두 개의 문자열을 하나로 결합한다.
④ 모든 DBMS에서 합성 연산자의 기호는 동일하다.
Q15. BETWEEN A AND B 연산자의 범위 포함 여부로 옳은 것은?
① A, B 모두 포함하지 않음
② A는 포함, B는 미포함
③ A, B 모두 포함
④ A는 미포함, B는 포함
✅ 정답 및 해설
- Q1. 정답: ③
- 해설:
DELETE는 데이터를 조작하는 DML입니다.CREATE,ALTER,DROP은 테이블 구조를 관리하는 DDL입니다.
- 해설:
- Q2. 정답: ②
- 해설:
TRUNCATE는WHERE절을 사용할 수 없으며 테이블 전체 데이터를 삭제합니다. 조건부 삭제는DELETE를 사용해야 합니다.
- 해설:
- Q3. 정답: ②
- 해설:
NULL은= 연산자로 비교할 수 없습니다. 반드시IS NULL을 사용해야 합니다.
- 해설:
- Q4. 정답: ②
- 해설: SELECT문의 논리적 처리 순서는
FROM→WHERE→GROUP BY→HAVING→SELECT→ORDER BY입니다.
- 해설: SELECT문의 논리적 처리 순서는
- Q5. 정답: ④
- 해설:
SUBSTR은 문자열 추출 함수로 NULL 대체 기능이 없습니다.NVL,COALESCE,DECODE등은 NULL 처리에 활용 가능합니다.
- 해설:
- Q6. 정답: ②
- 해설:
CASE문은 ANSI 표준이며 다양한 조건식(부등호 등) 생성이 가능합니다.DECODE는 Oracle 전용 함수이며 등가(=) 비교만 지원합니다.
- 해설:
- Q7. 정답:
WHERE절은GROUP BY이전에 적용되어 개별 행 단위로 필터링하고,HAVING절은GROUP BY이후에 적용되어 집계된 그룹 결과 단위로 필터링합니다.
- Q8. 정답:
- 부서별로 그룹화한 후, 그룹 내 인원(행 개수)이 3명 이상인 부서만 조회한다는 것을 의미합니다.
- Q9. 정답: NATURAL JOIN
- 해설:
NATURAL JOIN은 두 테이블 간 동일한 이름과 타입을 가진 모든 컬럼을 자동 매칭하여 조인을 수행합니다.
- 해설:
- Q10. 정답: ①
- 해설:
(+)기호는 데이터가 부족하여 NULL로 대체될 테이블(부서) 쪽에 붙습니다. 따라서(+)가 붙지 않은사원테이블이 기준이 되는LEFT OUTER JOIN역할을 수행합니다.
- 해설:
- Q11. 정답: SELF JOIN
- 해설: 하나의 테이블에 서로 다른 별칭(Alias)을 지정하여 자기 자신과 조인하는 방식을
SELF JOIN이라 합니다.
- 해설: 하나의 테이블에 서로 다른 별칭(Alias)을 지정하여 자기 자신과 조인하는 방식을
- Q12. 정답: ②
- 해설: Oracle의
(+)표기법으로는FULL OUTER JOIN을 직접 작성할 수 없습니다 (한쪽만 가능).FULL OUTER JOIN은 ANSI 표준 문법을 사용하거나UNION을 활용해야 합니다.
- 해설: Oracle의
- Q13. 정답: ②
- 해설:
COUNT(*)는 NULL을 포함한 전체 행 수의 개수를 셉니다. 반면SUM,AVG,COUNT(컬럼명)등은 NULL 값을 연산에서 자동 제외합니다.
- 해설:
- Q14. 정답: ④
- 해설: 합성 연산자 기호는 DBMS마다 다릅니다. (Oracle:
||, SQL Server:+)
- 해설: 합성 연산자 기호는 DBMS마다 다릅니다. (Oracle:
- Q15. 정답: ③
- 해설:
BETWEEN A AND B는 A 이상 B 이하를 의미하므로 A와 B를 모두 포함합니다.
- 해설: