멈추지 않고 끈질기게

[DB][SQL] 테이블, 속성의 추가/변경/삭제 본문

DB

[DB][SQL] 테이블, 속성의 추가/변경/삭제

sam0308 2023. 5. 5. 11:33

※ 해당 포스팅은 개인의 공부 정리용 글입니다. 틀린 내용이 있다면 추후 수정될 수 있습니다.

※ 해당 포스팅은 Mycrosoft SQL Server에서 사용하는 T-SQL 문법을 기반으로 하고 있으며, 예시는 SSMS(SQL Server Management Studio) 환경에서 작성하고 있습니다. 

 

 

 

 

이번 포스팅에서는 테이블 생성, 데이터 삽입, 수정 및 삭제 방법에 대해 알아보겠습니다.

1. 데이터베이스, 테이블 생성(CREATE)

 CREATE 키워드를 통해 신규 데이터베이스나 테이블을 생성할 수 있습니다. 데이터베이스의 경우 다음과 같이 작성합니다. 

CREATE DATABASE 데이터베이스명

 테이블의 경우 테이블 이름 뿐만 아니라 각 속성별 이름 및 데이터 타입도 작성해야 하며, 추가로 디폴트 값이나 NULL 값 허용 여부 등을 작성할 수 있습니다. 

-- 신규 테이블 생성
-- ()안의 내용은 생략 가능
CREATE TABLE 테이블명
(
    속성명1 데이터타입 (DEFAULT 디폴트값) (NULL/NOT NULL),
    속성명2 데이터타입 (DEFAULT 디폴트값) (NULL/NOT NULL),
    속성명3 데이터타입 (DEFAULT 디폴트값) (NULL/NOT NULL),
    ...
);

 DEFAULT 키워드로 기본값을 설정한 속성의 경우, 데이터 삽입 시에 값을 생략할 수 있고 생략 시 설정한 기본값으로 삽입됩니다. NULL 또는 NOT NULL 키워드로 NULL 값 허용 여부를 결정할 수 있으며, 생략할 경우 기본값은 NULL(허용) 입니다. 아래는 데이터베이스 생성 후 검색 관련 포스팅에서 사용했던 players 테이블을 생성하는 예시입니다.

-- 데이터베이스 생성
CREATE DATABASE PlayerDB;
-- 테이블 생성할 데이터베이스 명시
USE PlayerDB;

-- 테이블 생성
CREATE TABLE players
(
    playerID INT NOT NULL,
    nickName VARCHAR(10) NOT NULL,
    lv INT NOT NULL,
    curGold INT DEFAULT 0 NOT NULL,
    class VARCHAR(10) NOT NULL,
    guild VARCHAR(10)
);

그림 1. 생성된 데이터베이스와 테이블

 Object Explorer에서 PlayerDB의 Tables 폴더에 players 테이블이 추가된 것을 확인할 수 있습니다. 해당 테이블을 우클릭 후 Design 메뉴를 눌러보면 테이블을 구성하는 속성들의 이름, 데이터 타입, NULL 값 허용 여부 등을 확인할 수 있습니다. 

 

 

 

2. 데이터 삽입(INSERT INTO ~ VALUES)

 테이블에 새로운 행(투플)을 삽입하는 연산은 INSERT INTO ~ VALUES 키워드를 통해 실행할 수 있습니다. 신규 행 삽입 시 각 속성값은 대응하는 속성의 도메인과 일치해야 합니다. INSERT INTO는 다음과 같이 사용할 수 있습니다.

INSERT INTO 테이블명
VALUES(속성1 값, 속성2 값, 속성3 값, ...)

 단, 위와 같이 사용하려면 해당 테이블의 모든 속성값을 입력해야 하며, 순서 또한 정확하게 지켜야 합니다. 따라서 상기 문법의 경우 테이블 생성 시 DEFAULT 키워드로 기본값을 설정한 속성이 있더라도 활용하기 어렵습니다. 이 경우 다음과 같은 문법을 사용할 수 있습니다.

INSERT INTO 테이블명(속성2, 속성3, 속성1, ...)
VALUES(속성2 값, 속성3 값, 속성1 값, ...)

 해당 문법의 경우 입력할 속성의 순서를 위와 같이 임의로 정할 수 있습니다. 또한 어떤 속성에 값을 입력해주는지 정확히 명시하기 때문에, 입력을 생략한 속성이 DEFAULT 키워드로 기본값이 설정된 속성이라면 자동으로 해당 값이 입력됩니다. 따라서 속성명을 직접 입력해야 하는 불편함이 있지만, 1)입력할 데이터와 입력받을 테이블의 속성 순서가 일치하지 않을 경우 혹은 2)기본값이 설정된 속성의 입력을 생략하고자 하는 경우에는 상기 문법을 사용할 수 있습니다. 

 

 다음은 위에서 생성한 players 테이블에 신규 행을 삽입하는 예시입니다.

-- 문법 1
INSERT INTO players
VALUES(1001, N'v최강전사v', 72, 5000, N'전사', N'서버종결자');

-- 문법 2
-- guild 값 생략
INSERT INTO players(playerID, nickName, class, lv)
VALUES(1002, N'왼손은활들뿐', N'궁수', 23);

그림 2. 데이터 삽입 결과

 위쪽 쿼리에선 속성명을 생략하는  문법을 사용했으며, 테이블의 속성 순서와 일치하도록 모든 속성 값을 입력하였습니다. 아래쪽 쿼리에서는 입력하는 속성의 순서를 살짝 변경하였으며, 기본값이 0으로 설정된 curGold 속성과 NULL 값이 허용되는 guild 속성은 입력을 생략하였습니다. 결과를 보면 curGold, guild 속성에 기본값(0)과 NULL 값이 입력된 것을 확인할 수 있습니다.

 

 

 

