✅ 핵심 개념 요약
인스턴스: 엔터티 안의 하나하나의 데이터(행, row)
예: 고객 엔터티에 있는 "홍길동"이라는 한 명의 고객 정보 → 인스턴스 하나!
관계(Relationship): 두 엔터티의 인스턴스끼리 연결되어 있는 상태
예: 고객 "홍길동"이 주문 "1001번"을 했다 → 이게 관계 하나야.
페어링(Pairing): 인스턴스끼리 짝을 짓는 것!
→ 관계는 결국 이런 "인스턴스 간의 짝"들의 모음
예시
엔터티 2개:
데이터 인스턴스:
고객 인스턴스:
C1: 홍길동
C2: 김영희
주문 인스턴스:
O1: 주문번호 1001
O2: 주문번호 1002
O3: 주문번호 1003
고객 C1(홍길동)이 O1, O3을 주문했고
고객 C2(김영희)가 O2를 주문했다면,
페어링은
이 각각이 관계 인스턴스 (페어링),
이 전체를 모아서 말하면 → 고객과 주문 간의 관계(Relationship)
| 요소 | 예시 |
|---|---|
| 관계명 | 주문한다 (고객 ― 주문한다 ― 주문) |
| 관계차수 | 1\:N (고객 1명은 주문 여러 개 가능) |
| 선택성 | 고객은 주문이 없어도 된다 → 선택 관계 (○) |
IE표기법
고객 ○──────< 주문
주문 입장에선 → 고객이 필수 (직선)
고객 입장에선 → 주문은 선택 (○ 있음)
차수는 1:N (고객 1명 : 주문 여러 개)
| 객체 이름 | 설명 |
|---|---|
| 테이블 | 데이터를 저장하는 구조 (행/열) |
| 뷰(View) | SELECT 결과를 저장해둔 가상 테이블 |
| 인덱스 | 검색 속도 빠르게 도와주는 구조 |
| 시퀀스 | 자동 번호 증가하는 번호표 |
| 트리거 | 어떤 일이 벌어졌을 때 자동으로 실행되는 코드 |
| 프로시저/함수 | 저장된 SQL 코드 조각들 |

┌────────────┬─────────────────────────────────────┬────────────────────────────────────────┐
│ 구분 │ 설명 │ 종류 │
├────────────┼─────────────────────────────────────┼────────────────────────────────────────┤
│ DDL │ Data Definition Language │ CREATE, ALTER, DROP, TRUNCATE │
│ │ (데이터 정의어) │ │
├────────────┼─────────────────────────────────────┼────────────────────────────────────────┤
│ DML │ Data Manipulation Language │ INSERT, DELETE, UPDATE, MERGE │
│ │ (데이터 조작어) │ │
├────────────┼─────────────────────────────────────┼────────────────────────────────────────┤
│ DCL │ Data Control Language │ GRANT, REVOKE │
│ │ (데이터 제어어) │ │
├────────────┼─────────────────────────────────────┼────────────────────────────────────────┤
│ TCL │ Transaction Control Language │ COMMIT, ROLLBACK │
│ │ (트랜잭션 제어어) │ │
├────────────┼─────────────────────────────────────┼────────────────────────────────────────┤
│ DQL │ Data Query Language │ SELECT │
│ │ (데이터 질의어) │ │
└────────────┴─────────────────────────────────────┴────────────────────────────────────────┘
FROM > WHERE > GROUP BY > HAVING > SELECT > ORDER BY 순서대로
그래서 as(alisas)의 경우 SELECT 문보다 늦게 수행되는 ORDER BY 절에서만 컬럼 별칭 사용 가능(그 외 절에서 사용시 에러 발생)
테이블 여러 개 전달 가능(컴마로 구분) -> 조인 조건 없이 테이블명만 나열 시 카티시안 곱 발생 주의!
테이블 별칭 선언 가능(ORACLE 은 AS 사용 불가, SQL Server 는 사용/생략가능)
※ 테이블 별칭 선언 시 컬럼 구분자는 테이블 별칭으로만 전달(테이블명으로 사용 시 에러 발생)

select에 emp.으로 하면 오류
별칭 e로 사용해야 가능
ORACLE 에서는 FROM 절 생략 불가(의미상 필요 없는 경우 DUAL 테이블 선언)


