데이타베이스/SqlServer

SQL Server: 데이터베이스의 기초부터 고급 활용까지

shimdh 2025. 1. 24. 17:31
728x90

1. 데이터베이스 및 테이블 생성

데이터베이스 생성

SQL Server에서 데이터베이스를 생성하려면 CREATE DATABASE 명령어를 사용합니다. 데이터베이스는 정보를 조직적으로 저장할 수 있는 독립적인 공간을 제공합니다. 조직화된 데이터베이스는 여러 사용자나 애플리케이션이 동시에 데이터를 읽고 쓸 수 있도록 효율적으로 설계됩니다.

예제:

CREATE DATABASE SampleDB;

이 코드는 "SampleDB"라는 이름의 데이터베이스를 생성합니다. 생성된 데이터베이스는 SQL Server Management Studio(SSMS)에서 확인할 수 있으며, 다양한 작업을 수행하는 기반이 됩니다. 데이터베이스 생성 후, 해당 데이터베이스를 선택하여 특정 작업을 수행할 수 있습니다. 예를 들어, 특정 데이터베이스를 선택하려면 다음과 같은 명령을 사용할 수 있습니다:

USE SampleDB;

이 명령은 SQL Server의 작업 영역을 지정된 데이터베이스로 전환합니다.

테이블 생성

테이블은 데이터를 저장하는 구조로, 각 열(column)은 특정 데이터 타입을 가지며, 각 행(row)은 구체적인 데이터를 포함합니다. 테이블은 데이터베이스에서 가장 기본적인 저장 단위로 사용됩니다. 테이블을 설계할 때 각 열에 대한 데이터 타입과 제약 조건을 신중히 선택해야 데이터 무결성을 보장할 수 있습니다.

예제:

CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    FirstName NVARCHAR(50),
    LastName NVARCHAR(50),
    HireDate DATE,
    Salary DECIMAL(10, 2)
);

위 예제는 직원 정보를 저장하는 "Employees" 테이블을 생성합니다. 이 테이블은 직원 ID(EmployeeID)를 기본 키로 설정하여 각 행의 고유성을 보장합니다. 테이블 설계 시 열 이름과 데이터 타입 외에도 제약 조건(Constraints)을 정의하면 데이터의 일관성을 더욱 강화할 수 있습니다.

외래 키를 이용한 테이블 간 관계 설정

외래 키(Foreign Key)는 데이터베이스 테이블 간의 관계를 정의하는 데 사용됩니다. 외래 키를 통해 데이터의 참조 무결성을 보장할 수 있습니다. 예를 들어, 직원 테이블과 부서 테이블 간의 관계를 정의하려면 다음과 같이 외래 키를 설정할 수 있습니다.

예제:

CREATE TABLE Departments (
    DepartmentID INT PRIMARY KEY,
    DepartmentName NVARCHAR(50)
);

CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    FirstName NVARCHAR(50),
    LastName NVARCHAR(50),
    HireDate DATE,
    Salary DECIMAL(10, 2),
    DepartmentID INT FOREIGN KEY REFERENCES Departments(DepartmentID)
);

이 코드는 "Employees"와 "Departments" 테이블 간의 관계를 설정합니다. 이를 통해 각 직원이 특정 부서에 속해 있음을 나타낼 수 있습니다. 외래 키는 두 테이블 간의 데이터 무결성을 보장하며, 잘못된 데이터 입력을 방지합니다.


2. 데이터 형식 이해

SQL Server는 데이터를 저장할 때 다양한 데이터 형식을 지원합니다. 각 데이터 형식은 데이터를 효율적으로 관리하고 무결성을 유지하는 데 중요한 역할을 합니다. 데이터 형식을 올바르게 선택하면 데이터베이스의 성능과 효율성을 크게 향상시킬 수 있습니다.

