Post

03 SQL

03 SQL

1. SQL(Structured Query Language)

1. SQL

  • SQL은 관계형 데이터베이스(Relational Database) 에서 데이터를 다루기 위한 언어로,
  • 사용자는 SQL을 통해 데이터베이스에 질의(Query) 를 보내고,
  • 데이터베이스는 그 결과를 반환

2. SQL 주요 특징

  • 표준화된 언어
    • ANSI(미국표준협회)와 ISO(국제표준화기구)에서 표준화함.
    • MySQL, Oracle, PostgreSQL 등 거의 모든 DBMS에서 사용 가능 (약간의 방언 차이는 있음).
  • 선언형 언어
    • “어떻게”가 아니라 “무엇을” 하고 싶은지를 기술함.
    • 예: SELECT name FROM user WHERE age > 20;
  • 데이터 정의와 조작 모두 가능
    • 테이블 구조를 만드는 것(DDL)부터,
    • 데이터를 넣거나 수정하고 조회하는 것(DML)까지 하나의 언어로 처리 가능.
  • 관계형 모델 기반
    • 데이터를 행(Row)과 열(Column)로 구성된 테이블 형태로 관리.

3. SQL 종류

구분명칭주요 기능예시
DDLData Definition Language데이터 구조 정의CREATE, ALTER, DROP
DMLData Manipulation Language데이터 조회·조작SELECT, INSERT, UPDATE, DELETE
DCLData Control Language권한 제어GRANT, REVOKE
TCLTransaction Control Language트랜잭션 제어COMMIT, ROLLBACK, SAVEPOINT

1. DDL

1. DDL (Data Definition Language)

  • DDL은 데이터 정의 언어로,
  • 데이터베이스의 구조(테이블, 스키마, 인덱스 등) 를 정의·변경·삭제하기 위한 SQL 명령어 집합

2. 특징

구분설명
구조 중심 언어테이블, 인덱스, 뷰 등 객체의 형태를 다룸
자동 커밋실행 즉시 DB에 반영되며 ROLLBACK 불가능
트랜잭션 비지원DML과 달리 트랜잭션 제어 불가
데이터 미포함데이터(내용)가 아니라 스키마(형태)를 조작
복구 불가DROP, TRUNCATE 후에는 복원 불가

3. 명령어

명령어기능기본 형식비고
CREATE새 객체 생성CREATE TABLE 테이블명 (...);테이블, 인덱스, 뷰 등 생성
ALTER기존 구조 변경ALTER TABLE 테이블명 ADD 컬럼명 타입;컬럼 추가·수정·삭제
DROP객체 삭제DROP TABLE 테이블명;구조 자체 제거
TRUNCATE데이터 전체 삭제TRUNCATE TABLE 테이블명;구조는 유지, 데이터만 삭제
RENAME이름 변경RENAME old_name TO new_name;테이블명 변경

2. DML

1. DML (Data Manipulation Language)

  • DML은 데이터베이스 내의 데이터를 조회·추가·수정·삭제하기 위한 명령어 집합
  • 테이블 구조는 그대로 두고, 그 안의 실제 데이터를 다루는 언어

2. 특징

구분설명
트랜잭션 지원COMMIT, ROLLBACK을 통해 작업 단위 제어 가능
데이터 중심테이블 구조가 아닌 ‘데이터’ 조작에 초점
복구 가능COMMIT 전에는 ROLLBACK으로 원상복구 가능
가장 많이 사용실제 애플리케이션에서 가장 자주 사용되는 SQL 유형

3. 명령어

1. 기본명령어

명령어기능기본 형식비고
SELECT데이터 조회SELECT 컬럼 FROM 테이블 WHERE 조건;조회 전용, 원본 데이터 변경 없음
INSERT데이터 삽입INSERT INTO 테이블 (컬럼1, 컬럼2) VALUES (값1, 값2);새 행(Row) 추가
UPDATE데이터 수정UPDATE 테이블 SET 컬럼=값 WHERE 조건;조건 없으면 전체 수정 주의
DELETE데이터 삭제DELETE FROM 테이블 WHERE 조건;조건 없으면 전체 삭제 주의

3. DCL

1. DCL (Data Control Language)

  • 데이터베이스 사용자에게 권한을 부여하거나 회수하는 명령어 집합
  • 누가 어떤 데이터에 접근할 수 있는지를 제어하는 언어

2. 특징

구분설명
권한 제어 언어사용자에게 데이터 접근 권한을 부여하거나 회수
보안 관련데이터 무단 접근이나 조작을 방지
DDL과 유사하게 자동 커밋실행 즉시 반영, ROLLBACK 불가능
데이터 조작 불가데이터 내용은 변경하지 않음
DBA(관리자) 중심 사용일반 사용자보다는 관리자 계정에서 주로 사용

