Categories: SQL

SQL에서 테이블 생성하기 (CREATE TABLE 사용법)

안녕하세요, 여러분! 데이터베이스의 세계에 발을 들여놓으신 걸 환영해요! 오늘 우리가 함께 탐험할 주제는 바로 SQL에서 테이블 생성하기랍니다. 마치 건축가가 멋진 건물을 짓듯이, 데이터베이스에서도 원하는 정보를 담을 테이블을 만들어야 하죠. ‘어떻게 만들지?’ 걱정하실 필요 없어요! CREATE TABLE 사용법만 알면 생각보다 훨씬 쉽게 테이블을 만들 수 있답니다. 데이터 유형과 제약 조건 설정하는 방법부터 실제 테이블 생성 예시까지, 그리고 혹시 모를 자주 발생하는 오류와 해결 방법까지 차근차근 알려드릴게요. 자, 그럼 저와 함께 즐겁게 SQL 테이블 생성의 세계로 떠나볼까요?

 

 

테이블 생성의 기본 구문

자, 이제 본격적으로 SQL에서 테이블을 만드는 방법을 알아볼까요? 마치 레고 블록을 쌓아 올리듯, 테이블을 생성하는 과정은 데이터베이스의 기초를 다지는 중요한 작업이랍니다! CREATE TABLE 구문을 사용하면 되는데요, 처음엔 조금 복잡해 보일 수 있지만, 걱정 마세요! 하나씩 차근차근 설명해 드릴게요. 마치 친절한 가이드처럼 말이죠!

기본 구문

기본적인 구문은 다음과 같아요. CREATE TABLE 테이블 이름 (컬럼 정의); 간단하죠? 하지만 컬럼 정의 부분이 핵심이에요! 여기서 데이터 유형, 제약 조건 등을 명시해야 하거든요. 마치 건축 설계도를 그리는 것과 같다고 할까요? 벽돌의 종류, 크기, 위치 등을 정확하게 지정해야 튼튼한 집을 지을 수 있듯이, 데이터베이스 테이블도 마찬가지랍니다.

컬럼 정의

자, 그럼 컬럼 정의를 좀 더 자세히 들여다볼게요. 각 컬럼은 컬럼 이름 데이터 유형 [제약 조건] 형태로 정의해요. 예를 들어, 사용자 정보를 저장하는 테이블을 만들고 싶다면, user_id INT PRIMARY KEY, user_name VARCHAR(50) NOT NULL 과 같이 컬럼을 정의할 수 있겠죠? 여기서 INT는 정수형 데이터 유형, VARCHAR(50)은 최대 50자까지 저장 가능한 문자열 데이터 유형을 의미해요. PRIMARY KEYNOT NULL은 제약 조건인데요, PRIMARY KEY는 각 사용자를 고유하게 식별하는 역할을 하고, NOT NULL은 해당 컬럼에 반드시 값이 입력되어야 함을 나타내요. 이처럼 데이터 유형과 제약 조건을 적절히 활용하면 데이터의 무결성을 보장하고, 효율적인 데이터 관리가 가능해진답니다!

데이터 유형

SQL은 다양한 데이터 유형을 지원하는데요, 숫자를 저장하는 INT, DECIMAL, FLOAT부터 문자열을 저장하는 CHAR, VARCHAR, TEXT, 날짜와 시간을 저장하는 DATE, TIME, DATETIME까지, 정말 다양하죠? 각 데이터 유형은 저장 가능한 값의 범위와 크기가 다르기 때문에, 저장할 데이터의 특성에 맞춰 적절한 유형을 선택하는 것이 중요해요. 예를 들어, 사용자의 나이를 저장한다면 INT를, 이름을 저장한다면 VARCHAR를 사용하는 것이 좋겠죠? 이처럼 데이터 유형을 잘 선택하면 저장 공간을 효율적으로 사용하고, 데이터 검색 속도도 향상시킬 수 있답니다!

제약 조건

