MSSQL · 커리큘럼
MSSQL 커리큘럼
데이터베이스를 직접 다룹니다. 예제마다 실제로 돌려 얻은 결과를 함께 싣습니다.
1부
기초
테이블을 만들고 조회하는 것까지, 데이터베이스를 다루는 가장 작은 조각들입니다.
- 1.1 관계형 데이터베이스와 SQL Server 테이블·행·열이 무엇인지, SQL 이 무엇을 시키는 말인지 봅니다.
- 1.2 실습 환경 만들기 LocalDB 와 SSMS 를 갖추고 실습 데이터베이스를 만듭니다. 이후 모든 단원이 이 자료를 사용합니다.
- 1.3 데이터베이스와 테이블 CREATE TABLE 로 담을 자리를 만들고, 만든 것을 확인하고 지웁니다.
- 1.4 데이터 형식 int·decimal·nvarchar·datetime2 가운데 무엇을 선택해야 하는지 봅니다. 한글이 깨지는 자리도 함께 봅니다.
- 1.5 SELECT 로 조회하기 필요한 열만 가져와 이름을 붙이고, DISTINCT 로 중복을 걷어냅니다. 이어 붙일 때 NULL 이 무엇을 삼키는지도 봅니다.
- 1.6 WHERE 로 걸러내기 비교·논리 연산자와 BETWEEN · IN · LIKE 로 원하는 행만 남깁니다. 괄호를 빠뜨렸을 때와 NULL 이 조건에서 빠지는 것도 봅니다.
- 1.7 정렬과 상위 N개 ORDER BY 로 차례를 정하고 TOP · OFFSET FETCH 로 끊어 냅니다. 적지 않으면 차례가 없다는 것도 실제로 봅니다.
- 1.8 행을 넣고 고치고 지우기 INSERT · UPDATE · DELETE 와 OUTPUT 절입니다. WHERE 를 빠뜨리면 어떤 일이 벌어지는지 직접 봅니다.
- 1.9 NULL 다루기 값이 없다는 것은 0 이나 빈 문자열과 다릅니다. ISNULL 이 한글을 깨뜨리는 것과 NOT IN 이 한 건도 내지 않는 것도 봅니다.
- 1.10 문자열과 날짜 함수 자주 사용하는 내장 함수와 형 변환입니다. 열에 함수를 씌우면 인덱스를 사용하지 못한다는 것으로 1부를 맺습니다.
2부
조회 심화
테이블을 잇고 묶고 셈합니다. 화면에 필요한 모양으로 결과를 만드는 방법들입니다.
- 2.1 JOIN — 테이블을 잇기 INNER · LEFT · CROSS 와 잘못 이었을 때 벌어지는 일입니다. LEFT JOIN 이 INNER 로 바뀌는 자리를 실제 건수로 봅니다.
- 2.2 집계와 GROUP BY COUNT · SUM · AVG 로 셈하고 무엇을 기준으로 묶을지 정합니다. 정수 평균과 LEFT JOIN 뒤의 COUNT 함정도 봅니다.
- 2.3 HAVING 과 집계 조건 WHERE 는 행을, HAVING 은 묶음을 거릅니다. 절이 실행되는 차례를 알면 별칭을 어디서 사용할 수 있는지도 함께 풀립니다.
- 2.4 서브쿼리 스칼라·다중 행·상관 서브쿼리와 EXISTS 입니다. 1.9 에서 미뤄 둔 NOT IN 과 NOT EXISTS 를 여기서 마무리합니다.
- 2.5 공통 테이블 식(CTE) WITH 로 이름을 붙여 읽기 쉽게 만들고, 재귀 CTE 로 계층을 따라 내려갑니다. 실습 데이터의 정렬 열도 이 문법으로 만들었습니다.
- 2.6 집합 연산 UNION · UNION ALL · INTERSECT · EXCEPT 로 결과끼리 합치고 뺍니다. 여기서는 NULL 을 같다고 보는 것도 함께 봅니다.
- 2.7 윈도 함수 OVER 로 행을 묶지 않고 셈합니다. 순위 셋의 차이와 그룹마다 상위 N 을 뽑는 정석을 봅니다.
- 2.8 조건식 CASE · IIF · CHOOSE 로 값에 따라 다른 것을 냅니다. 집계 안에 넣어 한 줄에 여러 셈을 내는 방법이 핵심입니다.
- 2.9 PIVOT 과 UNPIVOT 행을 열로 돌립니다. 목록에서 값을 빠뜨리면 자료가 조용히 사라지는 것과, 열 이름을 미리 알아야 하는 제약을 봅니다.
3부
설계
어떤 테이블을 두고 무엇으로 이을지 정합니다. 여기서 잘못 잡으면 뒤에서 계속 비용을 치릅니다.
- 3.1 정규화 1~3정규형까지, 그리고 어디서 멈춰야 하는지 봅니다. 실습 데이터를 한 표로 합쳐 놓고 무엇이 무너지는지 세어 봅니다.
- 3.2 기본 키와 식별자 전략 IDENTITY · 시퀀스 · GUID 가운데 무엇을 선택해야 하는지 비교합니다. GUID 를 클러스터형 키로 삼았을 때의 단편화를 직접 재 봅니다.
- 3.3 외래 키와 참조 무결성 가리키는 관계를 데이터베이스가 지키게 합니다. CASCADE 의 뜻과 위험, 그리고 걸 수 없는 자리를 봅니다.
- 3.4 제약 조건 CHECK · UNIQUE · DEFAULT, 그리고 필터 인덱스로 만드는 조건부 고유입니다. 제약마다 NULL 을 다르게 다룹니다.
- 3.5 인덱스 기초 클러스터형과 비클러스터형이 무엇인지, 만들면 어떤 비용이 생기는지 봅니다. 10만 행짜리 표에서 읽은 페이지를 세어 비교합니다.
- 3.6 계산 열 다른 열에서 값을 이끌어 냅니다. PERSISTED 와 인덱스를 걸 때의 전제, 그리고 3.5 에서 미뤄 둔 문제의 해법입니다.
- 3.7 뷰 언제 사용하고 언제 사용하지 말아야 하는지, 인덱싱된 뷰는 무엇인지 봅니다. 뷰가 자료를 담지 않는다는 사실에서 나머지가 따라옵니다.
- 3.8 스키마와 명명 규약 테이블을 영역으로 나누는 기준과 이름 규칙을 정해 두는 까닭입니다. 스키마를 빼고 적은 이름이 무엇을 여는지 봅니다.
- 3.9 계층 데이터 모델링 인접 목록·정렬 열·경로 열거·hierarchyid 를 비교합니다. 실습 데이터가 그 하나를 사용하는 까닭을 같은 화면을 네 번 내면서 셈합니다.
- 3.10 실습 — 게시판 스키마 설계 요구사항에서 테이블까지, 3부에서 배운 것을 한 번에 적용합니다. 태그·좋아요·지우기 셋을 설계하며 무엇을 내줄지 고릅니다.
4부
T-SQL 프로그래밍
SQL Server 가 표준에 더한 문법입니다. 절차를 적고 프로시저에 담습니다.
- 4.1 변수와 흐름 제어 DECLARE 로 값을 담고 IF · WHILE 로 조건에 따라 다른 문장을 실행합니다. 배치와 GO, 그리고 조용히 틀리는 자리 셋을 봅니다.
- 4.2 저장 프로시저 기초 만들고 부르는 법, 그리고 쿼리를 프로시저에 두는 까닭 셋을 재서 봅니다.
- 4.3 매개 변수 입력·출력·기본값을 다루고, RETURN 과 OUTPUT 이 어떻게 다른지 봅니다. 조용히 틀리는 자리 셋이 여기 있습니다.
- 4.4 사용자 정의 함수 스칼라 함수와 인라인 TVF, 그리고 스칼라 함수가 느려지는 까닭입니다. 인라인이 되는지가 갈림길입니다.
- 4.5 오류 처리 TRY...CATCH · THROW · XACT_ABORT 로 잘못됐을 때를 다룹니다. 오류가 나도 다음 문장이 실행된다는 데서 시작합니다.
- 4.6 트랜잭션 COMMIT 과 ROLLBACK, 그리고 중첩 트랜잭션이 만드는 함정입니다. 중첩은 중첩되지 않습니다.
- 4.7 트리거 AFTER 와 INSTEAD OF, 그리고 사용하기 전에 따져 볼 것들입니다. 트리거는 행마다 돌지 않습니다.
- 4.8 커서와 집합 기반 사고 한 행씩 도는 코드를 집합을 다루는 문장으로 바꿉니다. 4.1 에서 미뤄 둔 것을 여기서 갚습니다.
- 4.9 동적 SQL 과 SQL 주입 sp_executesql 로 문장을 만들고, 매개 변수화가 무엇을 막는지 봅니다. 실습 데이터베이스에서 실제로 뚫어 보입니다.
- 4.10 테이블 반환 매개 변수(TVP) 여러 행을 한 번에 넘깁니다. 반복 호출을 한 번으로 줄이는 방법이고, 4부를 여기서 맺습니다.
5부
성능
같은 결과를 내는 문장도 속도가 다릅니다. 왜 느린지 읽고 고치는 방법입니다.
- 5.1 실행 계획 읽기 예상 계획과 실제 계획을 보고, 스캔과 탐색이 어떻게 다른지 봅니다.
- 5.2 인덱스 설계와 커버링 포함 열과 복합 인덱스의 열 순서를 정합니다.
- 5.3 통계와 매개 변수 스니핑 계획이 어긋나는 까닭과 OPTION RECOMPILE 을 봅니다.
- 5.4 SARGable 조건 함수로 감싼 열이 인덱스를 사용하지 못하는 까닭입니다.
- 5.5 잠금과 격리 수준 블로킹과 교착이 생기는 자리, 그리고 READ COMMITTED SNAPSHOT 입니다.
- 5.6 페이징 OFFSET FETCH 와 키 기반 페이징을 비교하고, 총 건수를 세는 값을 따집니다.
- 5.7 대량 처리와 배치 삭제 큰 트랜잭션이 만드는 문제와 끊어 지우는 방법입니다.
- 5.8 전문 검색 인덱스를 만들고 CONTAINS 로 찾습니다. 언어마다 단어를 나누는 방식이 다른 점도 봅니다.
6부
운영과 실전
만든 것을 실제로 돌리고 지키는 일입니다. 마지막 두 단원에서 게시판을 한 벌로 완성합니다.
- 6.1 권한과 보안 로그인·사용자·역할을 나누고 최소 권한만 줍니다.
- 6.2 백업과 복구 복구 모델을 선택하고 특정 시점으로 되돌립니다.
- 6.3 스키마 변경과 배포 운영 중인 테이블을 고치는 순서와 되돌릴 수 있게 두는 방법입니다.
- 6.4 데이터베이스 프로젝트 SSDT(.sqlproj)로 스크립트를 형상 관리에 둡니다.
- 6.5 응용 프로그램에서 부르기 ADO.NET 으로 프로시저를 호출하고 매개 변수를 넘깁니다.
- 6.6 로그와 보관 정책 기록을 어디에 쌓고 언제 지울지 정합니다.
- 6.7 실전 — 게시판 프로시저 세트 목록·상세·저장·답글·삭제를 한 벌로 만듭니다.
- 6.8 실전 — 통계 집계 일·월 집계 테이블을 두고 배치로 채웁니다.