Oracle SQL 기초 가이드
SQL을 처음 접한다면 이 글부터 읽으세요. 이 글에서는 Oracle SQL의 뼈대인 분류·타입·테이블 생성과 기본 조회를 다룹니다.
예제 테이블은 세 개입니다. 뒤의 모든 글에서 같은 테이블을 씁니다.
EMPLOYEE(직원)DEPARTMENT(부서)ORDERS(주문)
다음 글: Oracle SQL 함수 가이드
SQL 4가지 분류
SQL은 “무엇을 원하는지”를 선언하는 언어입니다. 명령의 성격에 따라 4가지로 나뉩니다. 이 분류를 알면 자동 저장되는지(COMMIT), **되돌릴 수 있는지(ROLLBACK)**가 바로 보입니다.
| 분류 | 풀네임 | 대표 명령 | 역할 |
|---|---|---|---|
| DDL | Data Definition | CREATE, ALTER, DROP, TRUNCATE | 구조(테이블 등) 정의 |
| DML | Data Manipulation | SELECT, INSERT, UPDATE, DELETE | 데이터 조작 |
| TCL | Transaction Control | COMMIT, ROLLBACK, SAVEPOINT | 변경 확정/취소 |
| DCL | Data Control | GRANT, REVOKE | 권한 부여/회수 |
중요: DDL은 실행 즉시 자동 커밋되어 되돌릴 수 없습니다. 반면 DML(INSERT/UPDATE/DELETE)은 COMMIT 전까지 ROLLBACK으로 취소할 수 있습니다.
데이터 타입
컬럼을 만들 때 “어떤 종류의 값이 들어가는지”를 정합니다. Oracle에서 실제로 쓰는 핵심만 추렸습니다.
| 타입 | 설명 | 예 |
|---|---|---|
NUMBER(p, s) |
숫자. p=전체 자릿수, s=소수 자릿수 | NUMBER(10,2) → 12345678.99 |
VARCHAR2(n) |
가변 길이 문자열 (가장 많이 씀) | VARCHAR2(100) |
CHAR(n) |
고정 길이 문자열 (남으면 공백 채움) | CHAR(2) → ‘KR’ |
DATE |
날짜 + 시간(초 단위) | 2026-06-01 13:30:00 |
TIMESTAMP |
날짜 + 시간(밀리초·타임존) | 정밀 시간 |
CLOB |
대용량 텍스트 | 게시글 본문 |
VARCHAR가 아니라 **VARCHAR2**를 쓰는 게 Oracle 관례입니다. 길이는 보통 바이트 기준이라 한글을 넉넉히 담으려면 여유 있게 잡으세요.
테이블 만들기 (DDL)
생성 (CREATE)
CREATE TABLE DEPARTMENT (
DEPT_ID NUMBER PRIMARY KEY, -- 기본키 (중복·NULL 불가)
DEPT_NAME VARCHAR2(50) NOT NULL, -- 필수 입력
LOCATION VARCHAR2(50)
);
CREATE TABLE EMPLOYEE (
EMP_NO NUMBER PRIMARY KEY,
EMP_NAME VARCHAR2(50) NOT NULL,
DEPT_ID NUMBER,
SALARY NUMBER(10) DEFAULT 0, -- 기본값
HIRE_DATE DATE DEFAULT SYSDATE,
EMAIL VARCHAR2(100) UNIQUE, -- 중복 불가
CONSTRAINT FK_DEPT FOREIGN KEY (DEPT_ID) -- 외래키
REFERENCES DEPARTMENT (DEPT_ID)
);
제약조건 (Constraint)
잘못된 데이터가 애초에 못 들어오게 막는 규칙입니다. 데이터 무결성의 핵심입니다.
| 제약조건 | 의미 |
|---|---|
PRIMARY KEY |
각 행을 구분하는 고유값. 중복·NULL 불가 |
FOREIGN KEY |
다른 테이블의 PK를 참조 (관계 연결) |
NOT NULL |
반드시 값이 있어야 함 |
UNIQUE |
중복 불가 (단, NULL은 허용) |
CHECK |
조건 만족하는 값만 (CHECK (SALARY >= 0)) |
DEFAULT |
값을 안 넣으면 들어가는 기본값 |
구조 변경 (ALTER) / 삭제 (DROP)
ALTER TABLE EMPLOYEE ADD (PHONE VARCHAR2(20)); -- 컬럼 추가
ALTER TABLE EMPLOYEE MODIFY (EMP_NAME VARCHAR2(100)); -- 타입 변경
ALTER TABLE EMPLOYEE DROP COLUMN PHONE; -- 컬럼 삭제
DROP TABLE EMPLOYEE; -- 테이블 통째로 삭제
TRUNCATE TABLE EMPLOYEE; -- 데이터만 전부 삭제(구조 유지, 매우 빠름, 롤백 불가)
세 가지 삭제는 꼭 구분하세요.
DELETE는 행 단위·롤백 가능,TRUNCATE는 전체 비우기·빠름·롤백 불가,DROP은 테이블 자체 제거입니다.
조회의 기본 (SELECT)
SELECT * FROM EMPLOYEE; -- 전체 컬럼
SELECT EMP_NO, EMP_NAME FROM EMPLOYEE; -- 특정 컬럼
SELECT EMP_NAME AS NAME FROM EMPLOYEE; -- 별칭(Alias)
SELECT DISTINCT DEPT_ID FROM EMPLOYEE; -- 중복 제거
AS는 생략 가능합니다. 별칭에 공백·대소문자를 살리려면 큰따옴표("Full Name")를 씁니다.
문자열 연결은 ||입니다.
SELECT EMP_NAME || ' (' || DEPT_ID || ')' AS LABEL
FROM EMPLOYEE; -- 홍길동 (10)
SQL 실행 순서 (꼭 기억)
작성 순서와 실제 처리 순서가 다릅니다. 이걸 알면 “왜 WHERE에서는 별칭을 못 쓸까?” 같은 의문이 바로 풀립니다.
작성: SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY
처리: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
SELECT(별칭이 정해지는 시점)가 WHERE보다 나중에 처리되므로 WHERE에서는 SELECT의 별칭을 쓸 수 없고, ORDER BY는 SELECT 이후라 별칭 사용이 가능합니다.
조건 걸기 (WHERE)
비교·논리 연산자
SELECT * FROM EMPLOYEE WHERE EMP_NO = 1001;
SELECT * FROM EMPLOYEE
WHERE DEPT_ID = 10
AND SALARY >= 5000; -- AND, OR, NOT 조합
연산자: =, !=(<>), >, <, >=, <=, AND, OR, NOT
LIKE
WHERE NAME LIKE '김%' -- 김으로 시작
WHERE NAME LIKE '%김' -- 김으로 끝
WHERE NAME LIKE '%김%' -- 김 포함
WHERE CODE LIKE 'A_C' -- A?C (가운데 한 글자)
%는 0글자 이상, _는 정확히 1글자입니다. %나 _ 자체를 검색하려면 ESCAPE를 씁니다.
WHERE RATE LIKE '50\%%' ESCAPE '\' -- "50%"로 시작하는 값
IN / BETWEEN
WHERE DEPT_ID IN (10, 20, 30); -- 여러 값 중 하나
WHERE SALARY BETWEEN 3000 AND 5000; -- 3000 이상 5000 이하(양끝 포함)
NULL 다루기
NULL은 “값이 없음”이라 =로 비교가 안 됩니다. 반드시 IS NULL / IS NOT NULL을 써야 합니다.
WHERE COMMISSION IS NULL; -- 맞음
WHERE COMMISSION = NULL; -- 틀림. 항상 거짓 → 결과 0건
NULL과의 모든 산술·비교는 결과가
UNKNOWN이 됩니다. (NULL + 100→ NULL,NULL = NULL→ 거짓) 이 성질이 뒤에서 LEFT JOIN, NOT IN 함정의 원인이 됩니다.
정렬 (ORDER BY)
SELECT * FROM EMPLOYEE ORDER BY SALARY DESC; -- 내림차순
SELECT * FROM EMPLOYEE ORDER BY DEPT_ID ASC, SALARY DESC; -- 다중 정렬
SELECT * FROM EMPLOYEE ORDER BY SALARY DESC NULLS LAST; -- NULL을 맨 뒤로
ASC(오름차순)가 기본값이라 생략 가능합니다. Oracle은 기본적으로 NULL을 가장 큰 값으로 취급하므로(ASC면 뒤, DESC면 앞), 필요하면 NULLS FIRST / NULLS LAST로 명시하세요.
정리
이 글에서 다룬 것: SQL 4분류, 데이터 타입, CREATE TABLE, SELECT, WHERE, ORDER BY. 다음 단계는 조회에 살을 붙이는 함수입니다.
다음 글: Oracle SQL 함수 가이드