제약 조건은 데이터의 정확성과 일관성을 유지하는 데 필수적인 요소예요. PRIMARY KEY, FOREIGN KEY, NOT NULL, UNIQUE, CHECK 등 다양한 제약 조건이 있는데, 각각 고유한 역할을 수행해요. PRIMARY KEY는 테이블의 각 행을 고유하게 식별하는 역할을 하고, FOREIGN KEY는 다른 테이블과의 관계를 정의하는 데 사용되죠. NOT NULL은 특정 컬럼에 NULL 값이 입력되는 것을 방지하고, UNIQUE는 컬럼의 값이 중복되지 않도록 강제해요. CHECK 제약 조건을 사용하면 특정 조건을 만족하는 값만 입력되도록 제한할 수도 있답니다. 이처럼 제약 조건을 잘 활용하면 데이터의 무결성을 보장하고, 데이터베이스의 안정성을 높일 수 있어요!

자, 이제까지 테이블 생성의 기본 구문과 컬럼 정의, 데이터 유형, 제약 조건에 대해 알아봤어요. 처음엔 조금 어려워 보일 수 있지만, 몇 번 연습하다 보면 금방 익숙해질 거예요! 다음에는 실제 테이블 생성 예시를 통해 좀 더 구체적으로 알아보도록 할게요. 기대해 주세요!

 

데이터 유형과 제약 조건 설정

자, 이제 테이블을 만들 뼈대는 세웠으니 살을 붙여 볼까요? ^^ 바로 데이터 유형과 제약 조건을 설정하는 단계입니다! 이 부분이 정말 중요해요!! 왜냐하면 데이터베이스의 효율성과 데이터 무결성을 좌우하는 핵심 요소거든요. 마치 집을 지을 때 벽돌, 시멘트, 목재를 고르는 것처럼 신중하게 선택해야 한답니다!

데이터 유형

데이터 유형부터 살펴볼게요. SQL은 다양한 데이터 유형을 지원하는데, 크게 숫자형, 문자형, 날짜/시간형으로 나눌 수 있어요. 각 유형마다 저장할 수 있는 데이터의 종류와 범위가 다르니, 저장할 데이터의 특성에 맞는 유형을 선택하는 것이 중요해요. 예를 들어, 사용자의 나이를 저장한다면 INT(정수형)를, 이름을 저장한다면 VARCHAR(가변길이 문자형)를 사용하는 것이 적절하겠죠? 만약 섬세한 소수점 연산이 필요한 경우라면? DECIMAL(고정 소수점형)을 사용하면 되고요! 이처럼 데이터 유형을 잘 선택하면 저장 공간을 절약하고 쿼리 성능을 향상시킬 수 있답니다.

다양한 데이터 유형

자, 그럼 각 데이터 유형을 좀 더 자세히 알아볼까요? 숫자형에는 TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT, FLOAT, DOUBLE, DECIMAL 등이 있어요. 각 유형이 표현할 수 있는 범위가 다르다는 점, 꼭 기억해 두세요! 문자형에는 CHAR(고정길이 문자형), VARCHAR, TEXT, MEDIUMTEXT, LONGTEXT 등이 있는데, CHAR는 고정된 길이의 문자열을 저장하고, VARCHAR는 가변 길이의 문자열을 저장해요. TEXT 유형은 CHAR나 VARCHAR보다 훨씬 긴 문자열을 저장할 수 있고요. 마지막으로 날짜/시간형에는 DATE, TIME, DATETIME, TIMESTAMP, YEAR 등이 있습니다. 각 유형은 날짜, 시간, 또는 날짜와 시간을 함께 저장할 수 있도록 설계되었어요.

데이터 유형 선택의 중요성

이렇게 다양한 데이터 유형 중에서 상황에 맞는 것을 선택하는 것이 중요해요! 예를 들어, 사용자의 생년월일을 저장할 때는 DATE 유형을 사용하는 것이 좋겠죠? 만약 게시글 작성 시간처럼 초 단위까지 정확한 시간 정보가 필요하다면 DATETIME이나 TIMESTAMP를 사용하는 것이 더 적합하고요. 이처럼 데이터 유형을 잘 선택하면 데이터의 정확성과 일관성을 유지할 수 있답니다!

제약 조건