※ ORACLE 23c 버전부터는 생략 가능
SQL Server 에서는 FROM 절 필요 없을 경우 생략 가능(오늘 날짜 조회 시)
단일행 함수 형태로 output은 대부분 문자값
| 함수명 | 함수기능 | 사용예시 | 출력 | 기타설명 |
|---|---|---|---|---|
LOWER(대상) | 문자열을 소문자로 | LOWER('ABC') | abc | |
UPPER(대상) | 문자열을 대문자로 | UPPER('abc') | ABC | |
SUBSTR(대상, m, n) | 문자열 중 m위치에서 n개의 문자 추출 | SUBSTR('ABCDE',2,3) | BCD | n 생략 시 끝까지 추출 |
SUBSTR('ABCDE',2) | BCDE | |||
SUBSTR('ABCDE',-4,3) | BCD | 뒤에서 4번째(B)부터 오른쪽으로 스캔하여 3개 추출 | ||
INSTR(대상, 찾을문자열, m, n) | 대상에서 찾을문자열 위치 반환 | INSTR('A#B#C#', '#') | 2 | m과 n 생략 시 1로 해석 |
INSTR('A#B#C#', '#', 3, 2) | 6 | 3번째부터 두번째 발견된 # 위치 | ||
INSTR('A#B#C#', '#', -3, 2) | 2 | 뒤에서 3번째 #부터 왼쪽으로 스캔하여 두 번째 발견된 # 위치 | ||
LTRIM(대상, 삭제문자열) | 왼쪽에서 특정 문자 삭제 | LTRIM('AABABAA','A') | BABAA | |
RTRIM(대상, 삭제문자열) | 오른쪽에서 특정 문자 삭제 | RTRIM('AABABAA','A') | AABAB | |
TRIM(대상) | 양쪽의 공백 제거 | TRIM(' ABCDE ') | ABCDE | Oracle에서는 공백만 삭제 가능 |
LPAD(대상, n, 문자열) | 왼쪽에 문자 추가하여 총 n길이 반환 | LPAD('ABC',5,'*') | **ABC | |
RPAD(대상, n, 문자열) | 오른쪽에 문자 추가하여 총 n길이 반환 | RPAD('ABC',5,'*') | ABC** | |
CONCAT(대상1, 대상2) | 문자열 결합 | CONCAT('A','B') | AB | 두 개의 인수만 전달 가능 |
LENGTH(대상) | 문자열 길이 | LENGTH('ABCDE') | 5 | |
REPLACE(대상, 찾을문자열, 바꿀문자열) | 문자열 치환 및 삭제 | REPLACE('ABBA','AB','ab') | abBA | 세 번째 인수를 생략하거나 빈문자열 전달 시 찾을문자열 삭제 가능 |
TRANSLATE(대상, 찾을문자열, 바꿀문자열) | 글자를 1대1로 치환 | TRANSLATE('ABBA','AB','ab') | abba | A는 a로, B는 b로 각각 치환, 바꿀문자열 생략 불가. 빈문자열 전달시 NULL 리턴 |
SQL Server경우
SUBSTR -> SUBSTRING
LENGTH -> LEN
INSTR -> CHARINDEX
| 함수명 | 함수기능 | 사용예시 | 출력 | 기타설명 |
|---|---|---|---|---|
| ABS(숫자) | 절대값 반환 | ABS(-1.5) | 1.5 | |
| ROUND(숫자, 자리수) | 소수점 특정 자리에서 반올림 | ROUND(123.456, 2) | 123.46 | 소수점 둘째자리로 반올림 |
| ROUND(123.456, -2) | 100 | 자리수가 음수이면 정수자리에서 반올림 (십의 자리에서 반올림 진행) | ||
| TRUNC(숫자, 자리수) | 소수점 특정 자리에서 버림 | TRUNC(123.456, 2) | 123.45 | |
| SIGN(숫자) | 숫자가 양수면 1, 음수면 -1, 0이면 0 반환 | SIGN(100) | 1 | |
| FLOOR(숫자) | 작거나 같은 최대 정수 리턴 | FLOOR(3.5) | 3 | |
| CEIL(숫자) | 크거나 같은 최소 정수 리턴 | CEIL(3.5) | 4 | |
| MOD(숫자1, 숫자2) | 숫자1을 숫자2로 나누어 나머지 반환 | MOD(7, 2) | 1 | |
| POWER(m, n) | m의 n 거듭제곱 | POWER(2, 4) | 16 | |
| SQRT(숫자) | 루트값 리턴 | SQRT(16) | 4 |
ORACLE 과 SQL Server 함수 거의 달라 주의
| 함수명 | 함수기능 | 사용예시 | 출력 | 기타설명 |
|---|---|---|---|---|
| SYSDATE | 현재 날짜와 시간 리턴 | SYSDATE | 2024/02/14 18:44:34 | 날짜출력형식에 따라 다르게 출력됨 (날짜만 출력될 수 있음) |
| CURRENT_DATE | 현재 날짜 리턴 | CURRENT_DATE | 2024/02/14 | 날짜출력형식에 따라 다르게 출력됨 (시간이 출력될 수 있음) |
| CURRENT_TIMESTAMP | 현재 타임스탬프 리턴 | CURRENT_TIMESTAMP | 2024/02/14 18:45:29 +09:00 | |
| ADD_MONTHS(날짜, n) | 날짜에서 n개월 후 날짜 리턴 | ADD_MONTHS(SYSDATE, 3) | 2024/05/14 18:44:34 | n이 음수인 경우 n개월 이전 날짜 리턴 |
| MONTHS_BETWEEN(날짜1, 날짜2) | 날짜1과 날짜2의 개월 수 리턴 | MONTHS_BETWEEN(SYSDATE, HIREDATE) | 3.7234 | 날짜1 < 날짜2 로 전달 시 음수 리턴 |
| LAST_DAY(날짜) | 주어진 월의 마지막 날짜 리턴 | LAST_DAY(SYSDATE) | 2024/02/29 18:44:34 | |
| NEXT_DAY(날짜, n) | 주어진 날짜 이후 지정된 요일의 첫 번째 날짜 리턴 | NEXT_DAY(SYSDATE, 1) | 2024/02/18 18:51:35 | 1:일요일, 2:월요일, ..., 7:토요일 |
| ROUND(날짜, 자리수) | 날짜 반올림 | ROUND(SYSDATE, 'MONTH') | 2024-02-01 00:00 | 월 이전자리에서 반올림 |
| TRUNC(날짜, 자리수) | 날짜 버림 | TRUNC(SYSDATE, 'MONTH') | 2024-02-01 00:00 | 월 이전자리에서 버림 |
SQL Server에서는..
SYSDATE -> GETDATE
ADD_MONTHS -> DATEADD(월 뿐만 아니라 모든 단위 날짜 연산 가능)
MONTHS_BETWEEN -> DATEDIFF(두 날짜 사이의 년, 월, 일 추출)
| 함수명 | 함수기능 | 사용예시 | 출력 | 기타설명 |
|---|---|---|---|---|
| TO_NUMBER(문자) | 숫자 타입으로 변경하여 리턴 | TO_NUMBER('100') | 100 | 문자 '100'을 숫자 100으로 리턴 |
| TO_CHAR(대상, 포맷) | 1) 날짜의 포맷 변경 | TO_CHAR(SYSDATE, 'MM/DD/YYYY') | 02/14/2024 | 날짜 형식 변경 (리턴은 문자타입) |
| 2) 숫자의 포맷 변경 | TO_CHAR(9000, '9,999') | 9,000 | 천단위 구분기호 생성 (리턴은 문자타입) | |
| TO_CHAR(9000, '09999') | 09000 | 총 5자리로 리턴 (앞 자리를 0으로 채움) | ||
| TO_DATE(문자, 포맷) | 주어진 문자열을 포맷 형식에 맞게 읽어 날짜로 리턴 | TO_DATE('2024/01/01', 'YYYY/MM/DD') | 2024/01/01 00:00:00 | 날짜로 리턴됨 |
| FORMAT(날짜, 포맷) | 날짜의 포맷 변경 | FORMAT(GETDATE(), 'YYYY') | 2024 | SQL SERVER 함수 |
| CAST(대상 AS 데이터타입) | 대상을 주어진 데이터타입으로 변환 | CAST('100' AS int) | 100 | 문자 '100'을 숫자 100으로 리턴 |
SQL Server에서는..
TO_NUMBER, TO_DATE, TO_CHAR -> CONVERT(포맷 전달 시)
단순 변환일 경우 주로 CAST 사용
기타함수(NULL 치환함수 등)
| 함수명 | 함수기능 | 사용예시 | 출력 | 기타설명 |
|---|---|---|---|---|
| DECODE(대상, 값1, 리턴1, 값2, 리턴2, ..., 그외리턴) | 대상이 값1이면 리턴1, 값2와 같으면 리턴2, … 그 외에는 그외리턴 반환 | DECODE(DEPTNO, 10, A, B) | A 또는 B | 대소비교에 따른 치환 불가, 그외리턴 생략 시 NULL 반환 |
| NVL(대상, 치환값) | 대상이 널이면 치환값으로 치환하여 리턴 | NVL(COMM, 0) | COMM값 또는 0 | |
| NVL2(대상, 치환값1, 치환값2) | 대상이 널이면 치환값2로, 널이 아니면 치환값1로 리턴 | NVL2(COMM, COMM*1.1, 0) | COMM*1.1 또는 0 | COMM이 널이면 0, 아니면 COMM*1.1 반환 |
| COALESCE(대상1, 대상2, ..., 그외리턴) | 대상들 중 널이 아닌 첫 번째 값 리턴, 모두 널이면 NULL 반환 | COALESCE(NULL, 100) | 100 | 그외리턴 생략 시 NULL 반환 |
| ISNULL(대상, 치환값) | 대상이 널이면 치환값 리턴 | ISNULL(NULL, 100) | 100 | SQL Server 함수 |
| NULLIF(대상1, 대상2) | 두 값이 같으면 NULL, 다르면 대상1 리턴 | NULLIF(10, 20) | 10 | |
| CASE문 | 조건별 치환 및 연산 수행 | (아래에 별도 정리 가능) | (아래에 별도 정리) | 다양한 조건 분기 처리 가능. 복잡한 로직 구현 가능 |
decode 예시