주요 데이터 형식

  • 정수형 (Integer Types):
    • INT: 일반적인 정수형 데이터 타입으로, 예를 들어 사용자 ID와 같은 값을 저장하는 데 적합합니다. 최대 -2,147,483,648에서 2,147,483,647까지의 값을 저장할 수 있습니다.
    • BIGINT: 더 큰 범위의 정수를 저장할 수 있습니다. 최대 9,223,372,036,854,775,807까지 저장 가능합니다.
  • 문자열형 (Character Types):
    • NVARCHAR(n): 가변 길이의 문자열로, 사용자 이름과 같은 데이터를 저장하는 데 적합합니다. 유니코드 데이터를 지원하므로 다국어 환경에서 유용합니다.
    • CHAR(n): 고정 길이 문자열로, 국가 코드와 같이 길이가 일정한 데이터를 저장하는 데 유용합니다.
  • 날짜 및 시간형 (Date and Time Types):
    • DATETIME: 날짜와 시간을 함께 저장합니다. 예를 들어, 주문 날짜나 이벤트 발생 시간을 저장할 수 있습니다.
    • DATE: 날짜만 저장합니다. 예: 생년월일.
    • TIME: 시간만 저장합니다. 예: 영업 시작 시간.
  • BLOB:
    • VARBINARY(MAX): 이미지 또는 파일과 같은 대용량 데이터를 저장하는 데 사용됩니다. 파일 업로드나 바이너리 데이터를 저장할 때 유용합니다.

예제:

CREATE TABLE Customers (
    CustomerID INT PRIMARY KEY,
    FirstName NVARCHAR(50),
    LastName NVARCHAR(50),
    Email NVARCHAR(100),
    RegistrationDate DATETIME,
    ProfilePicture VARBINARY(MAX)
);

이 코드는 고객 정보를 저장하는 "Customers" 테이블을 정의합니다. 올바른 데이터 형식을 선택하면 데이터베이스의 성능과 효율성이 크게 향상됩니다. 데이터 형식을 선택할 때는 저장 용량, 성능, 데이터 유효성 등을 고려해야 합니다.

데이터 형식의 중요성

올바른 데이터 형식을 선택하는 것은 데이터 무결성을 유지하고 저장 공간을 최적화하며, 쿼리 성능을 높이는 데 필수적입니다. 예를 들어, 숫자 데이터를 저장하는 데 문자열 형식을 사용하는 것은 비효율적일 수 있습니다. 또한, 잘못된 데이터 형식 선택은 쿼리 성능 저하나 저장소 낭비로 이어질 수 있습니다.


3. 인덱스: 성능 최적화의 핵심

인덱스는 데이터를 빠르게 검색하기 위한 구조입니다. 잘 설계된 인덱스는 쿼리 성능을 크게 향상시킬 수 있으며, 특히 대량의 데이터를 처리하는 애플리케이션에서 중요합니다. 그러나 잘못된 인덱스 설계는 오히려 성능을 저하시킬 수 있으므로 신중히 설계해야 합니다.

인덱스 생성

  • 클러스터형 인덱스: 테이블 데이터의 물리적 정렬을 결정합니다. 클러스터형 인덱스는 한 테이블에 하나만 생성할 수 있습니다. 기본 키는 자동으로 클러스터형 인덱스로 설정되는 경우가 많습니다.

    CREATE CLUSTERED INDEX IDX_CustomerID ON Customers(CustomerID);
  • 논클러스터형 인덱스: 데이터와 별도의 구조로 존재하며, 여러 개를 생성할 수 있습니다. 논클러스터형 인덱스는 특정 쿼리 성능을 최적화하는 데 유용합니다.

    CREATE NONCLUSTERED INDEX IDX_OrderDate ON Orders(OrderDate);

인덱스의 활용

인덱스는 쿼리 성능을 최적화하는 데 유용하지만, 너무 많은 인덱스를 생성하면 삽입/갱신 작업의 성능이 저하될 수 있습니다. 따라서 인덱스를 설계할 때는 데이터 액세스 패턴을 고려해야 합니다. 인덱스는 주로 WHERE 절, JOIN 조건, ORDER BY 등에 사용되는 열에 적용됩니다.

주의사항

  • 너무 많은 인덱스는 삽입/갱신 작업의 성능을 저하시킬 수 있습니다.
  • 주기적으로 인덱스를 점검하고 불필요한 인덱스를 제거하세요.
  • 인덱스는 읽기 성능을 향상시키지만, 쓰기 작업에서는 추가적인 부하를 초래할 수 있습니다.

4. 뷰(View): 데이터 접근 및 보안 강화