3. 테이블 수정(ALTER)

 속성의 추가, 삭제, 변경은 ALTER 키워드를 통해 실행할 수 있습니다. 우선 테이블에 속성을 추가하는 문법은 다음과 같습니다.

-- 테이블에 속성 추가
ALTER TABLE 테이블명
ADD 속성명 데이터타입 (DEFAULT 기본값)

  신규 속성을 추가할 때는 NOT NULL로 설정할 수 없습니다. 이미 저장된 데이터가 있는 테이블에 신규 속성 추가 시, 기존 행의 신규 속성값은 NULL이 될 수밖에 없기 때문입니다. 따라서 신규 속성을 NOT NULL로 설정하고 싶다면, 모든 행의 해당 속성값을 NULL이 아닌 값으로 고친 뒤 후술할 속성 설정 변경을 실행해야 합니다. DEFAULT 키워드로 기본값을 설정해 줄 수는 있으나, 이 경우에도 기존 행의 신규 속성 값은 설정한 기본값이 아닌 NULL로 고정됩니다.

 다음은 신규 속성을 추가하는 예시입니다.

-- partnerID 속성 추가
ALTER TABLE players 
ADD partnerID INT DEFAULT 0;

그림 3. 신규 속성 추가

 새로 추가한 partnerID 속성을 테이블에 추가하였습니다. DEFAULT로 기본값을 0으로 설정했지만, 기존의 행에서는 모두 NULL 값으로 추가된 것을 확인할 수 있습니다.

 

 

 속성을 삭제하는 문법은 다음과 같습니다.

-- 속성 삭제
ALTER TABLE 테이블명
DROP COLUMN 속성명1, 속성명2, ...

 다음은 players 테이블에서 class 속성을 삭제하는 예시입니다.

-- class 속성 삭제
ALTER TABLE players
DROP COLUMN class;

그림 4. 속성 삭제

 참고로 삭제하려는 속성에 제약조건이 걸려있는 경우, 해당 제약조건을 먼저 삭제해야만 지울 수 있습니다. 제약조건에 관한 내용은 별도의 포스팅에서 다루도록 하겠습니다.

 

 

 속성의 데이터타입, NULL 값 여부 등의 설정을 수정하는 문법은 다음과 같습니다.

-- 해당 속성의 데이터타입, 널값 여부 수정
ALTER TABLE 테이블명
ALTER COLUMN 속성명 데이터타입 (NULL/NOT NULL)

 단, 속성 수정의 경우 이미 저장된 데이터와 충돌하지 않는 선에서만 가능합니다. 예를 들어 예시에서 사용하고 있는 players 테이블에서 VARCHAR 타입인 nickName 속성을 INT 타입으로 변경하려 할 경우 에러가 발생합니다. 또한 이미 NULL 값을 가진 행(투플)이 있는 상태에서 해당 속성을 NOT NULL로 변경할 경우, 마찬가지로 에러가 발생합니다. 다음은 속성 설정을 수정하는 예시입니다.

-- 속성의 데이터타입 수정
ALTER TABLE players
ALTER COLUMN nickName VARCHAR(20) NOT NULL;

 위 쿼리는 nickName 속성의 데이터타입을 VARCHAR(10)에서 VARCHAR(20)으로 변경하는 내용입니다. 사실 이 쿼리는 데이터 삽입 예시를 작성하는 도중에 사용했습니다. 

그림 5. 한글 6글자 짜리 닉네임

 '왼손은활들뿐' 닉네임은 사실 VARCHAR(10)으로 저장할 수 없는 데이터입니다. 한글은 한 글자당 2바이트 이므로, 6글자닉네임은 12바이트로 범위를 벗어나기 때문입니다. 따라서 상기 쿼리를 사용하여 데이터 타입을  VARCHAR(20)으로 변경한 후 해당 데이터를 삽입한 것입니다. 

 

 

 

4. 삭제(DELETE, DROP)

 테이블에서 특정 행(투플)을 삭제하는 연산은 DELETE 키워드를 통해 실행할 수 있습니다.

DELETE FROM 테이블명
WHERE 조건식1 (AND/OR) 조건식2 (AND/OR) ...

 상기 쿼리 실행 시 해당 테이블에서 WHERE 절의 조건을 만족하는 모든 행을 삭제합니다. 데이터 검색에 사용할 때와 마찬가지로, WHERE 절의 조건식은 AND/OR 키워드를 통해 여러개를 중첩할 수 있습니다. 단, WHERE 절을 붙이지 않을 경우 해당 테이블의 모든 데이터가 삭제되므로 주의해야 합니다. 다음은 players 테이블에서 길드에 가입하지 않은 유저 데이터를 제거하는 예시입니다.

-- guild 값이 NULL인 데이터 삭제
DELETE FROM players 
WHERE guild IS NULL;

그림 6. 데이터 삭제

 

 데이터뿐 아니라 테이블 자체를 데이터베이스에서 삭제하려면 DROP 키워드를 이용하면 됩니다.

DROP TABLE 테이블명

  다음은 지금까지 사용하던 players 테이블을 삭제하는 예시입니다.

-- 테이블 삭제
DROP TABLE players;

그림 7. 테이블 삭제

PlayerDB 데이터베이스의 테이블 폴더에서 players가 없어진 모습을 확인할 수 있습니다.

 

 

 

'DB' 카테고리의 다른 글

[DB][SQL] 집합 연산자(UNION, INTERSECT, EXCEPT)  (0) 2023.05.17
[DB] 인덱스(Index)  (0) 2023.05.08
[DB][SQL] 그룹화와 집계 함수  (0) 2023.05.03
[DB][SQL] 데이터의 검색  (0) 2023.05.02
[DB] 관계 데이터 모델  (0) 2023.04.22