1. SQL 개요
1.1 SQL (Structured Query Language) 정의
- 관계형 데이터베이스(RDBMS)에서 데이터를 저장, 조회, 수정, 삭제하는 데 사용.
- 표준 SQL과 각 DBMS(Oracle, MySQL, SQL Server 등)에서 제공하는 확장 SQL이 있음.
1.2 SQL의 주요 유형
- DDL (Data Definition Language, 데이터 정의어)
- 데이터베이스 구조(테이블, 인덱스 등)를 정의하는 SQL.
- 주요 명령어:
CREATE
, ALTER
, DROP
, TRUNCATE
- DML (Data Manipulation Language, 데이터 조작어)
- 테이블에 데이터를 조작하는 SQL.
- 주요 명령어:
SELECT
, INSERT
, UPDATE
, DELETE
, MERGE
- DCL (Data Control Language, 데이터 제어어)
- 사용자 권한을 부여 및 제거하는 SQL.
- 주요 명령어:
GRANT
, REVOKE
- TCL (Transaction Control Language, 트랜잭션 제어어)
- 트랜잭션을 관리하는 SQL.
- 주요 명령어:
COMMIT
, ROLLBACK
, SAVEPOINT
2. 데이터 정의 (DDL)
2.1 테이블 생성 (CREATE)
sql복사편집CREATE TABLE EMP (
EMP_ID NUMBER PRIMARY KEY,
NAME VARCHAR2(100),
DEPT_ID NUMBER,
SALARY NUMBER
);
2.2 테이블 수정 (ALTER)
sql복사편집ALTER TABLE EMP ADD EMAIL VARCHAR2(100);
ALTER TABLE EMP MODIFY SALARY NUMBER(10,2);
ALTER TABLE EMP DROP COLUMN EMAIL;
2.3 테이블 삭제 (DROP, TRUNCATE)
sql복사편집DROP TABLE EMP;
TRUNCATE TABLE EMP;
DROP
: 테이블과 데이터 모두 삭제.
TRUNCATE
: 데이터만 삭제하고 테이블 구조는 유지.
3. 데이터 조작 (DML)
3.1 데이터 삽입 (INSERT)
sql복사편집INSERT INTO EMP (EMP_ID, NAME, DEPT_ID, SALARY)
VALUES (101, 'John Doe', 10, 5000);
3.2 데이터 수정 (UPDATE)
sql복사편집UPDATE EMP SET SALARY = 6000 WHERE EMP_ID = 101;
3.3 데이터 삭제 (DELETE)
sql복사편집DELETE FROM EMP WHERE EMP_ID = 101;
3.4 MERGE (데이터 존재 여부에 따라 INSERT 또는 UPDATE)
sql복사편집MERGE INTO EMP E
USING (SELECT 101 AS EMP_ID, 'John Doe' AS NAME, 10 AS DEPT_ID, 5000 AS SALARY FROM DUAL) S
ON (E.EMP_ID = S.EMP_ID)
WHEN MATCHED THEN
UPDATE SET E.SALARY = S.SALARY
WHEN NOT MATCHED THEN
INSERT (EMP_ID, NAME, DEPT_ID, SALARY) VALUES (S.EMP_ID, S.NAME, S.DEPT_ID, S.SALARY);
4. 데이터 조회 (SELECT)
4.1 기본 조회
sql복사편집SELECT * FROM EMP;
4.2 조건 조회 (WHERE)
sql복사편집SELECT * FROM EMP WHERE SALARY > 5000;
4.3 정렬 (ORDER BY)
sql복사편집SELECT * FROM EMP ORDER BY SALARY DESC;
4.4 중복 제거 (DISTINCT)
sql복사편집SELECT DISTINCT DEPT_ID FROM EMP;
4.5 그룹화 및 집계 함수
sql복사편집SELECT DEPT_ID, AVG(SALARY) AS AVG_SALARY
FROM EMP
GROUP BY DEPT_ID;
5. 조인 (JOIN)
5.1 INNER JOIN
sql복사편집SELECT E.EMP_ID, E.NAME, D.DEPT_NAME
FROM EMP E
INNER JOIN DEPT D ON E.DEPT_ID = D.DEPT_ID;
5.2 LEFT JOIN
sql복사편집SELECT E.EMP_ID, E.NAME, D.DEPT_NAME
FROM EMP E
LEFT JOIN DEPT D ON E.DEPT_ID = D.DEPT_ID;
5.3 RIGHT JOIN
sql복사편집SELECT E.EMP_ID, E.NAME, D.DEPT_NAME
FROM EMP E
RIGHT JOIN DEPT D ON E.DEPT_ID = D.DEPT_ID;
5.4 FULL OUTER JOIN
sql복사편집SELECT E.EMP_ID, E.NAME, D.DEPT_NAME
FROM EMP E
FULL OUTER JOIN DEPT D ON E.DEPT_ID = D.DEPT_ID;
6. 서브쿼리 (Subquery)
6.1 스칼라 서브쿼리
sql복사편집SELECT EMP_ID, NAME, (SELECT DEPT_NAME FROM DEPT WHERE DEPT_ID = EMP.DEPT_ID) AS DEPT_NAME
FROM EMP;
6.2 IN 서브쿼리
sql복사편집SELECT * FROM EMP WHERE DEPT_ID IN (SELECT DEPT_ID FROM DEPT WHERE LOCATION = 'Seoul');
6.3 EXISTS 서브쿼리
sql복사편집SELECT * FROM EMP WHERE EXISTS (SELECT 1 FROM DEPT WHERE DEPT.DEPT_ID = EMP.DEPT_ID);
7. 집합 연산
7.1 UNION (중복 제거)
sql복사편집SELECT NAME FROM EMP
UNION
SELECT NAME FROM DEPT;
7.2 UNION ALL (중복 포함)
sql복사편집SELECT NAME FROM EMP
UNION ALL
SELECT NAME FROM DEPT;
7.3 INTERSECT (교집합)
sql복사편집SELECT NAME FROM EMP
INTERSECT
SELECT NAME FROM DEPT;
7.4 MINUS (차집합)
sql복사편집SELECT NAME FROM EMP
MINUS
SELECT NAME FROM DEPT;
8. 윈도우 함수
8.1 순위 함수
sql복사편집SELECT EMP_ID, NAME, SALARY,
RANK() OVER (ORDER BY SALARY DESC) AS RANKING
FROM EMP;
8.2 이동 평균 함수
sql복사편집SELECT EMP_ID, NAME, SALARY,
LAG(SALARY, 1, 0) OVER (ORDER BY SALARY) AS PREV_SALARY,
LEAD(SALARY, 1, 0) OVER (ORDER BY SALARY) AS NEXT_SALARY
FROM EMP;
9. 트랜잭션 제어 (TCL)
9.1 COMMIT (변경 사항 저장)
sql복사편집COMMIT;
9.2 ROLLBACK (변경 사항 취소)
sql복사편집ROLLBACK;
9.3 SAVEPOINT (특정 지점 저장)
sql복사편집SAVEPOINT SP1;
DELETE FROM EMP WHERE EMP_ID = 101;
ROLLBACK TO SP1;
10. 인덱스 및 성능 최적화
10.1 인덱스 생성
sql복사편집CREATE INDEX IDX_EMP_NAME ON EMP(NAME);
10.2 실행 계획 확인
sql복사편집EXPLAIN PLAN FOR
SELECT * FROM EMP WHERE NAME = 'John Doe';