뷰는 복잡한 쿼리를 단순화하고 특정 데이터 집합에 대한 접근 권한을 제공하는 가상의 테이블입니다. 뷰는 물리적으로 데이터를 저장하지 않으며, 기본 테이블에 대한 쿼리를 정의합니다. 뷰를 사용하면 데이터 접근을 간소화하고 보안을 강화할 수 있습니다.

뷰 생성

예제:

CREATE VIEW vw_EmployeeDepartment AS
SELECT
    e.EmployeeID,
    e.FirstName,
    e.LastName,
    d.DepartmentName
FROM
    Employees e
JOIN
    Departments d ON e.DepartmentID = d.DepartmentID;

이 코드는 "Employees"와 "Departments" 테이블을 조인하여 직원과 부서 정보를 포함하는 뷰를 생성합니다. 뷰를 통해 자주 사용하는 쿼리를 미리 정의할 수 있어 개발과 유지보수를 간소화합니다.

뷰 활용

뷰는 일반 테이블처럼 쿼리할 수 있습니다.

SELECT * FROM vw_EmployeeDepartment WHERE DepartmentName = 'Sales';

뷰를 사용하면 복잡한 쿼리를 반복적으로 작성하지 않아도 되며, 특정 데이터를 사용자에게 안전하게 노출할 수 있습니다. 또한, 뷰를 통해 데이터베이스 내의 민감한 정보를 숨길 수 있습니다.

업데이트 가능한 뷰

일부 조건을 만족하면 뷰를 통해 데이터를 수정할 수도 있습니다.

UPDATE vw_EmployeeDepartment SET FirstName = 'John' WHERE EmployeeID = 1;

업데이트 가능한 뷰는 복잡한 비즈니스 로직을 간소화하는 데 유용합니다. 그러나 뷰에 집계 함수나 GROUP BY가 포함되어 있는 경우 데이터 수정이 제한될 수 있습니다.


5. 실습 시나리오: 데이터베이스 설계 및 활용

  1. 데이터베이스 및 테이블 생성:

    CREATE DATABASE CompanyDB;
    USE CompanyDB;
    
    CREATE TABLE Departments (
        DepartmentID INT PRIMARY KEY,
        DepartmentName NVARCHAR(50)
    );
    
    CREATE TABLE Employees (
        EmployeeID INT PRIMARY KEY,
        FirstName NVARCHAR(50),
        LastName NVARCHAR(50),
        HireDate DATE,
        Salary DECIMAL(10, 2),
        DepartmentID INT FOREIGN KEY REFERENCES Departments(DepartmentID)
    );
  2. 샘플 데이터 삽입:

    INSERT INTO Departments (DepartmentID, DepartmentName) VALUES (1, 'HR'), (2, 'IT');
    INSERT INTO Employees (EmployeeID, FirstName, LastName, HireDate, Salary, DepartmentID)
    VALUES
    (1, 'Alice', 'Smith', '2023-01-10', 50000, 1),
    (2, 'Bob', 'Johnson', '2023-02-20', 60000, 2);
  3. 인덱스 생성 및 성능 테스트:

    CREATE NONCLUSTERED INDEX IDX_Salary ON Employees(Salary);
    SELECT * FROM Employees WHERE Salary > 55000;
  4. 뷰 생성 및 활용:

    CREATE VIEW vw_EmployeeDetails AS
    SELECT
        e.EmployeeID, e.FirstName, e.LastName, e.Salary, d.DepartmentName
    FROM
        Employees e
    JOIN
        Departments d ON e.DepartmentID = d.DepartmentID;
    
    SELECT * FROM vw_EmployeeDetails;

결론

SQL Server를 활용한 데이터베이스 설계와 관리의 핵심은 데이터베이스 생성, 적절한 데이터 형식 선택, 효율적인 인덱스 활용, 그리고 뷰를 통해 데이터 접근을 단순화하는 것입니다. 이러한 기본기를 바탕으로 성능을 최적화하고 데이터의 무결성을 유지하며, 유연하고 확장 가능한 시스템을 구축할 수 있습니다. 지속적인 학습과 실습을 통해 SQL Server의 잠재력을 최대한 활용해 보세요.

728x90