다음으로 제약 조건에 대해 알아볼게요. 제약 조건은 테이블에 저장되는 데이터에 대한 규칙을 정의하는 역할을 해요. 마치 건물을 지을 때 안전 규칙을 준수하는 것처럼, 데이터베이스에도 데이터의 무결성을 보장하기 위한 규칙이 필요하답니다. 주요 제약 조건으로는 NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK 등이 있어요.

주요 제약 조건 설명

NOT NULL 제약 조건은 특정 열에 NULL 값이 저장되는 것을 방지해요. 예를 들어, 사용자 테이블의 ‘이름’ 열에 NOT NULL 제약 조건을 설정하면, 이름을 입력하지 않고는 사용자를 등록할 수 없게 되죠. UNIQUE 제약 조건은 특정 열의 값이 중복되지 않도록 합니다. 예를 들어, ‘이메일’ 열에 UNIQUE 제약 조건을 설정하면 동일한 이메일 주소로 여러 계정을 생성할 수 없게 되겠죠? PRIMARY KEY 제약 조건은 테이블의 각 행을 고유하게 식별하는 역할을 해요. 주민등록번호처럼 각 개인을 유일하게 구분하는 것과 같은 원리죠! FOREIGN KEY 제약 조건은 두 테이블 간의 관계를 정의하는 데 사용됩니다. 예를 들어, ‘게시글’ 테이블과 ‘댓글’ 테이블이 있을 때, 댓글 테이블에 게시글 번호를 FOREIGN KEY로 설정하면 각 댓글이 어떤 게시글에 속하는지 명확하게 알 수 있겠죠? 마지막으로 CHECK 제약 조건은 특정 열에 저장될 수 있는 값의 범위를 제한하는 역할을 해요. 예를 들어, ‘나이’ 열에 CHECK 제약 조건을 설정하여 0보다 큰 값만 입력 가능하도록 제한할 수 있답니다.

데이터 유형 및 제약 조건 설정의 이점

이렇게 데이터 유형과 제약 조건을 적절하게 설정하면 데이터의 정확성과 일관성을 유지하고, 데이터베이스의 성능을 향상시킬 수 있어요. 처음에는 조금 복잡하게 느껴질 수 있지만, 익숙해지면 정말 유용한 기능이라는 것을 알게 될 거예요! 다음에는 실제 테이블 생성 예시를 통해 더 자세히 알아보도록 하겠습니다!

 

실제 테이블 생성 예시

자, 이제 드디어! 앞에서 배운 CREATE TABLE 구문을 활용해서 실제로 테이블을 만들어 볼 시간이에요! 설레지 않나요? ^^ 복잡한 쇼핑몰 데이터베이스부터 간단한 개인 블로그까지, 어떤 종류의 테이블이든 만들 수 있도록 다양한 예시를 준비했어요. 함께 차근차근 살펴보면서 테이블 생성의 달인이 되어 봅시다!

1. 온라인 서점의 ‘도서’ 테이블 생성

먼저 온라인 서점에서 사용할 ‘도서’ 테이블을 만들어 볼게요. 도서 테이블에는 ISBN, 도서명, 저자, 출판사, 가격, 출판일 등의 정보가 필요하겠죠? CREATE TABLE 구문을 사용하면 이런 정보들을 담는 테이블을 쉽게 생성할 수 있답니다.

CREATE TABLE Books (
    ISBN VARCHAR(20) PRIMARY KEY,  -- ISBN을 기본키로 설정!
    title VARCHAR(255) NOT NULL, -- 도서명은 필수 입력!
    author VARCHAR(100),
    publisher VARCHAR(100),
    price DECIMAL(10, 2), -- 가격은 소수점 둘째 자리까지!
    publication_date DATE
);

여기서 VARCHAR(20), DECIMAL(10, 2), DATE처럼 데이터 유형을 지정하고, PRIMARY KEY, NOT NULL처럼 제약 조건을 설정하는 것, 기억나시죠?! 이렇게 하면 데이터의 정확성과 일관성을 유지할 수 있어요! PRIMARY KEY는 각 도서를 유일하게 식별하는 역할을 하고, NOT NULL은 도서명처럼 필수적인 정보가 누락되지 않도록 해준답니다.

2. 쇼핑몰의 ‘고객’ 테이블 생성 – 더욱 복잡한 예시!

