[SQL 기본]
1-1. 관계형 데이터베이스 개요
1-1-1. DBMS(DataBase Management System)
1-1-2. SQL(Structured Query Language)
1-1-3. 관계대수 연산자
2-1. SELECT 문
2-1-1. SELECT 문의 구조
3-1. 함수
3-1-1. 함수
3-1-2. 문자함수
3-1-3. 숫자함수
3-1-4. 날짜함수
3-1-5. 변환함수
3-1-6. 집계함수
3-1-7. NULL 관련 함수
3-1-8. CASE 문 / DECODE 관련 함수
4-1. WHERE 절
4-1-1. 기본 비교 연산자
4-1-2. 조건 표현 연산자
4-1-3. LIKE 연산자
4-1-4. NULL 비교 연산자
5-1. GROUP BY, HAVING 절
5-1-1. GROUP BY
5-1-2. HAVING
6-1. ORDER BY 절</1>
6-1-1. 정렬 키워드
6-1-2. ORDER BY 절 활용
6-1-3. ORDER BY 절 특징
6-1-4. 데이터 형에 따른 정렬 순서 (오름차순 기준)
7-1. 조인
7-1-1. 종류
8-1. 표준조인
8-1-1. INNER JOIN
8-1-2. NATURAL JOIN
8-1-3. CROSS JOIN
8-1-4. OUTER JOIN
[SQL 기본]
1-1. 관계형 데이터베이스 개요
데이터베이스에 접근을 하기 위해서는 해당 공간을 관리해주는 시스템을 통해서 접근할 수 있는데, 이를 RDBMS라고 한다.
DBMS 중에서 가장 보편적으로 사용되는 것이 RDBMS 이다.
❗시험에는 RDBMS가 가장 잘 나오며 그중에서도 Oracle, SQL Server 가 가장 잘 나온다.
1️⃣ DBMS(DataBase Management System)
🔹 DBMS : 데이터베이스를 관리 및 접근하기 위한 환경을 제공하는 시스템
🔹 RDBMS (Relational DMBS, 관계형 DBMS)
- 데이터를 테이블 형태로 저장하고 테이블간 관계를 활용하여 관리하는 데이터베이스
- 1970년 IBM의 에드가 F.커드(Edgar F.Codd)가 처음 제안한 모델
- 대표적인 RDBMS : Oracle, SQL Server, MySQL, PostgreSQL 등

2️⃣ SQL(Structured Query Language)
DBMS에서 DB로 접근할 때는 컴퓨터가 이해할 수 있는 언어로 접근해야 한다.
이 언어가 바로 SQL이다.
SQL은 RDBMS에서 데이터를 생성, 조회, 수정, 삭제하기 위한 국제 표준 언어이다.
🔹 데이터 정의어(DDL) : 테이블 생성, 변경, 삭제 ➜ CREATE, ALERT, DROP, RENAME, TRUNCATE
🔹 데이터 조작어(DML) : 데이터를 조회, 삽입, 수정, 삭제 ➜ SELECT, INSERT, UPDATE, DELETE
※ SELECT 를 데이터 조회어(DQL)로 구분하기도 함
🔹 데이터 제어어(DCL) : 권한 관리 ➜ GRANT, REVOKE
🔹 트랜잭션 제어어(TCL) : 트랜잭션을 제어 ➜ COMMIT, ROLLBACK, SAVEPOINT
3️⃣ 관계대수 연산자
관계대수는 SQL의 이론적 기초가 되는 수학적 언어이다.

