[MS SQL Server] #4_데이터 조작하기 기초
안녕하세요. 문범우입니다.
이번 포스팅에서는 MS SQL Server에서 데이터를 다루는 기초적인 쿼리들에 대해서 알아보도록 하겠습니다.
구체적으로는 create table, insert, alter에 대해서 다뤄볼 예정입니다.
1. CREATE DATABASE
먼저 우리가 이번 실습을 진행할 데이터 베이스를 만들어보도록 합니다.
CREATE DATABASE MEMBER_TEST;
위의 쿼리로 MEMBER_TEST라는 이름의 데이터베이스를 만듭니다.
그리고 이후 아래 쿼리를 통해 해당 데이터베이스에서의 작업을 시작합니다.
USE MEMBER_TEST;
2. CREATE TABLE
이제 우리가 데이터를 다뤄볼 첫번째 테이블을 만들어 보도록 하겠습니다.
테이블을 만드는 쿼리문은 기본적으로 아래의 형태를 가지고 있습니다.
CREATE TABLE <TABLE_NAME>(
<COLUMN1> <DATA_TYPE> [CONTRAINTS],
<COLUMN2> <DATA_TYPE> [CONTRAINTS],
<COLUMN3> <DATA_TYPE> [CONTRAINTS], ...
);
정확히 이해가 가지 않는다면 먼저 아래의 쿼리를 보고 다시 설명드리겠습니다.
CREATE TABLE T_MEMBER(
id INT IDENTITY(1,1),
name VARCHAR(10)
);
위의 쿼리문에 대해 한번 자세히 알아보도록 합시다.
먼저 첫번째에서는 CREATE TABLE T_MEMBER(~)로 되어있습니다.
간단합니다, 단순히 T_MEMBER라는 이름의 테이블을 만든다는 뜻 입니다.
그런데 추가적으로 괄호가 있는 이유는, 테이블에 들어갈(또는 테이블이 포함할) 데이터에 대한 정의가 필요하기 때문입니다.
그럼 이어서 두번째 줄을 보겠습니다.
두번째 줄에는 id INT IDENTITY(1,1) 라고 되어있습니다.
여기서 id라는 것은 해당 컬럼의 이름입니다. 그리고 이어서 있는 INT는 해당 컬럼의 데이터 타입을 이야기합니다.
데이터 타입에는 숫자형을 나타내는 INT, 그리고 바로 아래에서 사용되는 문자열을 담는 VARCHAR와 같은 것들이 있습니다.
그리고 그 뒤에 있는 IDENTITY(1,1) 해당 컬럼에 특정 제약조건(contraint)를 준 것인데, 이에 대해서는 조금 이따가 다시 살펴보도록 합시다.
마지막으로 세번째 줄을 확인하시면, 두번째 줄에서 본 것과 동일합니다.
name이라는 컬럼 이름을 설정해주고 있으며 해당 컬럼의 데이터 타입은 VARCHAR(10)인 것 입니다.
그럼 마지막으로 IDENTITY에 대해서 알아보고 테이블 생성문(CREATE TABLE)에 대해 마무리해보도록 합시다.
먼저 우리가 컬럼을 정의할 때 특정 제약조건들을 설정해줄 수 있습니다.
대표적으로는 NULl값을 가지지 못하게 NOT NULL을 설정하거나, 중복값을 갖지 못하게 하는 UNIQUE, 또는 기본값을 설정해주는 DEFAULT 등이 있습니다.
그리고 IDENTITY도 제약조건중에 하나입니다.
IDENTITY는 데이터가 추가될 때 마자 자동으로 증가되는 값을 가질 수 있도록 하는 제약조건입니다.
IDENTITY(1,1)에서 두개의 숫자 1이 나타내는 것은 어떤 값에서 시작해서 얼마나 숫자가 증가할지를 의미합니다.
즉, IDENTITY(start number, increment number) 입니다.
따라서 우리가 위의 쿼리에서 설정한 제약조건은, id컬럼의 값이 1부터 시작해서 자동으로 1씩 증가하여 저장되는 제약조건입니다.
3. INSERT INTO
이제 이렇게 만들어진 테이블에 실제로 데이터를 입력해보도록 하겠습니다.
테이블에 데이터를 입력할 때 사용하는 쿼리문은 INSERT INTO 입니다. 해당 쿼리문에 대해서 자세히 알아보도록 하겠습니다.
INSERT [INTO] <TABLE NAME>
[(COLUMN NAME1, COLUMN NAME2, ...)] VALUES (VALUE1, VALUE2, ...);
위와 같은 형태를 띄고 있는 INSERT 문은 우리가 원하는 칼럼에만 데이터를 입력하거나, 모든 칼럼에 데이터를 입력할 수 있습니다. 이 말이 아직 제대로 이해가지 않아도, 아래 예제 쿼리들을 실행시켜보면서 이해해보도록 합시다.
INSERT INTO T_MEMBER (name) VALUES ('김범우');
INSERT T_MEMBER (name) VALUES ('이범우');
INSERT INTO T_MEMBER VALUES ('한범우');
SELECT * FROM T_MEMBER;
위와 같은 4개의 쿼리를 실행하고 나면 아래와 같은 결과를 얻을 수 있습니다.
3개의 INSERT 문이 약간씩 차이가 존재하지만, 결국 VALUES 뒤의 데이터값이 입력되고 있음을 알 수 있으며, 우리가 이전에 테이블을 정의할 때 id 컬럼에 적용한 IDENTITY가 정상적으로 적용되고 있음도 확인할 수 있습니다.
그럼 이제 한번 더 새로운 테이블을 만들어 보고 데이터를 입력해보도록 하겠습니다.
4. CREATE, INSERT 복습
먼저 아래와 같은 쿼리를 통해 T_PRODUCT 테이블을 만들어보겠습니다.
CREATE TABLE T_PRODUCT(
product_code VARCHAR(5) CONSTRAINT pk_code PRIMARY KEY,
product_name VARCHAR(20) NOT NULL,
product_price VARCHAR(10) DEFAULT '0',
product_remark VARCHAR(100)
);
각각의 컬럼에 대해 설정된 제약조건들에 대해서만 한번 더 짚고 넘어가겠습니다.
product_code는 pk_code라는 이름으로 기본키(Primary key) 설정을 하였습니다.
기본키라 함은, 해당 테이블 내에 존재하는 여러 행(레코드)들 중에서 유일하게 식별가능한 값을 의미합니다.
따라서 null값이 들어갈 수 없고, 다른 값과 중복될 수 없는 특징이 있습니다.
두번째로 product_name은 not null 조건을 통해 null 값이 들어갈 수 없도록 설정하였습니다.
product_price 는 default값을 설정해 줌에 따라서 아무 값도 입력되지 않을 경우 0이라는 값으로 설정되도록 하였습니다.
그리고 마지막 product_remark 컬럼은 어떠한 제약조건도 설정하지 않았습니다.
이렇게 만든 T_PRODUCT 테이블에 직접 데이터를 입력해보도록 하겠습니다.
INSERT INTO T_PRODUCT (product_code, product_name, product_price, product_remark)
VALUES ('A001', '청소기', '1000000', '무선');
INSERT T_PRODUCT (product_code, product_name)
VALUES ('A002', '냉장고');
SELECT * FROM T_PRODUCT;
먼저 두개의 INSERT 문을 통해 2개의 데이터를 입력해보고 아래와 같은 결과를 확인해보겠습니다.
첫 번째 INSERT 문에서는 4개의 컬럼에 모두 값을 입력해주었습니다.
그와 다르게 두번째에서는 prudct_code와 product_name에만 값을 입력하였습니다.
그리고 결과를 보니, 값을 입력하지 않은 product_price는 default 값이 자동으로 입력되었고, 아무런 설정도 하지 않은 product_remark 에는 null 값이 입력된 것을 확인할 수 있습니다.
그럼 우리가 not null로 설정한 product_name에 아무런 값도 입력해주지 않으면 어떻게 될까요?
바로 시도해보겠습니다.
INSERT INTO T_PRODUCT (product_code, product_remark)
VALUES ('A003', '이름없는 제품');
위의 쿼리문을 실행시키면 아래와 같이 에러가 발생합니다.
에러 내용을 읽어보면 우리가 값을 설정해주지 않은 product_name에 null이 입력될 수 없다는 내용입니다.
우리가 테이블을 만들 때 설정한 제약조건 때문인 것이죠.
이와 같이 기본키로 설정한 product_code 또한 아무런 값을 입력해주지 않으면 동일한 에러가 출력될 것입니다.
5. ALTER
그런데, 우리가 처음 만들었던 테이블에 대해 몇가지 수정을 하고 싶다면 어떻게 할까요?
바로 ALTER문을 이용해 테이블의 컬럼에 대해 변경, 추가, 삭제를 진행할 수 있습니다.
그럼 먼저, VARCHAR(10) 으로 설정되어 있던 product_price에 대해서 설정을 해보겠습니다.
ALTER TABLE T_PRODUCT
ALTER COLUMN product_price VARCHAR(20);
위의 ALTER 문을 통해서 VARCHAR(10) 로 되어있던 product_price를 VARCHAR(20) 으로 확장시킬 수 있습니다.
그런데 VARCHAR(20)으로 되어있는 컬럼을 더 작게 축소하는 것은 가능할까요?
정답은 가능할 때도 있고, 불가능할 때도 있습니다.
만약 해당 컬럼에 VARCHAR(10)의 크기를 넘는 값을 가지는 행이 존재한다면 해당행의 데이터 손실이 발생하는 것을 막기위해 컬럼의 변경이 불가합니다.
하지만 VARCHAR(10)의 크기를 넘는 값을 가지는 행이 없을 땐 가능합니다.
추가적으로 컬럼을 추가할 때에는,
ALTER TABLE <TABLE_NAME>
ADD COLUMN <COLUMN NAME> <DATA TYPE> [<CONSTRAINTS>];
와 같은 구문으로 추가할 수 있습니다.
비슷하게 컬럼을 삭제할 때에는,
ALTER TABLE <TABLE_NAME>
DROP COLUMN <COLUMN NAME>;
이렇게 해서 테이블을 만들고, 데이터를 입력하고, 만들었던 테이블 컬럼에 대해 수정, 추가, 삭제하는 쿼리문에 대해서 알아보았습니다.
추가적으로 궁금한 점이 있거나 잘못된 점들에 대해서는 언제든지 말씀해주시면 감사하겠습니다.