HeoBrain AI · DEV · GROWTH

HEO BRAIN · DEV LAB

배운 것을 구조화하고,
실제로 작동하게 만듭니다.

AI, 코딩, 영어, 포트폴리오를 직접 공부하고 만들며 얻은 지식을 누구나 다시 써먹을 수 있게 정리합니다.

heobrain.workflow LIVE
01 collect(experience) 02 structure(knowledge) 03 ship(something useful)

EMAIL NEWSLETTER

새 글을 이메일로 받아보세요

하루 동안 올라온 HeoBrain의 새 글을 매일 오후 8시에 한 통으로 보내드립니다.

인증 이메일의 링크를 눌러야 구독이 완료되며, 언제든 해지할 수 있습니다.

LATEST NOTES

최근에 정리한 글

모든 글 보기

Day17)정처기_SQL 데이터베이스 구축

이 글의 목차 펼치기
 

정처기 공부 기록

SQL · 트랜잭션 · 병행 제어 완전 정리

SQL은 데이터를 정의하고 조작하며 권한을 통제하는 언어다. 오늘은 SQL 문법과 트랜잭션, 병행 제어, 뷰·집합 연산·조인·서브쿼리를 연결해 정리했다.

오늘 공부한 내용

DDL·DML·DCL/TCL, 트랜잭션, 병행 제어 기법, 뷰, 집합 연산자, 조인, 서브쿼리.

1. SQL 명령어 큰 분류

DDL은 객체 구조를 정의한다: CREATE, ALTER, DROP, TRUNCATE. DML은 행을 조회·추가·수정·삭제한다: SELECT, INSERT, UPDATE, DELETE.

DCL은 권한을 통제하는 GRANT, REVOKE다. COMMIT, ROLLBACK, SAVEPOINT는 엄밀히는 TCL(트랜잭션 제어어)이지만 정처기에서는 함께 묶어 외우기도 한다.

2. DDL: CREATE · ALTER · DROP · TRUNCATE

CREATE TABLE student (
  student_id INT PRIMARY KEY,
  name       VARCHAR(30) NOT NULL,
  major      VARCHAR(30),
  score      INT CHECK (score BETWEEN 0 AND 100),
  created_at DATE DEFAULT CURRENT_DATE
);

PRIMARY KEY는 행을 유일하게 식별하고 NULL을 허용하지 않는다. FOREIGN KEY는 다른 테이블의 키를 참조한다. UNIQUE는 중복 금지, NOT NULL은 NULL 금지, CHECK는 조건 검사, DEFAULT는 기본값 지정이다.

ALTER TABLE student ADD email VARCHAR(100);
ALTER TABLE student DROP COLUMN email;
ALTER TABLE student ADD CONSTRAINT ck_score CHECK (score >= 0);

DROP TABLE student;
TRUNCATE TABLE student;

ALTER는 구조 변경, DROP은 테이블 구조와 데이터를 모두 삭제, TRUNCATE는 구조를 남기고 모든 행을 비운다. TRUNCATE는 WHERE 조건을 쓸 수 없다. DELETE는 행 단위·조건부 삭제가 가능하다.

3. DML: SELECT · INSERT · UPDATE · DELETE

SELECT major, AVG(score) AS avg_score
FROM student
WHERE score >= 60
GROUP BY major
HAVING AVG(score) >= 80
ORDER BY avg_score DESC;

INSERT INTO student (student_id, name, major, score)
VALUES (1, '민수', '컴퓨터공학', 95);

INSERT INTO backup_student (student_id, name)
SELECT student_id, name FROM student WHERE score >= 90;

UPDATE student SET score = score + 5 WHERE student_id = 1;
DELETE FROM student WHERE student_id = 1;

SELECT는 보통 FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY 흐름으로 이해한다. WHERE는 행을, HAVING은 그룹을 거른다. DISTINCT는 중복 제거, LIKE는 패턴 검색, IN은 목록 포함 여부, BETWEEN은 범위, IS NULL은 NULL 검사다. UPDATE·DELETE에서 WHERE를 빼면 모든 행이 대상이므로 먼저 같은 조건으로 SELECT를 실행해 확인한다.

4. DCL·TCL과 트랜잭션

GRANT SELECT, INSERT ON student TO user_a;
REVOKE INSERT ON student FROM user_a;

START TRANSACTION;
UPDATE account SET balance = balance - 10000 WHERE account_id = 1;
SAVEPOINT after_withdraw;
UPDATE account SET balance = balance + 10000 WHERE account_id = 2;
COMMIT;

ROLLBACK;
ROLLBACK TO SAVEPOINT after_withdraw;

GRANT는 권한 부여, REVOKE는 권한 회수다. COMMIT은 작업을 영구 반영하고, ROLLBACK은 확정 전 작업을 취소한다. SAVEPOINT는 중간 저장점으로 해당 지점까지만 되돌릴 수 있다.

트랜잭션은 논리적으로 하나인 작업 단위다. 계좌 이체는 출금과 입금이 함께 성공하거나 함께 취소되어야 한다. ACID는 원자성(전부 또는 전무), 일관성(규칙을 지킨 상태), 고립성(동시 실행 간 부당한 영향 방지), 지속성(COMMIT 뒤에도 유지)이다.

5. 병행 제어 기법

병행 실행에서는 갱신 분실, 오손 읽기, 비반복 읽기, 유령 현상이 생길 수 있다.

로킹은 데이터에 잠금을 걸어 충돌을 막는다. 공유 잠금은 읽기, 배타 잠금은 쓰기 중심이다. 로깅은 변경 이력을 기록해 장애 시 UNDO·REDO 복구를 돕는 방식이며, 로킹과 역할이 다르다.