부서번호 10이면 인사부, 20번이면 재무부, 나머지는 널값 리턴

DEPTNO가 10이면서 JOB이 CLERK이면 A,
DEPTNO가 10이면서 CLERK가 아니면 B,
DEPTNO가 10이 아니면 C
NVL, NVL2 예시

☞ NVL2의 경우 NVL이랑 다르게 COMM의 값이 널이 아닐 때도 치환값 정의 가능.
COMM이 널이 아니면 10% 인상값, 널이면 500 리턴
casewhen 예시

동등비교 시 위처럼 비교대상(DEPTNO)를 CASE와 WHEN 사이에 배치하면서 WHEN절 마다 반복하지 않아
도 됨 (이 때 DEPTNO 데이터 타입과 WHEN절의 명시된 비교대상의 데이터타입 반드시 일치해야 함)
nullif 예시
null값 치환하기 위한 목적이 아닌,
특정 값과 일치하는 대상을 NULL 로 치환하기 위해 사용

결과 1 의 경우 COMM 의 값이 100 과 일치하는 행이 없으므로 원래 값을 유지,
결과 2 의 경우 COMM 의 값이 500 인 WARD 의 COMM 만 NULL 로 변경되어 출력
테이블의 데이터 중 원하는 조건에 맞는 데이터만 조회하고 싶을 경우 사용
| 조건문 | 설명 |
| ----------------------- | ------------------------------------------- |
| BETWEEN a AND b | A와 B 사이에 있는 범위 값을 모두 검색 |
| IN(a, b, c) | A, B, C 중 하나와 같은 값을 검색 |
| LIKE | 특정 패턴을 가지는 조건을 검색 (예: %, _ 와 함께 사용) |
| IS NULL / IS NOT NULL | NULL 값이거나, NULL이 아닌 값을 검색 |
| A AND B | A 조건과 B 조건을 모두 만족하는 값을 검색 |
| A OR B | A 조건이나 B 조건 중 하나라도 만족하는 값을 검색 |
| NOT A | A가 아닌 모든 조건을 검색 |
| !=, <> | A와 같지 않은 값을 검색 (두 문법 동일) |
포함연산자로 여러 상수와 일치하는 조건 전달 시 사용
상수를 괄호로 묶어서 동시에 전달(문자와 날짜 상수의 경우 반드시 홑따옴표와 함께)

동일한 조건대상(ENAME)이 계속 반복돼야 하는 불편함 ->in연산자를 쓰면 해소

조건 결과의 반대집합. 즉, 여집합을 출력하는 연산자
NOT 뒤에 오는 연산 결과의 반대 집합 출력
주로 NOT IN, NOT BETWEEN A AND B, NOT LIKE, NOT NULL 로 사용

