먼저 알아야 할 것
- 집합, 관계와 그 성질, 함수의 성질과 집합의 크기 (공학수학 이산수학): 릴레이션, 키, 일대다 관계를 적는 말
- 명제와 논리 연산, 술어와 한정기호, 동치관계와 분할 (공학수학 이산수학): WHERE 조건, EXISTS와 ALL, GROUP BY를 읽는 말
- 점근 표기, 트리, 로그, 등비급수 (공학수학): B-트리의 높이를 증명할 때 쓴다
- 이분 탐색, 트리 순회와 이진 탐색 트리 (알고리즘), 이진 탐색 트리의 탐색과 삽입, 이진 탐색 트리의 삭제 (1-2학기 자료구조): B-트리는 이진 탐색 트리의 갈래 수를 늘린 것이다
질의와 결과 표는 SQLite(파이썬
sqlite3)로 실행해 확인했고, SQLite가 받지 않는 문장은 PostgreSQL 16으로 확인했다. 예제는 교재의 COMPANY 데이터베이스(표 6개, 45줄)를 쓴다.
데이터베이스와 사용자, 데이터베이스 시스템의 개념과 구조
읽기 전에
- 학생 레코드 끝에 생일 칸 하나를 덧붙였을 뿐인데 어떤 프로그램은 둘째 학생부터 엉뚱한 값을 읽는다. 그 프로그램은 무엇을 코드에 적어 두었을까? → 데이터베이스 방식의 네 가지 특징
- 색인을 새로 달거나 표에 칸을 더해도 이미 돌고 있는 프로그램을 안 고치려면, 프로그램과 디스크 사이에 무엇이 끼어 있어야 할까? → 데이터 독립성
- 학생 이름을 성적표에도 한 번 더 적어 두면 무엇이 편해지고 무엇이 위험해질까? → DBMS의 기능과 쓰지 않을 때
| 번호 | 개념 | 한 줄 | 개념 코드 | 연습 |
|---|---|---|---|---|
| 01 | 데이터베이스와 DBMS | 서로 이어진 데이터의 모음과 그것을 관리하는 범용 소프트웨어, 둘을 합친 데이터베이스 시스템 | verify | — |
| 02 | 데이터베이스 방식의 네 가지 특징 | 구조의 설명(카탈로그)을 함께 품어서 프로그램이 저장 모양에 매이지 않고, 여러 뷰와 동시 사용을 받친다 | verify | — |
| 03 | 데이터베이스 사용자 | 날마다 쓰는 무대 위 네 부류와 DBMS를 만들고 돌리는 무대 뒤 세 부류 | — | — |
| 04 | DBMS의 기능과 쓰지 않을 때 | 중복 통제·접근 제한·여러 인터페이스·무결성 제약·백업과 복구, 그리고 파일이 더 나은 세 경우 | verify | — |
| 05 | 데이터 모델의 종류 | 누구에게 보여 주느냐로 갈리는 개념적·표현적·물리적 데이터 모델 | verify | — |
| 06 | 스키마와 인스턴스 | 거의 안 바뀌는 틀(스키마)과 넣고 고칠 때마다 바뀌는 내용(상태) | verify | — |
| 07 | 3단계 스키마 구조 | 외부·개념·내부 세 단계의 설명과 그 사이에서 요청을 옮겨 주는 사상 | verify | — |
| 08 | 데이터 독립성 | 아래 단계의 스키마를 바꿔도 바로 위 단계와 프로그램은 그대로 | verify | — |
| 09 | DBMS 언어와 인터페이스 | 틀을 정하는 말(DDL·SDL·VDL)과 자료를 다루는 말(DML), 말 대신 쓰는 다섯 가지 창구 | verify | — |
| 10 | DBMS 구성 모듈 | 어느 길로 들어온 요청이든 실행 시간 처리기 하나로 모여 저장 데이터 관리자를 거쳐 디스크에 닿는다 | verify | — |
카탈로그가 메타데이터를 따로 둔다는 이야기는 데이터와 메타데이터 문서의 과목별 관점에 합쳤다.
떠올려 보기: 노트를 닫고 외부·개념·내부 세 단계를 그린 뒤, 두 데이터 독립성이 어느 경계에 놓이는지와 경계마다 무엇이 바뀌고 무엇이 그대로인지 써 본다.
B-트리의 뜻과 높이, 검색과 삽입
읽기 전에
| 번호 | 개념 | 한 줄 | 개념 코드 | 연습 |
|---|---|---|---|---|
| 11 | B-트리 | 노드 하나에 키를 여러 개 담아 디스크를 덜 읽는 균형 탐색 트리. 키 수는 \(t - 1\)~\(2t - 1\)개, 잎의 깊이는 모두 같다 | verify | — |
| 12 | B-트리의 높이 | 키 \(n\)개면 높이 \(h \le \log_t \frac{n+1}{2}\), 높이 \(h\)에 많아야 \((2t)^{h+1} - 1\)개 | verify | — |
| 13 | B-트리 검색 | 노드의 키와 견주어 여러 갈래 가운데 하나로 내려간다. \(O(t \log_t n)\), 노드 안에서 이분 탐색을 쓰면 \(O(\lg n)\) | impl | — |
| 14 | B-트리 노드 쪼개기 | 가득 찬 노드의 가운데 키를 부모로 올리고 키 \(t - 1\)개짜리 둘로 가른다 | — | — |
| 15 | B-트리 삽입 | 내려가는 길의 가득 찬 노드를 미리 쪼개고 잎에 넣는다. 뿌리를 쪼갤 때만 높아진다 | impl | B-트리 삽입 예제 사다리 |
| 16 | B-트리와 이진 탐색 트리 비교 | 노드 하나의 키 수가 갈래 수, 자라는 쪽, 디스크 읽기 횟수를 가른다 | — | — |
노드 안에서 이분 탐색을 하면 걸리는 시간은 이분 탐색, 색인과 디스크 접근 비용은 파일 조직과 디스크 스케줄링 문서의 과목별 관점에 합쳤다.
떠올려 보기: 노트를 닫고 B-트리가 지켜야 하는 성질 세 가지를 쓰고, 빈 트리(\(t = 2\))에 F, S, Q, K를 넣은 모양을 그려 본다.
B-트리 삭제, ER 모델 1: 개체·속성·관계
읽기 전에
- 잎에서 키를 하나 지웠더니 그 잎의 키가 아래 한계보다 적어졌다. 고칠 방법 두 가지는 무엇일까? → B-트리 삭제
- “John Smith”와 “EMPLOYEE”는 ER 모델에서 같은 종류의 것일까? → 개체 타입과 개체 집합
- “직원이 직원을 감독한다”를 그리면 선의 양쪽이 다 직원이다. 누가 상사인지 어떻게 적을까? → 역할 이름과 재귀 관계
| 번호 | 개념 | 한 줄 | 개념 코드 | 연습 |
|---|---|---|---|---|
| 17 | B-트리 삭제 | 잎에서 지우고, 모자라면 형제에게 빌리거나 부모의 키를 내려 합친다(CLRS와 다른 방식) | impl | B-트리 삭제 예제 사다리 · B-트리 연습 · 문제 코드 · 문제 코드 |
| 18 | 데이터베이스 설계 과정 | 요구를 묻고 → 그림(ER)으로 정리하고 → 표로 옮기고 → 저장 구조를 정하는 네 단계 | — | — |
| 19 | 개체 타입과 개체 집합 | 개체 타입은 이름과 속성 목록이라는 틀, 개체 집합은 지금 들어 있는 개체들 | verify | — |
| 20 | 속성의 종류 | 쪼갤 수 있는가(복합/단순), 값이 여럿인가(다치/단일값), 저장하는가(저장/유도)로 속성을 가름 | verify | — |
| 21 | 키 속성 | 값이 개체마다 달라 개체 하나를 가려내는 속성. 묶음일 수도, 둘 이상일 수도 있다 | verify | — |
| 22 | 관계 타입과 관계 집합 | 개체 타입들을 잇는 틀과 그 인스턴스들의 집합 \(R \subseteq E_1 \times \cdots \times E_n\), 차수 | verify | — |
| 23 | 역할 이름과 재귀 관계 | 같은 개체 타입이 두 번 끼는 관계와, 구실을 가르는 역할 이름 | verify | — |
B-트리 삭제(17)는 CLRS와 다른 방식을 따른다. 내부 노드의 키는 늘 왼쪽 아래에서 가장 큰 키로 바꾼 뒤 잎에서 지운다.
떠올려 보기: 노트를 닫고 B-트리 삭제의 네 경우(1-1, 1-2a, 1-2b, 2)를 “언제, 무엇을 한다”로 쓴다. 이어서 개체·속성·관계 타입이 각각 무엇인지, 타입과 집합이 어떻게 다른지 COMPANY 예로 써 본다.
ER 모델 2: 제약, 약한 개체, ER 다이어그램
읽기 전에
- “직원은 정확히 한 부서에서 일한다”에는 규칙이 몇 개 들어 있을까? → 카디널리티 비율
- 직원이 프로젝트에 일한 시간은 직원에 적을까, 프로젝트에 적을까? → 관계 타입의 속성
- EMPLOYEE 옆에 (1,1), DEPARTMENT 옆에 (4,N)이 적혀 있으면 어느 쪽이 “여럿”일까? → (min, max) 표기
| 번호 | 개념 | 한 줄 | 개념 코드 | 연습 |
|---|---|---|---|---|
| 24 | 카디널리티 비율 | 개체 하나가 낄 수 있는 인스턴스 수의 위 한계 1:1, 1:N, M:N | verify | — |
| 25 | 참여 제약 | 모든 개체가 관계에 끼어야 하는가(전체 참여) 아닌가(부분 참여) | verify | — |
| 26 | 관계 타입의 속성 | 짝에 붙는 값은 관계에 적는다. 1:1·1:N이면 개체로 옮길 수 있고 M:N이면 못 옮긴다 | verify | — |
| 27 | 약한 개체 타입 | 자기 키가 없어 주인 개체와 부분 키로 가려내는 개체 타입. 식별 관계에 늘 전체 참여 | verify | — |
| 28 | 일반 개체 타입과 약한 개체 타입 비교 | 자기 속성만으로 가려지는가로 가른다. 전체 참여 여부로 가르지 않는다 | — | — |
| 29 | ER 다이어그램 표기법 | 네모·마름모·타원과 겹선·밑줄의 뜻, COMPANY 전체 그림 | — | — |
| 30 | (min, max) 표기 | 개체 옆에 적는 참여 횟수의 아래·위 한계. 1, N 표기와 숫자 자리가 반대다 | verify | — |
떠올려 보기: COMPANY의 관계 타입 여섯 개를 적고, 각각의 비율·참여·관계의 속성을 표로 써 본다.
ER 다이어그램 설계 연습, 관계형 데이터 모델
읽기 전에
- 요구사항 글에서 마름모가 될 것을 어떻게 골라낼까? → ER 설계 절차
- 표에서 줄의 순서를 바꾸면 다른 릴레이션이 되는가? → 릴레이션의 특성
- 직원 표에 적힌 부서 번호가 부서 표에 없으면 무엇이 곤란한가? 그 칸은 비워 둘 수 있는가? → 참조 무결성 제약과 외래 키
| 번호 | 개념 | 한 줄 | 개념 코드 | 연습 |
|---|---|---|---|---|
| 31 | ER 설계 절차 | 개체 타입과 속성을 적고 → 개체를 가리키는 속성을 관계 타입으로 바꾸고 → 그린다 | verify | ER 다이어그램 설계 연습 · ER 모델 연습 · 문제 코드 · 문제 코드 · 문제 코드 · 문제 코드 |
| 32 | 릴레이션과 도메인·속성·튜플 | 표의 줄·칸 이름·값의 모음에 붙인 이름, 상태는 \(\text{dom}(A_1) \times \dots \times \text{dom}(A_n)\)의 부분집합 | verify · verify.sql | — |
| 33 | 릴레이션의 특성 | 줄에 순서가 없고 한 칸에 값 하나, 없는 값은 NULL | verify | — |
| 34 | 슈퍼키·후보 키·기본 키 | 값이 안 겹치는 묶음(슈퍼키), 그중 더 줄일 수 없는 것(후보 키), 대표로 고른 하나(기본 키) | verify | — |
| 35 | 관계형 데이터베이스 스키마와 상태 | 릴레이션 스키마들과 지켜야 할 규칙의 묶음, COMPANY의 표 6개와 45줄 | verify · verify.sql | — |
| 36 | 개체 무결성 제약 | 기본 키는 NULL일 수 없다 | verify · verify.sql | — |
| 37 | 참조 무결성 제약과 외래 키 | 다른 릴레이션을 가리키는 값은 그곳에 실제로 있거나 NULL이어야 한다 | verify · verify.sql | 외래 키 찾기 연습 · 문제 코드 · 문제 코드 |
| 38 | 키의 종류 비교 | 슈퍼키·후보 키·기본 키·외래 키를 “겹쳐도 되나, NULL이어도 되나”로 가르기 | — | — |
ER 설계 절차(31)는 ER 모델 문서(18~30)에 흩어진 단계를 설계 연습과 함께 한 장에 모은 문서다. 릴레이션이 곱집합의 부분집합이라는 것은 관계와 그 성질, 키와 일대다 관계를 함수로 읽는 법은 함수의 성질과 집합의 크기 문서의 과목별 관점에 합쳤다.
떠올려 보기: 노트를 닫고 PART_ORDER 요구사항만 보고 개체 타입, 속성, 관계 타입을 처음부터 다시 적어 본다. 이어서 세 제약(키, 개체 무결성, 참조 무결성)이 각각 무엇을 막는지와 네 가지 키의 차이를 써 본다.
ER 그림을 표로 옮기기
읽기 전에
- ER 그림에 관계 타입이 여섯 개면 릴레이션도 여섯 개가 더 생기는가? → ER-관계형 사상 절차
- 일대다 관계의 외래 키는 1쪽과 N쪽 가운데 어디에 넣는가? 왜 그런가? → 일대다 관계 타입의 사상
- 다대다 관계는 왜 외래 키 하나로 적을 수 없는가? → 다대다·n항 관계 타입의 사상
| 번호 | 개념 | 한 줄 | 개념 코드 | 연습 |
|---|---|---|---|---|
| 39 | 개체 타입의 사상 | 네모는 표 하나, 약한 개체는 주인의 키를 빌려 기본 키를 만든다 | verify | — |
| 40 | 다치 속성의 사상 | 값이 여럿인 속성은 (주인의 키, 값) 두 칸짜리 표로 뗀다 | verify | — |
| 41 | 일대일 관계 타입의 사상 | 일대일은 전체 참여 쪽에 외래 키 하나, 합치기와 교차 참조는 대안 | verify | — |
| 42 | 일대다 관계 타입의 사상 | 일대다는 N쪽 표에 외래 키 하나 | verify | — |
| 43 | 다대다·n항 관계 타입의 사상 | 다대다와 n항은 외래 키를 묶어 기본 키로 삼는 관계 릴레이션 | verify | — |
| 44 | ER-관계형 사상 절차 | ER 그림을 일곱 단계로 표에 옮기는 순서와 옮기면 사라지는 규칙 | verify | ER-관계형 사상 예제 사다리 · UNIVERSITY 사상 연습 · 문제 코드 · 문제 코드 |
떠올려 보기: COMPANY ER 그림을 떠올려 일곱 단계로 옮기고, 릴레이션 여섯 개와 외래 키 여덟 개를 적어 본다.
SQL 맛보기
읽기 전에
- SQL 문장에는 “어떻게 찾을지”가 왜 적혀 있지 않을까? → SQL 한눈에 보기
- 직원 표와 부서 표가 서로를 가리킬 때 어느 표를 먼저 만들 수 있을까? → CREATE SCHEMA와 CREATE TABLE
- 행을 지우기만 하는데도 거부되는 것은 어떤 경우일까? → 갱신 연산과 제약 위반
| 번호 | 개념 | 한 줄 | 개념 코드 | 연습 |
|---|---|---|---|---|
| 45 | SQL 한눈에 보기 | “무엇을”만 적고 “어떻게”는 DBMS에 맡기는 언어, 표를 다루는 DDL과 행을 다루는 DML | verify | — |
| 46 | CREATE SCHEMA와 CREATE TABLE | 표의 이름·열·처음 거는 제약을 적어 빈 틀 만들기, 서로 가리키는 외래 키는 나중에 붙인다 | verify · verify.sql | — |
| 50 | SELECT-FROM-WHERE | 어느 표에서 어떤 행의 어느 칸을 꺼낼지 적는 기본 질의, 모든 조합에서 조건으로 거른다 | verify | — |
| 51 | INSERT·DELETE·UPDATE | 행을 넣고 지우고 고치는 세 문장, 조건에 맞는 모든 행에 한꺼번에 | verify | — |
| 52 | 갱신 연산과 제약 위반 | 삽입은 세 제약 모두, 삭제는 참조 무결성만, 수정은 고치는 칸에 따라 | verify | 제약 위반 찾기 연습 · 문제 코드 · 문제 코드.sql |
번호는 표를 만드는 문서(46~49)를 앞에 모으고 검색(50), 고치기(51~52), 참조 동작(53) 순서로 두었다. 그래서 이 절과 다음 절의 표에서 번호가 서로 섞여 있다.
떠올려 보기: 노트를 닫고 SELECT 문의 세 절이 하는 일과, 삽입·삭제·수정이 각각 어길 수 있는 제약을 써 본다.
SQL로 표 만들기, 기본 검색
읽기 전에
- 상사인 직원의 행을 지우면 그 부하들의 “상사” 칸은 어떻게 되어야 할까? → 참조 동작 SET NULL·CASCADE·SET DEFAULT
- 직원 표(8행)와 부서 표(3행)를 FROM에 적고 조건을 안 쓰면 몇 행이 나올까? → WHERE 없는 질의와 카티션 곱
- 직원과 상사가 같은 표에 있을 때 두 사람의 이름을 한 행에 어떻게 꺼낼까? → 별칭과 자기 조인
| 번호 | 개념 | 한 줄 | 개념 코드 | 연습 |
|---|---|---|---|---|
| 47 | SQL 자료형 | 열마다 받을 값의 꼴 정하기(수·문자열·비트열·불·날짜와 시각), 얼마나 막는지는 제품마다 다르다 | verify · verify.sql | — |
| 48 | 속성 제약 NOT NULL·DEFAULT·CHECK | 열 하나에 거는 세 규칙: 빈칸 금지, 안 적으면 넣을 값, 받을 범위 | verify · verify.sql | — |
| 49 | PRIMARY KEY·UNIQUE·FOREIGN KEY 절 | 기본 키·또 다른 키·외래 키를 CREATE TABLE에 적는 세 절과 제약에 이름 붙이기 | verify · verify.sql | — |
| 53 | 참조 동작 SET NULL·CASCADE·SET DEFAULT | 가리킴 받는 행이 지워지거나 키가 고쳐질 때 가리키던 쪽을 비울지·기본값으로 돌릴지·함께 처리할지, 안 적으면 거부 | verify · verify.sql | LIBRARY 스키마 DDL 연습 · 문제 코드 · 문제 코드.sql |
| 54 | WHERE 없는 질의와 카티션 곱 | 조건을 빠뜨리면 모든 조합이 나온다(\(8 \times 3 = 24\)행) | verify | — |
| 55 | 별칭과 자기 조인 | 표에 별명을 붙여 같은 표를 두 번 쓰기(직원과 그 상사) | verify | 기본 검색 연습 · 문제 코드 · 문제 코드 |
| 56 | 다중집합인 표와 DISTINCT | SQL의 표에는 같은 행이 여러 번 있을 수 있다, DISTINCT를 적어야 한 번만 | verify | — |
| 57 | 집합 연산 UNION·EXCEPT·INTERSECT | 두 질의 결과를 합치고 빼고 겹치는 것만 남기기, ALL을 붙이면 횟수까지 센다 | verify · verify.sql | — |
표가 중복을 허락하는 모음이라는 것과 UNION·EXCEPT·INTERSECT는 집합 문서의 과목별 관점에 합쳤다.
떠올려 보기: 노트를 닫고 CREATE TABLE에 걸 수 있는 제약 여섯 가지(NOT NULL, DEFAULT, CHECK, PRIMARY KEY, UNIQUE, FOREIGN KEY)와 참조 동작 셋을 쓰고, SQL의 표가 집합과 다른 점을 한 문장으로 써 본다.
표 정의 심화(주장·트리거·DROP·ALTER), 검색 심화(중첩 질의·조인·집계·묶기)
읽기 전에
WHERE Super_ssn = NULL은 상사가 없는 직원을 몇 명 찾을까? → NULL 값과 IS NULL- 직원 옆에 상사 이름을 붙였더니 8명이 아니라 7명만 나왔다. 누가, 왜 빠졌을까? → 외부 조인
- 기본 키, 외래 키, NOT NULL을 하나도 어기지 않는 새 직원이 “직원은 부서장보다 많이 받을 수 없다”는 회사 규칙을 깰 수 있을까? 이런 규칙은 어디에 적을까? → 주장 CREATE ASSERTION
| 번호 | 개념 | 한 줄 | 개념 코드 | 연습 |
|---|---|---|---|---|
| 58 | DROP 명령과 CASCADE·RESTRICT | 표나 스키마를 틀째 없애기, 기댄 것까지 없앨지(CASCADE) 그만둘지(RESTRICT) | verify · verify.sql | — |
| 59 | ALTER TABLE | 만든 표에 칸을 더하고 빼고, 제약을 떼고 붙이기 | verify · verify.sql | — |
| 60 | 중첩 질의와 IN | 질의 안에 넣은 질의의 결과에 값이 들어 있는지 견준다 | verify · verify.sql | — |
| 61 | ANY와 ALL | 안쪽 결과의 값 하나(\(\exists\)) 또는 모두(\(\forall\))와 크기를 견준다 | verify · verify.sql | — |
| 62 | EXISTS와 NOT EXISTS | 바깥 행마다 딸린 행이 있는지, 없는지만 본다 | verify · verify.sql | 중첩 질의 쓰기 예제 사다리 · 문제 코드 |
| 63 | NULL 값과 IS NULL | 빈칸은 모르는 값이라 =로 못 견주고 IS NULL로 묻는다 |
verify · verify.sql | — |
| 64 | FROM 절의 조인 (JOIN ON) | 표를 잇는 조건을 WHERE에서 FROM으로 옮긴다 | verify | — |
| 65 | 자연 조인 NATURAL JOIN | 이름이 같은 열끼리 저절로 맞추고 한 번만 보여 준다 | verify · verify.sql | — |
| 66 | 외부 조인 | 짝 없는 행도 남기고 짝 자리를 NULL로 채운다 | verify · verify.sql | 조인 질의 쓰기 예제 사다리 · 문제 코드 |
| 67 | 내부 조인과 외부 조인 비교 | 짝 없는 행이 결과에 나와야 하는가로 가른다 | verify | — |
| 68 | 집계 함수 | 여러 행을 개수·합·최대·최소·평균 한 값으로 줄인다 | verify · verify.sql | — |
| 69 | GROUP BY | 값이 같은 행끼리 묶어 묶음마다 한 줄로 요약한다 | verify · verify.sql | — |
| 70 | HAVING | 묶음의 요약값으로 묶음을 통째로 거른다 | verify · verify.sql | GROUP BY 질의 쓰기 예제 사다리 · 복잡한 검색 연습 · 중첩 질의·집계 연습 · 문제 코드 · 문제 코드.sql · 문제 코드 · 문제 코드.sql · 문제 코드 · 문제 코드.sql · 문제 코드 · 문제 코드 · 문제 코드 · 문제 코드 · 문제 코드.sql |
| 71 | WHERE와 HAVING 비교 | 묶기 전에 행을 거르는가, 묶은 뒤에 묶음을 거르는가 | verify · verify.sql | — |
| 72 | ORDER BY와 질의의 절 순서 | 결과 줄을 세우고, 여섯 절을 적는 차례와 처리되는 차례를 가른다 | verify · verify.sql | JOIN·GROUP BY 종합 연습 · 문제 코드 · 문제 코드 · 문제 코드.sql |
| 73 | 주장 CREATE ASSERTION | 여러 행과 여러 표에 걸친 규칙을 “어기는 조합이 없어야 한다”는 꼴로 거는 문장 | verify · verify.sql | — |
| 74 | 트리거와 ECA 규칙 | 사건이 일어나고 조건이 맞으면 정해 둔 동작을 데이터베이스가 스스로 하는 규칙 | verify · verify.sql | — |
주장과 트리거(73~74)는 NOT EXISTS(62)를 쓰므로 번호를 검색 심화(60~72) 뒤에 두었다. IN·ANY·ALL·EXISTS를 한정기호로 읽는 법은 술어와 한정기호, GROUP BY가 행을 겹치지 않게 나누는 것은 동치관계와 분할 문서의 과목별 관점에 합쳤다.
떠올려 보기: 노트를 닫고 중첩 질의, 조인, 집계 함수, GROUP BY와 HAVING, ORDER BY가 각각 무엇을 받아 무엇을 내놓는지와 여섯 절이 처리되는 차례를 써 본다. 이어서 주장과 트리거가 각각 무엇을 적는 문장인지, CASCADE와 RESTRICT가 표를 없앨 때 무엇을 함께 없애는지 써 본다.
복잡한 검색 연습
읽기 전에
- “평균 급여가 3만을 넘는 부서의 남자 직원 수”를 구하면서
Sex = 'M'을 WHERE에 넣으면, HAVING의 평균은 누구의 평균이 될까? → WHERE와 HAVING 비교 - “성적이 모두 A인 학생”을 찾는 질의는 성적이 하나도 없는 학생을 뽑을까? → EXISTS와 NOT EXISTS
- 안쪽 질의가 두 행을 돌려주는데 그 앞에
=를 쓰면 어떻게 될까? → 중첩 질의와 IN
새 개념 없이 중첩 질의, 조인, 집계, 묶기를 섞어 쓰는 연습이다. 풀이 문서 복잡한 검색 연습은 위의 표 정의·검색 심화 절에 있는 표 70번 줄의 연습 칸에 있다.
떠올려 보기: 노트를 닫고, 연습 일곱 문제 가운데 언뜻 맞아 보이는 질의가 그대로는 틀리는 것 셋과 그 까닭을 써 본다.
뷰
읽기 전에
- 뷰를 만든 뒤 원래 표에 행을 넣었다. 뷰를 다시 만들지 않아도 그 행이 보일까? → 뷰
- 뷰의 행이 어디에도 저장돼 있지 않다면, DBMS는 뷰에 온 질의에 어떻게 답할까? → 질의 수정과 뷰 실체화
- 세 표를 이은 뷰에서 “Smith의 프로젝트 이름을 바꿔라”고 하면 DBMS는 어느 표를 고쳐야 할까? → 뷰 갱신 문제
| 번호 | 개념 | 한 줄 | 개념 코드 | 연습 |
|---|---|---|---|---|
| 75 | 뷰 | 질의에 이름을 붙여 표처럼 쓰는 가상 테이블. 정의만 저장되고 늘 최신이다 | verify · verify.sql | — |
| 76 | 질의 수정과 뷰 실체화 | 뷰 질의에 답하는 두 길. 물을 때마다 계산하거나, 결과를 보관하고 제때 고친다 | verify · verify.sql | — |
| 77 | 뷰 갱신 문제 | 뷰를 거친 갱신은 기본 테이블 갱신으로 옮길 길이 딱 하나일 때만 된다 | verify · verify.sql | 뷰 연습 · 문제 코드 · 문제 코드.sql · 문제 코드 · 문제 코드.sql |
| 78 | 뷰와 기본 테이블 비교 | 행이 저장되는가, 물을 때마다 계산되는가 | — | — |
떠올려 보기: 노트를 닫고 뷰가 기본 테이블과 다른 점, 뷰를 구현하는 두 방법, 갱신할 수 있는 뷰의 조건을 쓰고 셋이 어떻게 이어지는지 적어 본다.
고급 SQL 연습(JOIN, GROUP BY)
읽기 전에
새 개념 없이 조인과 묶기를 섞어 쓰는 연습이다. 풀이 문서 JOIN·GROUP BY 종합 연습은 위의 표 정의·검색 심화 절에 있는 표 72번 줄의 연습 칸에 있다.
떠올려 보기: 노트를 닫고 “없는 것 찾기”, “0명까지 세기”, “묶음에 조건 걸기”를 각각 어느 절로 쓰는지 적어 본다.
다른 과목과의 연결
- B-트리, B-트리 검색 ↔ 파일 조직, 디스크 스케줄링, 레코드 블로킹 (3-1학기 운영체제): 색인을 디스크 읽기가 적은 트리로 만든 것이 B-트리이고, 노드 하나가 디스크 페이지 하나다
- B-트리와 이진 탐색 트리 비교, B-트리 삭제 ↔ 이진 탐색 트리의 탐색과 삽입, 이진 탐색 트리의 삭제 (1-2학기 자료구조): 둘 다 안쪽 키를 왼쪽 아래에서 가장 큰 키로 바꾼 뒤 끝에서 지운다
- 릴레이션과 도메인·속성·튜플 ↔ 관계와 그 성질 (공학수학 이산수학): 릴레이션은 도메인들의 곱집합의 부분집합이다
- 슈퍼키·후보 키·기본 키, 카디널리티 비율 ↔ 함수의 성질과 집합의 크기 (공학수학 이산수학), 후보키 (알고리즘 연습): 키는 값이 겹치지 않는 함수이고, 후보 키 찾기는 그 조건을 전부 검사하는 문제다
- 집합 연산 UNION·EXCEPT·INTERSECT ↔ 집합 (공학수학 이산수학): 합집합, 차집합, 교집합을 표에 쓴다
- EXISTS와 NOT EXISTS, ANY와 ALL ↔ 술어와 한정기호 (공학수학 이산수학): “모두 A다”를 “A가 아닌 것이 없다”로 바꿔 쓴다
- GROUP BY ↔ 동치관계와 분할 (공학수학 이산수학): 값이 같은 행끼리 묶으면 표가 겹치지 않는 묶음으로 갈린다
- CREATE SCHEMA와 CREATE TABLE ↔ 부분순서와 위상 정렬 (공학수학 이산수학): 가리키는 표를 먼저 만들어야 하고, 서로 가리키면 그런 순서가 없다
- 데이터베이스 방식의 네 가지 특징 ↔ 데이터와 메타데이터 (2-1학기 자료와 정보): 카탈로그는 데이터를 설명하는 데이터다
- DBMS 구성 모듈 ↔ 컴파일러의 구조 (3-2학기 컴파일러), 경쟁 조건과 임계 구역 (3-1학기 운영체제): 질의도 구문 분석과 최적화를 거치고, 여럿이 함께 고칠 때는 순서를 통제한다
흐름
graph TD
C1["01 데이터베이스와 DBMS"]
C2["02 데이터베이스 방식의 네 가지 특징"]
C3["03 데이터베이스 사용자"]
C4["04 DBMS의 기능과 쓰지 않을 때"]
C5["05 데이터 모델의 종류"]
C6["06 스키마와 인스턴스"]
C7["07 3단계 스키마 구조"]
C8["08 데이터 독립성"]
C9["09 DBMS 언어와 인터페이스"]
C10["10 DBMS 구성 모듈"]
C11["11 B-트리"]
C12["12 B-트리의 높이"]
C13["13 B-트리 검색"]
C14["14 B-트리 노드 쪼개기"]
C15["15 B-트리 삽입"]
C16["16 B-트리와 이진 탐색 트리 비교"]
C17["17 B-트리 삭제"]
C18["18 데이터베이스 설계 과정"]
C19["19 개체 타입과 개체 집합"]
C20["20 속성의 종류"]
C21["21 키 속성"]
C22["22 관계 타입과 관계 집합"]
C23["23 역할 이름과 재귀 관계"]
C24["24 카디널리티 비율"]
C25["25 참여 제약"]
C26["26 관계 타입의 속성"]
C27["27 약한 개체 타입"]
C28["28 일반 개체 타입과 약한 개체 타입 비교"]
C29["29 ER 다이어그램 표기법"]
C30["30 (min, max) 표기"]
C31["31 ER 설계 절차"]
C32["32 릴레이션과 도메인·속성·튜플"]
C33["33 릴레이션의 특성"]
C34["34 슈퍼키·후보 키·기본 키"]
C35["35 관계형 데이터베이스 스키마와 상태"]
C36["36 개체 무결성 제약"]
C37["37 참조 무결성 제약과 외래 키"]
C38["38 키의 종류 비교"]
C39["39 개체 타입의 사상"]
C40["40 다치 속성의 사상"]
C41["41 일대일 관계 타입의 사상"]
C42["42 일대다 관계 타입의 사상"]
C43["43 다대다·n항 관계 타입의 사상"]
C44["44 ER-관계형 사상 절차"]
C45["45 SQL 한눈에 보기"]
C46["46 CREATE SCHEMA와 CREATE TABLE"]
C47["47 SQL 자료형"]
C48["48 속성 제약 NOT NULL·DEFAULT·CHECK"]
C49["49 PRIMARY KEY·UNIQUE·FOREIGN KEY 절"]
C50["50 SELECT-FROM-WHERE"]
C51["51 INSERT·DELETE·UPDATE"]
C52["52 갱신 연산과 제약 위반"]
C53["53 참조 동작 SET NULL·CASCADE·SET DEFAULT"]
C54["54 WHERE 없는 질의와 카티션 곱"]
C55["55 별칭과 자기 조인"]
C56["56 다중집합인 표와 DISTINCT"]
C57["57 집합 연산 UNION·EXCEPT·INTERSECT"]
C58["58 DROP 명령과 CASCADE·RESTRICT"]
C59["59 ALTER TABLE"]
C60["60 중첩 질의와 IN"]
C61["61 ANY와 ALL"]
C62["62 EXISTS와 NOT EXISTS"]
C63["63 NULL 값과 IS NULL"]
C64["64 FROM 절의 조인 (JOIN ON)"]
C65["65 자연 조인 NATURAL JOIN"]
C66["66 외부 조인"]
C67["67 내부 조인과 외부 조인 비교"]
C68["68 집계 함수"]
C69["69 GROUP BY"]
C70["70 HAVING"]
C71["71 WHERE와 HAVING 비교"]
C72["72 ORDER BY와 질의의 절 순서"]
C73["73 주장 CREATE ASSERTION"]
C74["74 트리거와 ECA 규칙"]
C75["75 뷰"]
C76["76 질의 수정과 뷰 실체화"]
C77["77 뷰 갱신 문제"]
C78["78 뷰와 기본 테이블 비교"]
C1 --> C2
C1 --> C3
C1 --> C4
C2 --> C4
C1 --> C5
C2 --> C5
C1 --> C6
C5 --> C6
C5 --> C7
C6 --> C7
C7 --> C8
C6 --> C8
C7 --> C9
C3 --> C9
C9 --> C10
C3 --> C10
C2 --> C10
C11 --> C12
C11 --> C13
C12 --> C13
C11 --> C14
C13 --> C15
C14 --> C15
C11 --> C16
C15 --> C16
C13 --> C17
C15 --> C17
C5 --> C18
C18 --> C19
C19 --> C20
C19 --> C21
C20 --> C21
C19 --> C22
C22 --> C23
C22 --> C24
C22 --> C25
C24 --> C26
C21 --> C27
C25 --> C27
C21 --> C28
C27 --> C28
C20 --> C29
C21 --> C29
C24 --> C29
C25 --> C29
C27 --> C29
C24 --> C30
C25 --> C30
C29 --> C30
C20 --> C31
C21 --> C31
C26 --> C31
C27 --> C31
C29 --> C31
C30 --> C31
C5 --> C32
C6 --> C32
C32 --> C33
C20 --> C33
C32 --> C34
C33 --> C34
C21 --> C34
C32 --> C35
C34 --> C35
C6 --> C35
C34 --> C36
C33 --> C36
C35 --> C36
C34 --> C37
C35 --> C37
C36 --> C37
C34 --> C38
C36 --> C38
C37 --> C38
C19 --> C39
C20 --> C39
C27 --> C39
C37 --> C39
C20 --> C40
C33 --> C40
C39 --> C40
C24 --> C41
C25 --> C41
C37 --> C41
C39 --> C41
C24 --> C42
C25 --> C42
C37 --> C42
C41 --> C42
C22 --> C43
C24 --> C43
C37 --> C43
C42 --> C43
C31 --> C44
C35 --> C44
C39 --> C44
C40 --> C44
C41 --> C44
C42 --> C44
C43 --> C44
C9 --> C45
C35 --> C45
C45 --> C46
C35 --> C46
C46 --> C47
C46 --> C48
C47 --> C48
C46 --> C49
C34 --> C49
C37 --> C49
C45 --> C50
C35 --> C50
C37 --> C50
C46 --> C51
C48 --> C51
C50 --> C51
C51 --> C52
C49 --> C52
C34 --> C52
C36 --> C52
C37 --> C52
C49 --> C53
C52 --> C53
C48 --> C53
C50 --> C54
C50 --> C55
C54 --> C55
C50 --> C56
C34 --> C56
C50 --> C57
C56 --> C57
C46 --> C58
C51 --> C58
C49 --> C58
C46 --> C59
C49 --> C59
C58 --> C59
C50 --> C60
C55 --> C60
C60 --> C61
C60 --> C62
C33 --> C63
C50 --> C63
C50 --> C64
C55 --> C64
C64 --> C65
C64 --> C66
C63 --> C66
C64 --> C67
C66 --> C67
C50 --> C68
C56 --> C68
C63 --> C68
C68 --> C69
C64 --> C69
C69 --> C70
C50 --> C71
C70 --> C71
C50 --> C72
C70 --> C72
C62 --> C73
C48 --> C73
C55 --> C73
C51 --> C74
C60 --> C74
C73 --> C74
C50 --> C75
C69 --> C75
C7 --> C75
C75 --> C76
C75 --> C77
C51 --> C77
C69 --> C77
C34 --> C77
C75 --> C78
C46 --> C78
C77 --> C78