2-1. SELECT 문
1️⃣ SELECT 문의 구조
데이터베이스에서 데이터를 조회할 때 사용하는 가장 기본적인 명령어
| 명령어 | 설명 | 작성 순서 | 컴퓨터의 해석 순서 |
| SELECT | 조회하고자 하는 컬럼을 조회 | 1 | 5 |
| FROM | 어떤 테이블에서 데이터를 가져올 지 결정 | 2 | 1 |
| WHERE | 조건에 맞는 행을 필터링 | 3 | 2 |
| GROUP BY | 데이터를 그룹으로 묶음 | 4 | 3 |
| HAVING | 그룹에 대한 조건을 필터링 | 5 | 4 |
| ORDER BY | 정렬 기준 설정 | 6 | 6 |
❗ 컴퓨터의 해석 순서를 반드시 외워두자
🔹 별칭(ALIAS) 사용 시 주의사항
- AS 는 생략 가능하며 FROM 의 TABLE 에도 별칭 설정이 가능하다
- 숫자나 특수문자 사용 불가능
- 예약어 금지 ➜ 예 : SELECT, DROP, WHERE 등
- 쌍 따옴표("") 사용하여 특수문자와 공백 포함 가능
- 가능한 특수문자 : _, $, #
- WHERE 절은 SELECT 문 보다 먼저 수행되므로 SELECT 문에 정의된 별칭 사용 불가
🔹 CONCAT : 문자열 연결
- SELECT 성 || 이름 AS 전체이름 FROM 멤버 ➜ 성이름 형태로 출력
- Oracle에서는 '||' / SQL Server 에서는 '+' 로 사용
3-1. 함수
1️⃣ 함수
🔹 입력(Input)에 대한 특정 연산을 수행한 후, 결과(Output)을 반환하는 약속된 코드 블록
🔹 단일행 함수 : Input 1 > Output 1
🔹 다중행 함수 : Input N > Output 1
※ Oracle 에서는 함수를 테스트하기 위해 더미 테이블인 DUAL 을 자주 사용함
2️⃣ 문자함수
| 함수형 | 설명 | 사례 |
| LOWER(문자열) | 문자형을 소문자로 변환 | LOWER("DAVID") = 'david' |
| UPPER(문자열) | 문자형을 대문자로 변환 | UPPER("david") = 'DAVID' |
| SUBSTR(문자열, 시작위치, 문자열 길이) | 시작 위치에서 문자열의 길이만큼 반환 | SUBSTR("Hi David", 1, 2) = "Hi" SUBSTR("Hi David", -5) = 'David' ※ 문자열 길이가 X = 끝까지 출력해라 |
| TRIM(문자열, 삭제 문자열) | 왼쪽과 오른쪽의 공백 또는 지정한 문자를 제거 | TRIM(' Hello World ') = 'Hello World' TRIM('!!!Wow!!!', '!') = 'Wow' |
| LTRIM(문자열, 삭제 문자열) | 왼쪽 공백 또는 지정한 문자를 제거 | TRIM(' Hello World ') = 'Hello World ' TRIM('!!!Wow!!!', '!') = 'Wow!!!' |
| RTRIM(문자열, 삭제 문자열) | 오른쪽 공백 또는 지정한 문자를 제거 | TRIM(' Hello World ') = ' Hello World' TRIM('!!!Wow!!!', '!') = ' !!!Wow' |
| LENGTH(문자열) | 문자열 길이 반환(공백도 문자열) | LENGTH('Hello World') = 11 |
| REPLACE(문자열, 변경대상문자열, 변경후문자열) | 변경대상문자열을 다른 문자열로 변경 | REPLACE('Hello John', 'john', 'Tim') = 'Hello Tim' REPLACE('Hello World', 'World') = 'Hello' |
| ASCII(문자) | 아스키코드로 변환 | ASCII('A') = 65 |
※ 문자열 데이터는 작은 따옴표('')로 표현
3️⃣ 숫자함수
| 함수형 | 설명 | 사례 |
| ABS(숫자) | 절댓값 | ABS(-3) = 3 ABS(-10.4) = 10.4 |
| MOD(숫자 1, 숫자 2) | 숫자1을 숫자2로 나눈 나머지 | MOD(10, 2) = 0 MOD(11, 3) = 2 |
| ROUND(숫자, 자릿수) | 자릿수 아래에서 반올림 | ROUND(15.58, 1) = 15.6 ROUND(15.58) = 16 ROUND(15.58, -1) = 20 |
| TRUNC(숫자, 자릿수) | 자릿수 아래를 버림 | TRUNC(15.58, 1) = 15.5 TRUNC(15.58) = 15 TRUNC(15.58, -1) = 10 |
| FLOOR(숫자) | 작거나 같은 최대 정수 | FLOOR(3.58) = 3 |
| CEIL(숫자) | 크거나 같은 최소 정수 | CEIL(3.58) = 4 |
| SIGN(숫자) | 양수면 1, 음수면 -1 | SIGN(3.58) = 1 SIGN(-3) = -1 |
| POWER(숫자, 지수) | 지수만큼 제곱 | POWER(2, 3) = 8 |
4️⃣ 날짜함수
| 함수명 | 설명 | 사례 |
| SYSDATE / GETDATE() | 현재 날짜와 시간을 날짜형으로 도출 | SYSDATE = 2026-01-01 13:46:12.000 |
※ SYSDATE 는 Oracle, GETDATE() 는 SQL Server 함수
※ 날짜형은 날짜 간 덧셈 / 뺄셈, 정렬 등의 활용 가능
5️⃣ 변환 함수
| 함수형 | 설명 | 사례 |
| TO_NUMBER(문자형) | 문자형을 숫자로 변환 | TO_NUMBER('2025') = 2025 |
| TO_CHAR(숫자/날짜형, 형식) | 형식에 맞는 문자형으로 변환 | TO_CHAR(1234567.89, '9,999,999.99') = 1,234,567.89 TO_CHAR(SYSDATE, 'YYYYMMDD') = 20250305 |
| TO_DATE(문자형, 형식) | 문자형을 날짜로 변환 | TO_DATE('2025-03-01', 'YYYY-MM-DD') = 2025-03-01 TO_DATE('20205/03/01', 'YYYY/MM/DD') = 2025/03/01 |
※ 날짜형과 문자형은 겉으로는 형식이 같아 보여도 내부적으로는 완전히 다른 데이터이다.
6️⃣ 집계함수
🔹 다중 함수 (Input 이 N 개인데 출력이 1개인 것)
🔹 COUNT, SUM, AVG, MIN, MAX 등
🔹 WHERE 절에서는 집계함수 사용 불가능
🔹 NULL 제외 계산이 원칙
7️⃣ NULL 관련 함수
🔹 NVL(컬럼, 대체값) : 컬럼값이 NULL이면 대체값, NULL이 아니면 원래값
🔹 NULLIF(컬럼 1, 컬럼 2) : 두 컬럼값이 같으면 NULL, 다르면 첫 번째 값
🔹 COALESCE(컬럼 1, 컬럼 2, 컬럼 3, ...) : 가장 먼저 NULL이 아닌 값
8️⃣ CASE 문 / DECODE 함
조건에 따라 값을 분기처리 하는 함수
🔹 CASE 문
SELECT 과목코드,
CASE
WHEN 과목코드 = '201' THEN '수학'
WHEN 과목코드 = '202' THEN '과학'
WHEN 과목코드 = '203' THEN '컴퓨터'
ELSE '교양'
END AS 과목명
FROM 과목
SELECT 과목코드,
CASE 과목코드
WHEN '201' THEN '수학'
WHEN '202' THEN '과학'
WHEN '203' THEN '컴퓨터'
ELSE '교양'
END AS 과목명
FROM 과목
🔹 DECODE(컬럼, 값 1, 반환 1, 값 2, 반환 2, ..., 반환 N)
SELECT 과목코드,
DECODE(과목코드,
'201', '수학',
'202', '과학',
'203', '컴퓨터',
'교양') AS 과목명
FROM 과목
※ DECODE 는 Oracle 전용 함수이다.
4-1. WHERE 절
특정 조건에 부합하는 튜플(행) 데이터들을 조회할 때 사용

