free your time

서비스기획, 항공, 장기렌트

1. SQL 개요

1.1 SQL (Structured Query Language) 정의

  • 관계형 데이터베이스(RDBMS)에서 데이터를 저장, 조회, 수정, 삭제하는 데 사용.
  • 표준 SQL과 각 DBMS(Oracle, MySQL, SQL Server 등)에서 제공하는 확장 SQL이 있음.

1.2 SQL의 주요 유형

  1. DDL (Data Definition Language, 데이터 정의어)
    • 데이터베이스 구조(테이블, 인덱스 등)를 정의하는 SQL.
    • 주요 명령어: CREATE, ALTER, DROP, TRUNCATE
  2. DML (Data Manipulation Language, 데이터 조작어)
    • 테이블에 데이터를 조작하는 SQL.
    • 주요 명령어: SELECT, INSERT, UPDATE, DELETE, MERGE
  3. DCL (Data Control Language, 데이터 제어어)
    • 사용자 권한을 부여 및 제거하는 SQL.
    • 주요 명령어: GRANT, REVOKE
  4. 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';