이번에는 조금 더 복잡한 예시를 살펴볼까요? 쇼핑몰에서 사용할 ‘고객’ 테이블을 생성해 보겠습니다. 고객 테이블에는 고객 ID, 이름, 이메일, 주소, 전화번호, 가입일 등 다양한 정보가 필요해요. 게다가, 고객 등급에 따라 할인율을 다르게 적용해야 한다면?! 걱정 마세요! CHECK 제약 조건을 사용하면 된답니다!

CREATE TABLE Customers (
    customer_id INT PRIMARY KEY AUTO_INCREMENT, -- 자동으로 증가하는 고객 ID!
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE, -- 이메일은 중복될 수 없도록!
    address VARCHAR(255),
    phone VARCHAR(20),
    join_date DATETIME,
    grade INT CHECK (grade BETWEEN 1 AND 5), -- 고객 등급은 1부터 5까지!
    discount_rate DECIMAL(3, 2) CHECK (discount_rate BETWEEN 0 AND 0.5) -- 할인율은 0~0.5 사이!
);

AUTO_INCREMENT를 사용하면 고객 ID가 자동으로 증가하도록 설정할 수 있어요. UNIQUE 제약 조건은 이메일처럼 중복되면 안 되는 값을 관리하는 데 유용하죠. CHECK 제약 조건을 사용하면 고객 등급이나 할인율처럼 특정 범위 내의 값만 입력되도록 제한할 수 있답니다! 정말 편리하지 않나요? 👍

3. 블로그의 ‘게시글’ 테이블 생성 – 다양한 데이터 유형 활용하기!

이번에는 블로그에서 사용할 ‘게시글’ 테이블을 만들어 볼게요. 게시글 테이블에는 제목, 내용, 작성일, 조회수 등의 정보를 저장해야겠죠? TEXT, DATETIME 등 다양한 데이터 유형을 활용해서 테이블을 생성해 보겠습니다.

CREATE TABLE Posts (
    post_id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(255) NOT NULL,
    content TEXT, -- 긴 텍스트를 저장할 수 있는 TEXT 유형!
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- 작성일은 기본값으로 현재 시간!
    views INT DEFAULT 0 -- 조회수는 기본값으로 0!
);

TEXT 유형은 게시글 내용처럼 긴 텍스트를 저장하는 데 적합해요. DATETIME 유형은 날짜와 시간 정보를 함께 저장할 수 있죠. DEFAULT 키워드를 사용하면 기본값을 설정할 수 있어서 편리해요! 게시글이 생성될 때 작성일은 현재 시간으로, 조회수는 0으로 자동 설정되도록 했어요. 참 쉽죠?! 😊

4. 더 나아가서: 외래 키(Foreign Key)를 사용한 테이블 관계 설정

이제 좀 더 심화된 내용을 알아볼까요? 데이터베이스 설계에서 중요한 개념 중 하나인 외래 키(Foreign Key)를 사용하면 여러 테이블 간의 관계를 설정할 수 있어요. 예를 들어, 온라인 서점 데이터베이스에서 ‘주문’ 테이블과 ‘고객’ 테이블을 연결하려면 어떻게 해야 할까요? ‘주문’ 테이블에 ‘고객 ID’를 외래 키로 추가하면 된답니다!

CREATE TABLE Orders (
    order_id INT PRIMARY KEY AUTO_INCREMENT,
    customer_id INT,  -- 고객 테이블의 customer_id를 참조하는 외래 키!
    order_date DATETIME,
    FOREIGN KEY (customer_id) REFERENCES Customers(customer_id) -- 외래 키 제약 조건 설정!
);

FOREIGN KEY 제약 조건을 사용하면 ‘주문’ 테이블의 customer_id가 반드시 ‘고객’ 테이블에 존재하는 customer_id와 일치해야 한다는 규칙을 설정할 수 있어요. 이렇게 하면 데이터의 무결성을 유지하고, 테이블 간의 관계를 명확하게 표현할 수 있답니다. 데이터베이스 설계의 핵심이라고 할 수 있죠! 😉