1️⃣ 기본 비교 연산자
| 연산자 | 설명 | 사례 |
| = | 같다 | WHERE 나이 = 21 ➜ 이순신, 장보고 |
| !=, <>, ^= | 다르다 | WHERE 나이 != 21 ➜ 홍길동, 임꺽정, 강감찬, 이성계 |
| > | 크다 | WHERE 나이 > 22 ➜ 이성계 |
| < | 작다 | WHERE 나이 < 22 ➜ 홍길동, 이순신, 임꺽정, 장보고 |
| >= | 크거나 같다 | WHERE 나이 >= 22 ➜ 강감찬, 이성계 |
| <= | 작거나 같다 | WHERE 나이 <= 21 ➜ 홍길동, 이순신, 임꺽정, 장보고 |
2️⃣ 조건 표현 연산자
| 표현 | 설명 | 사례 |
| AND | 두 조건을 모두 만족 | WHERE 나이 >= 21 AND 나이 <= 22 ➜ 이순신, 장보고, 강감찬 |
| OR | 두 조건 중 하나만 만족 | WHERE 나이 = 20 OR 나이 = 23 ➜ 홍길동, 임꺽정, 이성계 |
| IN | 여러 값 중 하나 | WHERE 나이 IN (20, 21, 22) ➜ 홍길동, 이순신, 임꺽정, 장보고, 강감찬 |
| BETWEEN A AND B | 범위 조건 (컬럼 >= A AND 컬럼 <= B) |
WHERE 나이 BETWEEN 21 AND 22 ➜ 이순신, 장보고, 강감찬 |
| NOT | 조건에 미해당 | WHERE 나이 NOT IN (20, 21, 22) ➜ 이성계 WHERE 나이 NOT BETWEEN 21 AND 22 ➜ 홍길동, 임꺽정, 이성계 |
3️⃣ LIKE 연산자
🔹 % : 0개 이상의 문자를 의미함
🔹 _ : 정확히 1개의 문자를 의미함
※ '%' 혹은 '_' 가 문자 자체로 포함된 값을 찾고 싶을 때는 ESCAPE를 사용함
4️⃣ NULL 비교 연산
🔹 IS NULL : 값이 NULL인 경우
🔹 IS NOT NULL : 값이 NULL이 아닌 경우
5️⃣ 연산자 우선순위
괄호() ➜ 곱셈(*) ➜ 나눗셈(/) ➜ 나머지연산(%) ➜ 비교연산자(=, !=, <>, <, >, <=, >=), LIKE, BETWEEN, IN, IS NULL, IS NOT NULL ➜ NOT ➜ AND ➜ OR
5-1. GROUP BY, HAVING 절
1️⃣ GROUP BY 절
특정 컬럼을 기준으로 행들을 그룹화하여 집계함수 결과를 산출