2단계 로킹(2PL)은 잠금을 얻기만 하는 확장 단계와 잠금을 풀기만 하는 축소 단계로 나눈다. 낙관적 검증은 충돌이 드물다고 보고 먼저 처리한 뒤 COMMIT 직전에 충돌을 검사한다. 타임스탬프 순서는 트랜잭션 시간표 순서를 지키지 않는 작업을 거부·재시작한다. MVCC는 여러 버전을 유지해 읽기와 쓰기의 충돌을 줄인다.

6. 뷰(View)

CREATE VIEW high_score_student AS
SELECT student_id, name, major, score
FROM student
WHERE score >= 90;

SELECT * FROM high_score_student;
DROP VIEW high_score_student;

뷰는 SELECT 결과에 이름을 붙인 가상 테이블이다. 복잡한 질의를 단순화하고 필요한 열만 공개해 보안을 높이며 논리적 독립성을 제공한다. 조인·집계·GROUP BY가 포함된 뷰는 DBMS에 따라 직접 UPDATE가 제한될 수 있다.

7. 집합 연산자

SELECT name FROM club_a
UNION
SELECT name FROM club_b;

SELECT name FROM club_a
UNION ALL
SELECT name FROM club_b;

SELECT name FROM club_a
INTERSECT
SELECT name FROM club_b;

SELECT name FROM club_a
EXCEPT
SELECT name FROM club_b;

두 SELECT는 열 개수가 같고 대응 열 자료형이 호환되어야 한다. UNION은 합집합이며 중복을 제거하고, UNION ALL은 중복도 유지한다. INTERSECT는 교집합, EXCEPT는 첫 결과에서 둘째 결과를 뺀 차집합이다. 일부 DBMS는 EXCEPT 대신 MINUS를 쓴다.

8. 조인(Join)

-- 내부 조인
SELECT s.name, d.dept_name
FROM student s INNER JOIN department d
  ON s.dept_id = d.dept_id;

-- 왼쪽 외부 조인
SELECT s.name, d.dept_name
FROM student s LEFT OUTER JOIN department d
  ON s.dept_id = d.dept_id;

-- 교차 조인
SELECT s.name, c.course_name
FROM student s CROSS JOIN course c;

-- 셀프 조인
SELECT e.name AS employee, m.name AS manager
FROM employee e LEFT JOIN employee m
  ON e.manager_id = m.emp_id;

내부 조인은 조건이 일치하는 행만 반환한다. 외부 조인은 일치하지 않는 한쪽 행도 NULL을 채워 포함하며 LEFT·RIGHT·FULL OUTER JOIN이 있다. 교차 조인은 가능한 모든 조합인 카테시안 곱이다. 셀프 조인은 같은 테이블을 별칭으로 두 번 사용해 직원-관리자처럼 자기참조 관계를 찾는다.

9. 서브쿼리 유형

-- 단일 행 서브쿼리
SELECT name FROM student
WHERE score > (SELECT AVG(score) FROM student);

-- 다중 행 서브쿼리
SELECT name FROM student
WHERE major IN (
  SELECT major FROM department
  WHERE college = '공과대학'
);

-- EXISTS와 상관 서브쿼리
SELECT name FROM student s
WHERE EXISTS (
  SELECT 1 FROM scholarship h
  WHERE h.student_id = s.student_id
);

-- FROM 절 서브쿼리: 인라인 뷰
SELECT major, avg_score
FROM (
  SELECT major, AVG(score) AS avg_score
  FROM student
  GROUP BY major
) x
WHERE avg_score >= 80;

단일 행 서브쿼리는 =, >, < 등을 쓴다. 다중 행 서브쿼리는 IN, ANY, ALL, EXISTS를 쓴다. ANY는 결과 중 하나라도 만족하면 참, ALL은 모든 결과를 만족해야 참이다. 스칼라 서브쿼리는 값 하나를 반환해 SELECT 절에 쓸 수 있다.

비상관 서브쿼리는 바깥 질의와 독립적이고, 상관 서브쿼리는 바깥 행의 값을 참조해 행마다 관련 검사를 한다. EXISTS는 행의 존재 여부만 확인할 때 쓴다.

공부하면서 개인적으로 중요하다고 생각하는 용어

DDL과 DML의 차이, COMMIT 전까지 취소 가능한 트랜잭션, 2PL·낙관적 검증·타임스탬프·MVCC의 접근 차이가 중요하다. SQL은 문법보다 “어떤 행을 대상으로 어떤 결과를 만들지”를 먼저 생각해야 한다.

공부하면서 이해하지 못한 용어

TRUNCATE와 DELETE의 복구·트리거 차이, 격리 수준별 현상, 상관 서브쿼리 실행 방식은 DBMS별 차이를 실습으로 확인한다. UPDATE·DELETE는 WHERE 누락 여부를 항상 점검한다.

오늘 공부한것 소회

SQL은 구조 정의(DDL), 행 조작(DML), 권한·작업 확정(DCL/TCL)으로 나누니 정리가 됐다. 조인과 서브쿼리는 같은 결과를 다른 방식으로 낼 수 있으므로 예제를 직접 바꾸며 결과 행을 확인하는 연습이 필요하다.

EMAIL NEWSLETTER

새 글을 이메일로 받아보세요

하루 동안 올라온 HeoBrain의 새 글을 매일 오후 8시에 한 통으로 보내드립니다.

인증 이메일의 링크를 눌러야 구독이 완료되며, 언제든 해지할 수 있습니다.

블로그 검색