[ SQL 기본 ]
SQLD에서 SQL 파트는 결국 2가지를 묻는다.
- 문법(키워드/형태)을 정확히 아는가
- 처리 순서와 예외 규칙(함정 포인트)을 이해했는가
특히 SELECT 처리 순서(FWG HSO),
별칭(ALIAS) 규칙, NULL 처리,
집계함수 + GROUP BY/HAVING,
ORDER BY에서 많이 걸린다.
1. 관계형 데이터베이스 개요
DBMS (DataBase Management System)
- 데이터베이스를 관리 및
접근하기 위한 환경을 제공하는 시스템 - RDBMS (Relational DBMS)
- 데이터를 테이블 형태로 저장하고,
테이블 간 관계(PK, FK)를 활용해 관리하는 데이터베이스 - 1970년 IBM의 Edgar F. Codd가 처음 제안한 모델
대표적인 RDBMS
- ORACLE, SQL SERVER, MYSQL, POSTGRESQL 등
- 시험은 주로 ORACLE 중심이고,
SQL SERVER도 간간히 등장
기본 용어
- 속성 = COLUMN = FIELD
- 튜플 = ROW = RECORD
- 컬럼 헤더 = 컬럼 이름이 표시되는 부분(조회 결과의 헤더)
2. SQL이란
SQL (Structured Query Language)
RDBMS에서 데이터를 생성(CREATE), 조회(SELECT),
수정(UPDATE), 삭제(DELETE)하기 위한 표준 언어
SQL 분류
1) DDL (Data Definition Language)
: 구조(테이블) 정의
- CREATE, ALTER, DROP, RENAME, TRUNCATE
2) DML (Data Manipulation Language)
: 데이터 조작
- SELECT, INSERT, UPDATE, DELETE
3) DCL (Data Control Language)
: 권한 제어
- GRANT, REVOKE
4) TCL (Transaction Control Language)
: 트랜잭션 제어
- COMMIT, ROLLBACK, SAVEPOINT
SQL은 언어라서 문제 유형이 거의 고정이다.
- 단어/문법 암기
- SQL ↔ 한글 치환(해석, 빈칸, 문법 오류 찾기)
3. 관계대수 연산자(이론 베이스)
관계대수는 SQL의 이론적 기초가 되는 수학적 언어다.
1) 단항 연산자
- SELECTION(셀렉션): 행 선택(조건 필터)
- PROJECTION(프로젝션): 열 선택(컬럼 선택)
2) 이항 연산자(집합 연산)
- UNION (유니온)
- INTERSECT (인터섹트)
- DIFFERENCE(차집합)
- ORACLE: MINUS
- SQL SERVER: EXCEPT
- CARTESIAN PRODUCT(카테시안 곱)
- SQL에서는 CROSS JOIN으로 등장
3) 조인 연산자
- JOIN (INNER JOIN, OUTER JOIN 등)
시험에서는 한글로 개념을 던져도,
SQL 키워드 형태로 바꿔서 고르는 경우가 많다.
- 유니온
→ UNION - 인터섹트
→ INTERSECT - 차집합
→ MINUS(ORACLE) / EXCEPT(SQL SERVER) - 카테시안
→ CROSS JOIN
4. SELECT 문
SELECT는 데이터베이스에서
데이터를 조회할 때 사용하는
가장 기본적인 명령어다.
4-1. SELECT 구조(절의 구성)
- FROM: 어떤 테이블에서 가져올지
- WHERE: 조건에 맞는 행(ROW) 필터링
- GROUP BY: 데이터를 그룹으로 묶기
- HAVING: 그룹에 대한 조건 필터링
- SELECT: 조회할 컬럼 선택
- ORDER BY: 정렬 기준
4-2. 처리 순서(진짜 핵심)
공격수가 해써오!
FWG HSO
FROM → WHERE → GROUP BY
→ HAVING → SELECT → ORDER BY
이 순서를 외워야 함정이 정리된다.
- WHERE는 SELECT보다 먼저 수행된다
→ WHERE에서 SELECT 별칭 사용 불가 - 집계는 GROUP BY 이후에 의미가 생긴다
→ WHERE에서 집계함수 사용 불가, HAVING에서 가능 - ORDER BY는 마지막
→ SELECT 별칭 사용 가능
4-3. SELECT DISTINCT
조회 결과에서 중복 행을 제거하고
유일한 값만 남긴다.
예시
SELECT DISTINCT DEPT
FROM EMP;
5. 별칭(ALIAS)
별칭은 조회 결과의 컬럼 헤더를
바꿔서 보여주는 기능이다.
예시
SELECT STUDENT_NO AS ID
FROM STUDENT;
별칭 주의 사항
- AS는 생략 가능, FROM절의 테이블에도 별칭 지정 가능
- 숫자나 특수문자만으로 별칭 구성은 불가
(시험에서는 보통 불가로 처리) - 예약어 사용 금지
(SELECT 같은 SQL 키워드) - 공백/특수문자 포함 별칭은 DBMS에서
따로 인용 처리가 필요할 수 있음 - 쌍따옴표 없이 사용 가능한 특수문자는
보통 _, $, # 정도를 예로 든다
가장 많이 나오는 함정
- WHERE절은 SELECT보다 먼저 수행되므로
SELECT에서 만든 별칭을 WHERE에서 사용할 수 없다
틀리는 예시(문법 문제 단골)
SELECT STUDENT_NO AS ID
FROM STUDENT
WHERE ID = 101;
6. 문자열 연결(CONCAT)
문자열을 이어 붙이는 방식은 DBMS마다 자주 비교된다.
- ORACLE: ||
- SQL SERVER: +
예시(ORACLE)
SELECT LAST_NAME || FIRST_NAME AS FULL_NAME
FROM MEMBER;
설명
- MEMBER 테이블에서 성(홍)과 이름(길동)을 연결해
FULL_NAME이 홍길동 형태로 출력된다.
7. 함수
함수는 입력값에 대해 특정 연산을 수행하고
결과를 반환하는 약속된 코드 블록이다.
- 단일행 함수: 1행 입력 → 1행 출력
- 다중행 함수(집계함수): 여러 행 입력 → 1값 출력
ORACLE에서는 함수 테스트용
더미 테이블로 DUAL을 자주 사용한다.
- FROM DUAL이 보이면 실제 테이블 없이
함수 결과만 확인하는 용도라고 보면 된다.
예시
SELECT SYSDATE
FROM DUAL;
8. 문자 함수
8-1. LOWER(문자열)
- 문자열을 전부 소문자로 변환한다.
- 대소문자 섞인 데이터를 같은 기준으로
비교할 때 자주 사용한다.
SELECT LOWER('AnIMaLe')
FROM DUAL;
-- animale
8-2. UPPER(문자열)
- 문자열을 전부 대문자로 변환한다.
- 코드값/이름 비교에서
대소문자 이슈를 줄일 때 유용하다.
SELECT UPPER('AnIMaLe')
FROM DUAL;
-- ANIMALE
대소문자 무시 비교 패턴
SELECT *
FROM MEMBER
WHERE UPPER(NICKNAME) = 'HONG';
8-3. SUBSTR(문자열, 시작, 길이)
- 문자열의 일부를 잘라서 반환한다.
- 시작 위치가 양수면 앞에서부터, 음수면 뒤에서부터 센다.
- 길이는 생략 가능(생략하면 시작부터 끝까지)
SELECT
SUBSTR('ANIMALE', 1, 3) AS A, -- ANI
SUBSTR('ANIMALE', 4, 3) AS B, -- MAL
SUBSTR('ANIMALE', -3, 3) AS C -- ALE
FROM DUAL;
8-4. TRIM / LTRIM / RTRIM
- TRIM: 양쪽 공백 제거(기본)
- LTRIM: 왼쪽(앞) 공백 제거
- RTRIM: 오른쪽(뒤) 공백 제거
- TRIM은 특정 문자를 지정하면
그 문자도 양쪽에서 제거된다.
SELECT TRIM(' hello ')
FROM DUAL;
-- hello
SELECT TRIM('x' FROM 'xxABCDxx')
FROM DUAL;
-- ABCD
8-5. LENGTH(문자열)
- 문자열 길이를 반환한다.
SELECT LENGTH('ANIMALE')
FROM DUAL;
-- 6
8-6. REPLACE(문자열, 찾을문자, 바꿀문자)
- 문자열에서 특정 부분을 찾아 치환한다.
SELECT REPLACE('010-1234-5678', '-', '')
FROM DUAL;
-- 01012345678
8-7. ASCII(문자)
- 문자 1개의 ASCII 코드 값을 반환한다.
SELECT ASCII('A'), ASCII('a')
FROM DUAL;
-- 65, 97
9. 숫자 함수
- ABS: 절댓값
- MOD: 나머지
- ROUND: 반올림
반올림은 자리수 1이면 소수점 첫째 자리까지
남기기 위해 둘째 자리에서 반올림
자리수가 음수면 정수부에서 반올림 위치가
앞으로 간다(예: -1이면 십의 자리 기준)
SELECT
ROUND(123.456, 1) AS R1, -- 123.5
ROUND(123.456, -1) AS R2 -- 120
FROM DUAL;
- TRUNC: 버림(절삭)
- FLOOR: 내림
- CEIL: 올림
- SIGN: 음수(-1), 0(0), 양수(1)
- POWER: 거듭제곱
10. 날짜 함수
- ORACLE: SYSDATE
- SQL SERVER: GETDATE()
11. 변환 함수
데이터 타입은 보통 숫자형/문자형/날짜형이 핵심이다.
변환 함수는 타입을 바꿔준다.
- TO_NUMBER(문자형)
- TO_CHAR(숫자/날짜형, 형식)
- TO_DATE(문자형, 형식)
포인트
- 날짜형과 문자형은 겉으로 형식이 같아 보여도
내부 데이터는 완전히 다르다. - 비교/정렬/계산에서 차이가 난다.
12. 집계 함수(다중행 함수)
집계함수 특징
- 다중행 함수(N → 1)
- NULL 제외 계산이 원칙
- WHERE 절에서 사용 불가
- HAVING 절에서는 사용 가능
집계함수 종류
- COUNT, SUM, AVG, MIN, MAX
COUNT 관련 포인트
- COUNT(*)는 행 수 자체를 세므로 NULL 포함
- COUNT(컬럼)은 해당 컬럼이 NULL이면 제외하고 센다
- COUNT(1), COUNT(0)도 표현식이
항상 NULL이 아니라서 결과적으로
전체 행 수를 세는 용도로 자주 등장한다
SELECT
COUNT(*) AS ROW_CNT,
COUNT(SAL) AS SAL_CNT
FROM EMP;
13. NULL 관련 함수
- NVL(컬럼, 대체값)
- NULLIF(컬럼1, 컬럼2)
- COALESCE(컬럼1, 컬럼2, 컬럼3, ...)
예시
SELECT NVL(NICKNAME, 'guest')
FROM MEMBER;
SELECT COALESCE(PHONE, MOBILE, 'no-contact')
FROM MEMBER;
14. CASE / DECODE
CASE
- 조건에 따라 값을 분기 처리한다.
- CASE 시작, END 끝
SELECT
SCORE,
CASE
WHEN SCORE >= 90 THEN 'A'
WHEN SCORE >= 80 THEN 'B'
ELSE 'C'
END AS GRADE
FROM EXAM;
중복을 줄이기 싫을 경우(비교 대상이 동일하면)
SELECT
SUBJECT_CODE,
CASE SCORE
WHEN >= 90 THEN 'A'
WHEN >= 80 THEN 'B'
ELSE 'C'
END AS GRADE
FROM EXAM;
DECODE(ORACLE)
- ORACLE에서는 CASE를 더 줄여서
DECODE로 쓰기도 한다.
SELECT
SUBJECT_CODE,
DECODE(SUBJECT_CODE, '201', '수학', '202', '과학', '기타') AS SUBJECT_NAME
FROM SUBJECT;
15. WHERE 절
WHERE는 특정 조건에 부합되는
튜플(행) 데이터만 조회할 때 사용한다.
기본 비교 연산자
- =
- !=, <>, ^= (DBMS에 따라 표현이 다르게 소개되는 경우가 있음)
- >
- <
- >=
- <=
조건 표현 연산자
- AND
- OR
- IN
- BETWEEN A AND B
- NOT
날짜 조건 조회
- 날짜도 비교가 가능하다.
예시
WHERE ORDER_DATE < '2024-12-15'
WHERE ORDER_DATE BETWEEN '2024-12-01' AND '2024-12-31'
LIKE 연산자(조커 카드)
- %: 0개 이상의 문자를 의미
- _: 정확히 1개의 문자를 의미
패턴 예시
- '%라면%': 라면 앞뒤로 뭐가 붙든 가능(포함)
- '%라면': 라면으로 끝나는 값
- '_라면%': 라면 앞에 정확히 1글자만 있어야 함
ESCAPE
- % 혹은 _를 와일드카드가 아니라
문자 자체로 찾고 싶을 때 사용한다.
예시
WHERE NAME LIKE '%/_라면' ESCAPE '/'
-- '/_'는 '_' 문자 자체를 의미
-- 즉 '_라면'이 문자 그대로 포함된 값을 찾는 형태
NULL 비교 연산자
- IS NULL: 값이 NULL인 경우
- IS NOT NULL: 값이 NULL이 아닌 경우(값 존재)
주의
- = NULL, != NULL 같은 표현은 오류/무의미
(정상 비교가 아니다)
16. 연산자 우선순위
아래로 내려갈수록 후순위
- 괄호 ()
- 곱셈 *
- 나눗셈 /
- 나머지 연산 %
- 비교 연산자(<, >, = 등)
- LIKE
- BETWEEN
- IN
- IS NULL
- IS NOT NULL
- NOT (필기에는 NNOT로 적어뒀지만 의미는 NOT)
- AND
- OR
헷갈리면 괄호로 의도를 고정하는 게 제일 안전하다.
17. GROUP BY 절
GROUP BY
- 특정 컬럼을 기준으로 데이터를 그룹화하여
집계함수 결과를 산출한다.
18. HAVING 절
HAVING
- 그룹화된 결과에 대한 조건
- WHERE는 행 단위 조건,
HAVING은 그룹 단위 조건 - WHERE에서는 집계 함수 사용 불가,
HAVING에서는 사용 가능
예시
SELECT DEPT, AVG(SAL) AS AVG_SAL
FROM EMP
GROUP BY DEPT
HAVING AVG(SAL) > 1000;
성능 포인트
- GROUP BY는 리소스 소모가 크므로
WHERE로 먼저 필터링 후 수행하는 것이 유리하다.
SELECT DEPT, AVG(SAL) AS AVG_SAL
FROM EMP
WHERE DEPT != '기획'
GROUP BY DEPT
HAVING AVG(SAL) > 1000;
19. ORDER BY 절
ORDER BY
- 결과를 정렬할 때 사용한다.
- ASC: 오름차순(기본값, 생략 가능)
- DESC: 내림차순
- 리소스를 많이 먹는 편이라 항상 마지막에 실행된다
(처리 순서의 O)
활용)
두 가지 이상 기준 정렬 가능
ORDER BY SAL DESC, BONUS ASC;
컬럼 번호로 정렬 가능
ORDER BY 2 DESC, 3 ASC;
GROUP BY 결과도 정렬 가능(집계함수 기준 정렬)
SELECT DEPT, AVG(SAL) AS AVG_SAL
FROM EMP
GROUP BY DEPT
ORDER BY AVG(SAL) DESC;
ORDER BY 특징
SELECT보다 나중에 수행되므로
SELECT에서 선언한 별칭 사용 가능
ORDER BY AVG_SAL DESC;
GROUP BY보다 나중에 수행되므로 집계함수 사용 가능
20. 데이터 타입에 따른 정렬 순서(오름차순 기준)
- 숫자형: 작은 수 → 큰 수
- 문자형: 사전 순
- 날짜형: 과거 → 미래
- NULL 정렬 차이 (꼭 기억해두자)
- ORACLE: NULL을 최대값처럼 취급
- SQL SERVER: NULL을 최소값처럼 취급
마무리 요약
공격수가 해써오!
FWG HSO
FROM → WHERE → GROUP BY
→ HAVING → SELECT → ORDER BY
이거 하나로 별칭 함정, 집계함수 위치,
HAVING 존재 이유가 한 번에 정리된다.
'개주 훈련일지 > 🎰 SQLD 준비' 카테고리의 다른 글
| SQLD 데이터 모델과 SQL (0) | 2026.02.13 |
|---|---|
| SQLD 데이터 모델링의 이해 (0) | 2026.02.08 |