Skip to Content
BlogSQLD 자격증SQL 기본 (요약 노트)

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 비교 (★ 필수 암기)

구분DROPTRUNCATEDELETE
분류DDLDDLDML
삭제 대상테이블 구조 + 데이터 전체데이터 전체 (구조 유지)데이터 (조건별 행 단위 삭제 가능)
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 사원;
  • DISTINCT (중복 제거):
    SELECT DISTINCT 부서번호 FROM 사원;

💡 SELECT 처리 순서 (논리적 실행 순서 ★★★):
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
(작성 순서와 처리 순서가 다르므로 반드시 암기!)


3. 조건 필터링 (WHERE절)

3-1. 비교 연산자

=, >, <, >=, <=, <> 또는 != (같지 않음)


3-2. SQL 연산자

연산자설명
BETWEEN A AND BA 이상 B 이하 (양쪽 경계값 포함)
IN (list)목록 중 하나와 일치
LIKE패턴 매칭 (%: 0개 이상 문자, _: 1개 문자)
IS NULL / IS NOT NULLNULL 여부 판단 (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단계 최종 암기 요약

  1. DDL 5종: CREATE, ALTER, DROP, TRUNCATE, RENAME
  2. DROP / TRUNCATE / DELETE: ROLLBACK 가능한 것은 **DELETE**뿐 (DML), DDL(DROP/TRUNCATE)은 불가
  3. SELECT 처리 순서: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
  4. NULL 비교: = NULL 불가, 반드시 IS NULL / IS NOT NULL 사용
  5. NULL 처리 함수: NVL, NVL2, COALESCE, ISNULL (SQL Server)
  6. CASE vs DECODE: CASE(표준, 조건식 자유) vs DECODE(Oracle 전용, 등가 비교만)
  7. WHERE vs HAVING: WHERE(그룹화 전 행 단위 필터) vs HAVING(그룹화 후 집계 결과 필터)
  8. JOIN 종류: EQUI, NON-EQUI, INNER, OUTER (LEFT/RIGHT/FULL), SELF, CROSS, NATURAL, USING
  9. Oracle (+) 표기: (+)가 붙은 쪽이 데이터가 부족하여 NULL로 대체되는 테이블
  10. 집계 함수와 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 입니다.
  • 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이라 합니다.
  • Q12. 정답: ②
    • 해설: Oracle의 (+) 표기법으로는 FULL OUTER JOIN을 직접 작성할 수 없습니다 (한쪽만 가능). FULL OUTER JOIN은 ANSI 표준 문법을 사용하거나 UNION을 활용해야 합니다.
  • Q13. 정답: ②
    • 해설: COUNT(*)는 NULL을 포함한 전체 행 수의 개수를 셉니다. 반면 SUM, AVG, COUNT(컬럼명) 등은 NULL 값을 연산에서 자동 제외합니다.
  • Q14. 정답: ④
    • 해설: 합성 연산자 기호는 DBMS마다 다릅니다. (Oracle: ||, SQL Server: +)
  • Q15. 정답: ③
    • 해설: BETWEEN A AND B는 A 이상 B 이하를 의미하므로 A와 B를 모두 포함합니다.
마지막 수정