테이블 생성
기본 테이블 생성
CREATE TABLE Employees (
EmployeeID INT IDENTITY(1,1) PRIMARY KEY,
FirstName NVARCHAR(50) NOT NULL,
LastName NVARCHAR(50) NOT NULL,
Email NVARCHAR(100) UNIQUE,
Department NVARCHAR(50),
Salary DECIMAL(10, 2),
HireDate DATE DEFAULT GETDATE(),
IsActive BIT DEFAULT 1
);
외래 키가 있는 테이블 생성
CREATE TABLE Departments (
DepartmentID INT IDENTITY(1,1) PRIMARY KEY,
DepartmentName NVARCHAR(100) NOT NULL
);
CREATE TABLE Employees2 (
EmployeeID INT IDENTITY(1,1) PRIMARY KEY,
FirstName NVARCHAR(50) NOT NULL,
LastName NVARCHAR(50) NOT NULL,
DepartmentID INT,
CONSTRAINT FK_Department FOREIGN KEY (DepartmentID)
REFERENCES Departments(DepartmentID)
);
CHECK 제약 조건 추가
CREATE TABLE Products (
ProductID INT IDENTITY(1,1) PRIMARY KEY,
ProductName NVARCHAR(100) NOT NULL,
Price DECIMAL(10, 2) CHECK (Price > 0),
StockQuantity INT CHECK (StockQuantity >= 0)
);
인덱스 생성
클러스터형 인덱스 (기본적으로 PK에 자동 생성)
CREATE CLUSTERED INDEX IX_Employees_EmployeeID ON Employees (EmployeeID);
💡 PRIMARY KEY 지정 시 기본적으로 클러스터형 인덱스가 자동 생성되므로, 보통 명시적으로 만들 필요는 없습니다.
비클러스터형 인덱스 (단일 컬럼)
CREATE NONCLUSTERED INDEX IX_Employees_LastName ON Employees (LastName);
CREATE NONCLUSTERED INDEX IX_Employees_Dept_Salary ON Employees (Department, Salary);
<source lang=sql> CREATE UNIQUE NONCLUSTERED INDEX IX_Employees_Email ON Employees (Email); 포함 열(Included Columns)을 사용한 인덱스 sql
접기 저장 복사 1 2 3 ⌄ CREATE NONCLUSTERED INDEX IX_Employees_Dept_Include ON Employees (Department) INCLUDE (FirstName, LastName, Salary); 필터링된 인덱스 sql
접기 저장 복사 1 2 3 ⌄ CREATE NONCLUSTERED INDEX IX_Employees_Active ON Employees (Department) WHERE IsActive = 1; 3. 인덱스 관리 인덱스 확인 sql
접기 저장 복사 1 2 3 4 5 6 7 ⌄ SELECT
i.name AS IndexName, i.type_desc AS IndexType, t.name AS TableName
FROM sys.indexes i INNER JOIN sys.tables t ON i.object_id = t.object_id WHERE t.name = 'Employees'; 인덱스 삭제 sql
접기 저장 복사 1 DROP INDEX IX_Employees_LastName ON Employees; 인덱스 재구성/재구축 (성능 유지) sql
접기 저장 복사 1 2 3 4 5 6 7 8 -- 재구성 (가벼운 작업) ALTER INDEX IX_Employees_LastName ON Employees REORGANIZE;
-- 재구축 (완전 재생성) ALTER INDEX IX_Employees_LastName ON Employees REBUILD;
-- 모든 인덱스 재구축 ALTER INDEX ALL ON Employees REBUILD; 4. 전체 예제 (실습용) sql
접기 저장 복사 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ⌄ ⌄ ⌄ ⌄ ⌄ ⌄ -- 데이터베이스 생성 CREATE DATABASE TestDB; GO USE TestDB; GO
-- 테이블 생성 CREATE TABLE Customers (
CustomerID INT IDENTITY(1,1) PRIMARY KEY, CustomerName NVARCHAR(100) NOT NULL, City NVARCHAR(50), Country NVARCHAR(50), RegisterDate DATETIME DEFAULT GETDATE()
);
-- 샘플 데이터 삽입 INSERT INTO Customers (CustomerName, City, Country) VALUES
('홍길동', '서울', '한국'),
('김철수', '부산', '한국'),
('이영희', '대구', '한국');
-- 인덱스 생성 (검색 성능 향상) CREATE NONCLUSTERED INDEX IX_Customers_City ON Customers (City);
CREATE NONCLUSTERED INDEX IX_Customers_Country_City ON Customers (Country, City) INCLUDE (CustomerName);
-- 인덱스 사용 확인 (실행 계획 확인용) SELECT CustomerName, City FROM Customers WHERE City = '서울';