2️⃣ HAVING BY 절
🔹 그룹화된 결과에 대한 조건 ➜ WHERE 은 튜플(행) 단위, HAVING은 그룹단위
🔹 보통은 GROUP BY 절과 함께 사용되지만, 단독으로도 사용 가능
🔹 WHERE 절에서는 집계 함수 사용이 불가능하지만 HAVING 절에서는 사용 가능
🔹 GROUP BY 절은 리소스 소모가 크므로 WHRE 절로 필터링을 한 후에 수행하는 것이 성능상 유리함

6-1. ORDER BY 절
결과를 정렬할 때 사용
1️⃣ 정렬 키워드
🔹 ASC : 오름차순 ➜ 기본값으로 생략 가능
🔹 DESC : 내림차순
2️⃣ ORDER BY 절 활용

※ 컬럼 번호를 활용해서도 정렬 가능 (급여 DESC, 보너스 ASC ➜ 2 DESC, 3 ASC)
3️⃣ ORDER BY 절 특징
🔹 SELECT 절보다 나중에 수행되므로 SELECT 절에서 선언된 별칭(ALIAS) 사용 가능
🔹 GROUP BY 절보다 나중에 수행되므로 집계함수 사용 가능
4️⃣ 데이터 형에 따른 정렬 순서 (오름차순 기준)
🔹 숫자형 : 작은 수 ➜ 큰 수
🔹 문자형 : 사전 순
🔹 날짜형 : 과거 ➜ 미래
🔹 NULL 정렬 : Oracle은 NULL을 최댓값으로, SQL Server는 NULL을 최솟값으로 처리
❗ Oracle과 SQL Server의 NULL 정렬 차이를 알아두자
7-1. 조인
둘 이상의 테이블을 연결하여 관련 데이터를 하나의 결과로 보여주는 SQL 연산
1️⃣ 종류
🔹 EQUI JOIN : Equal(=) 연산자(등호)를 사용해서 같은 값인 경우에 조인

🔹 NON EQUI JOIN : 비교 연산자(BETWEEN, >, <, !=)를 사용하는 조인

8-1. 표준조인
DBMS마다 조인 방식이 다르므로, ANSI / ISO SQL 표준으로 정립한 조인 (FROM절 JOIN 형태)
1️⃣ INNER JOIN
JOIN 조건에서 동일한 값이 있는 행만 반환
🔹 USING 조건절 : 컬럼명이 같은 컬럼들에 대해서 선택적으로 조인 가능

🔹 ON 조건절 : 컬럼명이 다르더라도 조인 조건 사용 가능

※ JOIN만 단독으로 사용 시 INNER JOIN을 의미하며, NULL 값은 조회 대상이 아님
2️⃣ NATURAL JOIN
🔹 두 테이블 간에 동일한 이름을 갖는 모든 컬럼에 대해 EQUI JOIN 수행
🔹 ON이나 USING 조건절 없이 조인 가능

3️⃣ CROSS JOIN
두 테이블의 모든 행을 조합해서 출력 (Cartesian Product 연산)

4️⃣ OUTER JOIN
JOIN 조건에서 동일한 값이 없는 행 반환 가능
🔹 LEFT OUTER JOIN
- 좌측 테이블이 기준이 되어 결과 생성
- 우측 테이블에서 가져오는 컬럼이 없으면 NULL
🔹 RIGHT OUTER JOIN
- 우측 테이블이 기준이 되어 결과 생성
- 좌측 테이블에서 가져오는 컬럼이 없으면 NULL
🔹 FULL OUTER JOIN
- 좌, 우측 테이블의 모든 데이터를 활용하여 결과 생성

🔗 출처
[SQLD 완벽 요약강의]
'자격증 > SQLD' 카테고리의 다른 글
| [SQLD][아답터] 3과목 - 2. 통계분석 (0) | 2026.05.17 |
|---|---|
| [SQLD][아답터] 3과목 - 1. R 기초와 데이터 마트 (0) | 2026.05.10 |
| [SQLD][아답터] 2과목 - 3. 관리 구문 (2) | 2026.04.24 |
| [SQLD][아답터] 2과목 - 2. SQL 활용 (6) | 2026.04.15 |
| [SQLD][아답터] 1과목 - 데이터 모델 (2) | 2026.03.28 |