3. 명령어

1. 기본 명령어

명령어기능기본 형식비고
GRANT권한 부여GRANT 권한 ON 객체 TO 사용자;예: GRANT SELECT ON member TO user1;
REVOKE권한 회수REVOKE 권한 ON 객체 FROM 사용자;예: REVOKE SELECT ON member FROM user1;

2. 권한 종류

권한설명
SELECT데이터 조회 권한
INSERT데이터 삽입 권한
UPDATE데이터 수정 권한
DELETE데이터 삭제 권한
ALL모든 권한 부여
REFERENCES외래 키 참조 권한
EXECUTE프로시저/함수 실행 권한

4. TCL

1. TCL (Transaction Control Language)

  • 트랜잭션(Transaction) 을 제어하기 위한 SQL 명령어 집합으로,
  • 데이터 변경 작업(DML)의 처리 결과를 확정하거나 되돌리는 역할

2. 특징

구분설명
DML과 함께 사용SELECT, INSERT, UPDATE, DELETE 등 데이터 조작 시 적용
일관성 보장중간 단계에서 오류 발생 시 데이터 불일치 방지
수동 커밋 가능자동 커밋 모드를 해제하면 명시적으로 제어 가능
복구 기능잘못된 변경은 ROLLBACK으로 원상 복구
SAVEPOINT 지원중간 저장 지점을 만들어 부분 롤백 가능

3. 명령어

명령어기능기본 형식비고
COMMIT트랜잭션 확정COMMIT;변경 사항을 DB에 영구 반영
ROLLBACK트랜잭션 취소ROLLBACK;마지막 COMMIT 이전 상태로 복구
SAVEPOINT중간 저장 지점 설정SAVEPOINT 저장점명;특정 지점까지만 되돌릴 때 사용
ROLLBACK TO특정 지점까지 복구ROLLBACK TO 저장점명;SAVEPOINT와 함께 사용

5. Join

1. Join

  • 두 개 이상의 테이블을 공통된 속성(컬럼)을 기준으로 연결하여, 하나의 결과 집합(Result Set)으로 만드는 관계형 연산
  • Join은 DML은 아니지만 SELECT 문 안에서 사용하는 연산자(연산식)

2. 종류

종류설명예시
INNER JOIN두 테이블 모두 조건을 만족하는 행만SELECT * FROM A INNER JOIN B ON A.id = B.a_id;
LEFT JOIN (LEFT OUTER JOIN)왼쪽 테이블 기준, 조건 일치 여부와 상관없이 모든 행SELECT * FROM A LEFT JOIN B ON A.id = B.a_id;
RIGHT JOIN (RIGHT OUTER JOIN)오른쪽 테이블 기준, 조건 일치 여부와 상관없이 모든 행SELECT * FROM A RIGHT JOIN B ON A.id = B.a_id;
FULL JOIN (FULL OUTER JOIN)양쪽 테이블 모두, 조건 일치 여부와 상관없이 모든 행SELECT * FROM A FULL JOIN B ON A.id = B.a_id;
CROSS JOIN모든 조합(Cartesian product)SELECT * FROM A CROSS JOIN B;

3. oracle - join

1. 표준 SQL(ANSI) vs Oracle 전용 문법

  • Oracle은 예전부터 자체 전용 조인 문법(Oracle Join Syntax)을 사용함.
  • 나중에 ANSI 표준 SQL JOIN 문법도 지원하게 됨.

2. Oracle 전용 Join

구분ANSI 표준 SQLOracle 전용 문법 (옛 방식)
INNER JOINSELECT FROM A INNER JOIN B ON A.id = B.id;SELECT FROM A, B WHERE A.id = B.id;
LEFT JOINSELECT FROM A LEFT JOIN B ON A.id = B.id;SELECT FROM A, B WHERE A.id = B.id(+);
RIGHT JOINSELECT FROM A RIGHT JOIN B ON A.id = B.id;SELECT FROM A, B WHERE A.id(+) = B.id;
FULL JOINSELECT FROM A FULL JOIN B ON A.id = B.id;지원 안 함 (UNION으로 대체해야 함)

3. 비교

  • 오라클
    1
    2
    3
    
     SELECT e.name, d.dept_name
     FROM employee e, department d
     WHERE e.dept_id = d.dept_id(+);
    
  • ANSI표준
    1
    2
    3
    4
    
    SELECT e.name, d.dept_name
    FROM employee e
    LEFT JOIN department d
    ON e.dept_id = d.dept_id;
    
This post is licensed under CC BY 4.0 by the author.