자, 이제 여러분은 CREATE TABLE 구문을 활용해서 다양한 테이블을 생성하는 방법을 배우셨어요! 🎉 처음에는 조금 어렵게 느껴질 수도 있지만, 꾸준히 연습하다 보면 어느새 데이터베이스 전문가가 되어 있을 거예요! 화이팅! 💪

 

자주 발생하는 오류와 해결 방법

휴! 드디어 테이블도 만들어 봤겠다, 이제 좀 쉬어도 되겠다 싶죠? 하지만! 세상에… 데이터베이스의 세계는 생각보다 험난하답니다~? ^^; 테이블을 만들다 보면 별별 오류들을 만나게 될 거예요. 마치 함정이 숨겨진 던전을 탐험하는 기분이랄까요? ㅠㅠ 하지만 걱정 마세요! 제가 그 험난한 길에 등불을 밝혀드리겠습니다! 자주 발생하는 오류들과 그 해결 방법을 미리 알아두면 데이터베이스 던전도 무섭지 않아요!

ORA-00955: name is already used by an existing object 오류: 이름 중복 오류

이 오류는 테이블 이름이 이미 존재하는 경우 발생해요. 데이터베이스는 같은 이름의 테이블을 두 개 가질 수 없거든요. 마치 같은 반에 이름이 똑같은 친구가 두 명 있으면 헷갈리는 것과 같아요. (상상만 해도 머리 아프죠? ㅎㅎ)

해결 방법: 가장 간단한 해결책은 테이블 이름을 바꾸는 거예요! 만약 기존 테이블을 삭제하고 새로 만들고 싶다면 DROP TABLE table_name; 명령어를 사용하면 됩니다. (단, 삭제는 신중하게! 한 번 삭제하면 되돌릴 수 없어요!) 기존 테이블을 유지해야 한다면, 새로운 테이블 이름을 고민해 보세요~ table_name_v2처럼 버전을 붙이는 것도 좋은 방법이에요. 아니면 new_table_name처럼 완전히 새로운 이름을 붙여도 되고요!

ORA-00904: invalid identifier 오류: 잘못된 식별자

열 이름에 오타가 있거나, 존재하지 않는 열을 참조했을 때 이 오류가 발생해요. 예를 들어 customer_id 열을 cutsomer_id라고 잘못 입력하면 이 오류가 딱! 하고 나타나죠. (저도 가끔 오타 때문에 이 오류를 만나곤 한답니다… 부끄럽지만 개발자의 숙명이랄까요? ^^;)

해결 방법: 꼼꼼하게 오타를 확인해 보세요. SQL Developer나 DBeaver 같은 툴을 사용하면 자동 완성 기능이 있어서 오타를 줄이는 데 도움이 된답니다! 만약 오타가 아니라면, 해당 열이 실제로 테이블에 존재하는지 확인해야 해요. DESCRIBE table_name; 명령어를 사용하면 테이블의 구조를 확인할 수 있어요.

ORA-01400: cannot insert NULL into 오류: NULL 값 삽입 불가

NOT NULL 제약 조건이 있는 열에 NULL 값을 넣으려고 하면 이 오류가 발생해요. NOT NULL은 “절대 비워두면 안 돼!”라는 뜻이거든요. 마치 필수 입력 항목에 아무것도 입력하지 않으면 제출할 수 없는 것과 같아요.

해결 방법: NULL 값 대신 적절한 값을 입력해야 해요. 만약 꼭 NULL 값을 넣어야 한다면, 테이블 정의를 수정해서 NOT NULL 제약 조건을 제거해야 합니다. ALTER TABLE table_name MODIFY column_name NULL; 명령어를 사용하면 돼요. 하지만 NOT NULL 제약 조건을 함부로 제거하면 데이터 무결성에 문제가 생길 수 있으니 신중하게 결정해야 해요!

ORA-02270: no matching unique or primary key for this column-list 오류: 외래 키 제약 조건 위반

외래 키는 다른 테이블의 기본 키를 참조하는 열이에요. 외래 키를 설정하면 두 테이블 간의 관계를 유지할 수 있죠. 이 오류는 외래 키로 설정한 값이 참조하는 테이블의 기본 키에 존재하지 않을 때 발생해요. 예를 들어 orders 테이블의 customer_idcustomers 테이블에 존재하지 않는 customer_id라면 이 오류가 발생합니다.

해결 방법: 외래 키로 설정할 값이 참조하는 테이블에 존재하는지 확인해야 해요. SELECT * FROM referenced_table WHERE primary_key_column = foreign_key_value; 명령어를 사용하면 확인할 수 있어요. 만약 존재하지 않는다면, 참조하는 테이블에 해당 값을 먼저 추가해야 합니다.

ORA-01652: unable to extend temp segment by string in tablespace string 오류: 임시 테이블스페이스 부족

복잡한 쿼리를 실행하거나 대량의 데이터를 처리할 때 임시 테이블스페이스가 부족해지면 이 오류가 발생해요. 임시 테이블스페이스는 쿼리 실행 중에 임시 데이터를 저장하는 공간이에요. 마치 요리를 할 때 재료를 놓는 조리대와 같은 역할을 하죠. 조리대가 너무 좁으면 요리를 할 수 없는 것처럼, 임시 테이블스페이스가 부족하면 쿼리를 실행할 수 없어요.

해결 방법: DBA에게 연락해서 임시 테이블스페이스의 크기를 늘려달라고 요청해야 해요. 아니면 쿼리를 최적화해서 임시 테이블스페이스 사용량을 줄이는 방법도 있어요. 인덱스를 추가하거나 쿼리를 여러 개로 나누는 것도 좋은 방법이에요.

자, 이제 좀 더 자신감을 가지고 데이터베이스 던전을 탐험할 수 있겠죠?! 물론 이 외에도 다양한 오류들이 존재하지만, 이 정도만 알아둬도 많은 문제들을 해결할 수 있을 거예요! 화이팅! ^^

 

자, 이렇게 SQL에서 테이블 만드는 법, CREATE TABLE 구문 사용법을 차근차근 알아봤어요! 어렵게 느껴졌던 부분도 이젠 조금 친숙해졌나요? 처음엔 누구나 낯설게 느껴질 수 있어요. 하지만 꾸준히 연습하다 보면 어느새 데이터베이스 테이블을 자유자재로 다루는 자신을 발견하게 될 거예요! 마치 새로운 언어를 배우는 것과 같죠. 이제 여러분만의 데이터베이스 세상을 만들어갈 준비가 되었어요. 직접 다양한 테이블을 만들어보고, 데이터를 채워 넣으면서 SQL과 더욱 친해지는 시간을 가져보면 좋겠어요. 궁금한 점이 있다면 언제든지 질문하세요! 함께 SQL의 세계를 탐험해 봐요!

 

Itlearner

Share
Published by
Itlearner

Recent Posts

SQL에서 테이블 변경하기 (ALTER TABLE 사용법)

데이터베이스 다루다 보면, 테이블 수정할 일 정말 많죠? 컬럼 추가해야 할 때도 있고, 데이터 타입…

5시간 ago

SQL에서 UNION과 UNION ALL의 차이점

데이터베이스 다루다 보면 여러 테이블에서 정보를 합쳐야 할 때가 참 많죠? 그럴 때 딱 떠오르는…

14시간 ago

SQL에서 JOIN의 개념과 종류 (INNER JOIN, LEFT JOIN 등)

데이터베이스 다루다 보면 여러 테이블에 흩어진 정보들을 하나로 합쳐야 할 때가 정말 많죠? 그럴 때…

19시간 ago

SQL에서 서브쿼리(Subquery) 기본 개념과 예제

안녕하세요, 여러분! 오늘은 데이터베이스에서 마법처럼 활용되는 SQL 서브쿼리에 대해 함께 알아보는 시간을 가져보려고 해요. 마치…

1일 ago

SQL에서 GROUP BY와 HAVING 절 활용법

안녕하세요, 여러분! 데이터 분석 공부, 어떻게 하고 계신가요? 오늘은 SQL의 강력한 기능인 `GROUP BY`와 `HAVING`…

1일 ago

SQL에서 LIMIT과 OFFSET을 사용하여 페이징 처리하기

안녕하세요, 여러분! 데이터베이스를 다루다 보면 정말 많은 데이터에 압도될 때가 있지 않나요? 수많은 데이터를 효율적으로…

2일 ago