TigerCow.Door


안녕하세요. 문범우입니다.

이번 포스팅에서는 먼저 샘플 데이터세트를 구성해보고, 이를 바탕으로 select 문에 대해서 보다 자세히 다뤄보도록 하겠습니다.



1. 샘플 데이터세트 구성하기


아래의 쿼리를 실행시킴으로써 샘플 데이터베이스 생성 부터 데이터 입력까지 진행합니다.

단순 CREATE 및 INSERT 문이기 때문에 복사 붙여넣기를 하셔도 되지만

복습 및 익숙해짐을 위해서 직접 타이핑 해보시는 것도 좋을 것 같습니다.


-- CREATE SAMPLE_DB

CREATE DATABASE SampleDB;


USE SampleDB;


-- CREATE TABLE

CREATE TABLE department(

deptNo INT PRIMARY KEY,

deptName NVARCHAR(20),

location NCHAR(20)

);


CREATE TABLE employee(

empNo INT PRIMARY KEY,

empName NVARCHAR(20),

job NVARCHAR(20),

manager INT,

hireDate DATETIME,

salary INT,

commission INT,

deptNo INT FOREIGN KEY REFERENCES DEPARTMENT(deptNo)

);


-- INSERT DATA

INSERT INTO department (deptNo, deptName, location)

VALUES (10, '경리부', '서울');

INSERT INTO department (deptNo, deptName, location)

VALUES (20, '인사부', '인천');

INSERT INTO department (deptNo, deptName, location)

VALUES (30, '영업부', '대전');

INSERT INTO department (deptNo, deptName, location)

VALUES (40, '전산부', '부천');


INSERT INTO employee (empNo, empName, job, manager, hireDate, salary, deptNo)

VALUES (1001, '최범우', '사원', 1013, '2007-03-21', 300, 20);

INSERT INTO employee (empNo, empName, job, manager, hireDate, salary, commission, deptNo)

VALUES (1002, '김범수', '대리', 1005, '2007-04-11', 250, 80, 30);

INSERT INTO employee (empNo, empName, job, manager, hireDate, salary, commission, deptNo)

VALUES (1003, '장태훈', '과장', 1005, '2005-02-01', 500, 100, 30);

INSERT INTO employee (empNo, empName, job, manager, hireDate, salary, deptNo)

VALUES (1004, '최상우', '부장', 1008, '2003-09-01', 600, 20);

INSERT INTO employee (empNo, empName, job, manager, hireDate, salary, commission, deptNo)

VALUES (1005, '변봉중', '과장', 1008, '2003-10-02', 450, 200, 30);

INSERT INTO employee (empNo, empName, job, manager, hireDate, salary, deptNo)

VALUES (1006, '송원철', '부장', 1005, '2003-08-02', 480, 30);

INSERT INTO employee (empNo, empName, job, manager, hireDate, salary, deptNo)

VALUES (1007, '문서연', '부장', 1008, '2004-03-08', 520, 10);

INSERT INTO employee (empNo, empName, job, manager, hireDate, salary, commission, deptNo)

VALUES (1008, '장웅', '차장', 1003, '2004-03-01', 500, 0, 30);

INSERT INTO employee (empNo, empName, job, hireDate, salary, deptNo)

VALUES (1009, '최상범', '사장', '1996-10-04', 1000, 20);

INSERT INTO employee (empNo, empName, job, manager, hireDate, salary, deptNo)

VALUES (1010, '이명근', '과장', 1003, '2005-04-01', 500, 10);

INSERT INTO employee (empNo, empName, job, manager, hireDate, salary, deptNo)

VALUES (1011, '서은혜', '사원', 1007, '2007-02-03', 280, 30);

INSERT INTO employee (empNo, empName, job, manager, hireDate, salary, deptNo)

VALUES (1012, '이철진', '사원', 1006, '2007-08-06', 300, 20);

INSERT INTO employee (empNo, empName, job, manager, hireDate, salary, deptNo)

VALUES (1013, '한태범', '부장', 1003, '2002-10-09', 560, 20);

INSERT INTO employee (empNo, empName, job, manager, hireDate, salary, deptNo)

VALUES (1014, '김광우', '사원', 1006, '2007-11-09', 250, 10);


위의 쿼리들을 이용해서 데이터세트를 구성하고 나서 아래의 기본 SELECT문을 이용하여 각각의 테이블을 조회하면 아래 사진과 같은 결과가 나와야 합니다.


-- SELECT TABLE

SELECT * FROM department;




SELECT * FROM employee;



그럼 위의 데이터들을 바탕으로 SELECT 문에 대해서 학습해보도록 하겠습니다.



2. SELECT


기본적으로 SELECT 문은 아래와 같은 형태를 띄고 있습니다.


SELECT <COLUMN NAME1, COLUMN NAME2, ...>

FROM <TABLE NAME>;


물론 해당 SELECT 문에 WHERE 문이라는, 조건절이 추가적으로 붙어서 사용되는 경우가 많지만 이번 포스팅에서 해당 내용은 제외하고 심플하게 SELECT문에 대해서만 알아보도록 하겠습니다.


SELECT문 에서는 특정 테이블에서 내가 원하는 컬럼에 대한 데이터만 조회할 수 있습니다.

이때 조회하고자 하는 테이블이름과 조회하고자 하는 컬럼명을 적어주어야 합니다.

그럼 employee 테이블에서 empName과 job, salary를 조회해보도록 하겠습니다.


SELECT empName, job, salary

FROM employee;




* SELECT문에서 연산자 이용하기


이번에는 SELECT 문에서 연산자를 이용해보는 실습을 진행해보겠습니다.

현재 우리는 salary에 대한 데이터를 가지고 있는데, 만약 연봉값을 알고 싶을 땐 어떻게 해야할까요?

간단하게 생각해보면, salary는 월급이므로 salary에 12를 곱하면 연봉이 될 것입니다.

SELECT 문에서는 연산자 이용이 가능합니다. 따라서 연봉을 구하기 위해 salary에 12를 곱해주면 되는 것이죠.


아래와 같이 쿼리문을 작성함으로써 employee들의 연봉 값을 같이 구할 수 있습니다.


SELECT empName, job, salary, salary*12

FROM employee;




위의 결과를 보면 salary에 12를 곱한 값들도 함께 출력되는 것을 확인할 수 있습니다.

하지만 해당 열이름을 보면 (열 이름 없음) 이라는 값으로 나와서 그것이 연봉인지는 모두가 알기 쉽지 않을 것 입니다.

그럼 우리가 원하는 열 이름을 지정해줄 수 있다면 어떨까요?

당연히 해당 기능을 지원하고 많이 이용되고 있습니다.



* as 를 이용한 열 이름 별칭 사용하기


해당 기능을 열 이름에 별칭을 사용한다고 표현합니다.

별칭이라는 말 그대로, 원래 이름대신 별명을 이용하는 것이라고 생각하시면 됩니다.

이는 위에서 본 (열 이름 없이)와 같이 새롭게 생성된 열 이외에도, 기존의 열에도 사용 가능합니다.

아래의 쿼리와 같이 작성함으로써 각각의 열에 대해서 우리가 원하는 이름을 지정할 수 있습니다.

SELECT empName as 사원이름, job as 직급, salary as 월급, salary*12 as 연봉

FROM employee;



위와 같이 as 뒤에 설정한 이름이 출력되는 열의 이름이 된 것을 확인할 수 있습니다.


추가로, 아래와 같이 as 라는 예약어는 생략가능하며, 만약 우리가 지어주는 열 이름에 띄어쓰기를 넣고 싶다면 아래와 같이 별칭 값을 홀 따옴표로 묶어줘야 합니다.




그런데 사실 연봉에는 commission 값도 포함되어야 합니다.

그럼 연봉에 해당 값을 같이 더해서 출력해보겠습니다.

우리가 * 연산을 활용한 것과 같이 그대로 + 연산을 활용하면 됩니다.


SELECT empName 사원이름, job 직급, salary 월급, (salary*12) + commission '연  봉'

FROM employee;



하지만 결과를 보면, 우리가 생각하지 못했던 NULL 값이 출력되고 있습니다.

왜 이런 결과가 나오는 것 일까요?



* NULL 값


먼저 그 이유를 알아보자면, NULL과 함께 연산했기 때문에 그 결과가 NULL로 나오는 것 입니다.


기존의 데이터를 살펴보면 commission 값을 NULL로 설정한 행들이 있습니다.

그리고 위의 결과와 대조해 보았을 때 commission 값이 NULL인 행들의 연봉이 NULL로 나온 것을 볼 수 있습니다.

즉, 덧셈 연산을 통해 특정 값에 NULL을 더했기 때문에 그 결과도 NULL이 나오는 것 입니다.

도대체 NULL이 정확이 무엇이길래, 그러한 결과가 될까요?


NULL은 0이라는 값이나, 문자열에서의 공백을 의미하는 것이 아닙니다.

그렇다고 해서 값이 저장되는 공간을 의미하는 것도 아닙니다.

NULL은 정말 단순하게, 인식되지 않는 값, 미확정 값을 의미합니다.


즉 NULL 값이란 어떠한 값이 존재하는 것이지만 어떠한 값인지 우리가 알 수 없는 것 입니다.

NULL 값이 단순하게 하나로 정의되기 보다는 우리가 인식하지 못하는, 어떠한 값이라고 이야기할 수 없는 모든 값이 NULL로 표현됩니다.

이해를 위해 특정 NULL의 값이 3a937f8b13 이라고 해봅시다.

그런데 만약 해당 값에 5000 이라는 값을 더하면, 우리가 인식할 수 있는 값이 될까요?

그렇지 않습니다. 우리가 5000 이라는 인식할 수 있는 값이 있었지만 해당 값과 인식하지 못하는 값을 더했기 때문에 결국 그 결과도 인식할 수 없는 결과가 되어 버립니다.


따라서 연산에서도, NULL을 이용한 연산을 한다면 그 결과 또한 항상 NULL이 되어버립니다.


그럼 이렇게 NULL이 포함된 값에 대해서 연산을 수행할 때, 그 결과가 NULL이 나오지 않게 하려면 어떻게 해야 할까요?



* isnull 함수 사용하기


바로, isnull() 이라는 내장함수를 사용하면 됩니다.

내장함수라는 것은 말 그대로, 외부에서 호출(import)을 하지 않아도 내부에 저장되어 있어 즉시에 사용할 수 있는 함수를 이야기합니다.

isnull함수는 다음과 같이 사용될 수 있습니다.


isnull(field, val)


위와 같이 사용되는 isnull함수는 field의 값이 null일때 val값으로 대치(변경)되어 처리됩니다.


말이 조금 어렵다면 바로 아래와 같이 쿼리를 작성하여 그 결과를 보고 이해해보도록 합시다.


SELECT empName 사원이름, job 직급, salary 월급, isnull(commission, 0) 보너스, (salary*12) + isnull(commission, 0) '연  봉' FROM employee;



아까와 달리 NULL이라는 결과가 나오지 않고, 제대로 결과가 출력됨을 볼 수 있습니다.



* distinct


그럼 이번에는 회사에 있는 직급들에 대해서만 한번 출력해보도록 하겠습니다.


SELECT job as 직급 FROM employee;


위와 같이 회사내의 직원들의 직급이 전부 출력되었습니다.

하지만 위의 결과에서는 직급에 대해 중복되는 결과들이 있기에 실제로 회사에 어떤 직급들이 존재하는지 보기가 편리한 결과는 아닙니다.

즉, 중복되는 값들을 출력되지 않게 한다면 회사 내에 존재하는 직급들을 확인하는데 보다 편리할 것 입니다.

이렇게, 중복되는 값들은 출력되지 않도록 하는 것이 distinct 입니다.

아래의 쿼리를 통해 확인해보도록 하겠습니다.


SELECT DISTINCT job as 직급 FROM employee;


그럼 아래와 같은 쿼리는 어떨까요?


SELECT DISTINCT job as 직급, empName as 사원이름 FROM employee;


이전의 쿼리와 달리, 직급의 중복 데이터가 존재합니다.

즉 DISTINCT는 특정 칼럼에 대해서만 중복을 확인하는 것이 아니라, 출력되는 각 행(레코드)의 중복을 체크하는 것입니다.

다시 말해서, 출력된 결과의 1번과 2번의 직급은 과장으로 동일하지만 사원이름이 서로 다르기 때문에 중복된 행이 아닙니다. 따라서 DISTINCT에 의해 생략되지 않고 둘 다 출력되는 것 입니다.



* 애스터리스크(*)


마지막으로는 애스터리스크라고도 불리는, 별표(*)에 대해서 알아보고 오늘 글을 마무리하려 합니다.

사실 이전에도 몇번 만나보았고 간단하게 설명드렸던 내용입니다.

이전에 우리가 아래와 같은 쿼리를 작성했던 것 기억하시나요?


SELECT * FROM employee;

위의 쿼리에서 *를 애스터리스트, 별표라고 합니다.

그리고 그 의미는 모든 값을 의미하는 것이죠.

즉, employee에 있는 모든 칼럼을 의미하기 때문에 해당 쿼리의 결과는 아래 사진과 같이 employee 테이블의 모든 칼럼에 대한 값을 출력하게 됩니다.




이렇게 해서 SELECT 문에 대한 글을 마무리합니다.


물론 추후에 WHERE절이 붙거나 JOIN, 서브쿼리를 이용하는 등의 작업에 있어서 SELECT 문에 대해서도 더 알아보아야 할 내용들이 많겠지만, 간단한 내용부터 하나씩 알아갈 예정입니다.

처음 SQL을 공부하시는 분들은 꼭 위의 내용에 대해서 이해해주셔야 추후에 더 복잡한 쿼리문에 있어서 어렵지 않게 공부하실 수 있을 것이라 생각됩니다.

더 궁금한 점이나 잘못된 부분에 대해서는 언제든지 거침없이 말씀해주시면 감사하겠습니다 :)


블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc


안녕하세요. 문범우입니다.

이번 포스팅에서는 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_NAME>

ADD COLUMN <COLUMN NAME> <DATA TYPE> [<CONSTRAINTS>];


와 같은 구문으로 추가할 수 있습니다.


비슷하게 컬럼을 삭제할 때에는,


ALTER <TABLE_NAME>

DROP COLUMN <COLUMN NAME>;

와 같은 구문으로 삭제할 수 있습니다.


이렇게 해서 테이블을 만들고, 데이터를 입력하고, 만들었던 테이블 컬럼에 대해 수정, 추가, 삭제하는 쿼리문에 대해서 알아보았습니다.

추가적으로 궁금한 점이 있거나 잘못된 점들에 대해서는 언제든지 말씀해주시면 감사하겠습니다.





블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc

안녕하세요. 문범우입니다.

지난 포스팅에서는 SSMS의 개체탐색기를 이용하며 데이터베이스 구축을 진행해보았습니다.

이번 포스팅에서는 같은 과정에 대해서 Transact-SQL을 이용해 진행해보도록 하겠습니다.


1. 데이터베이스 구축하기

 

먼저 아래와 같이 SSMS를 실행시키고 상단의 새쿼리 메뉴를 클릭합니다.

빨간색 박스에 master로 설정되어 있는 것을 확인합니다.

 

우리는 먼저 데이터베이스를 만들고 해당 데이터베이스 내부에 테이블이나 데이터를 추가할 것이니, 먼저 master를 선택하여 데이터베이스를 만들어야 합니다.

 

그럼 우측, 쿼리를 입력할 수 있는 곳에 아래와 같이 데이터베이스 생성 쿼리를 입력해봅니다.

 

create database <database명>

 

위의 쿼리문은 데이터 정의어(DDL) 중의 하나인 create문을 이용하는 쿼리입니다.

 

위의 쿼리문을 실행시키기 위해서 해당 쿼리문을 블록처리하고 F5를 눌러 실행시킵니다.

그리고 좌측의 개체탐색기 > 데이터베이스를 확인하면 Test02 라는 데이터베이스가 새로 생긴것을 확인할 수 있습니다.

 

이제 우리가 방금 생성한 Test02 라는 데이터베이스 내에 새로운 테이블을 생성하고 데이터를 추가해야 합니다.

하지만 우리가 처음 시작할 때 master 로 설정하고 시작한 것을 기억하시나요?

이 상태에서 테이블을 생성하거나 데이터를 입력하려고 하면 우리가 원하는대로, Test02 라는 데이터베이스에 데이터가 기록되지 않고 시스템 데이터베이스에 기록되게 됩니다.

따라서 우리가 앞으로 Test02에서 작업하겠다고 컴퓨터에게 알려주어야 합니다.

이를 위해서 아래와 같은 쿼리를 입력합니다.

 

use Test02;

 

위의 쿼리문을 실행하면 아래와 같이 master 로 선택되어있던 것이 Test02로 바뀐것을 확인할 수 있습니다.

 

그럼 이제 Test02에 새로운 테이블을 만들어 보도록합시다.

새로운 테이블을 만들때에도 데이터베이스 생성과 동일하게 create 문을 이용합니다.

 

create table member(
    id int constraint pk_code primary key,
    name char(10),
    email char(10)
);

 

쿼리를 실행시킬 때는 실행시키고자 하는 부분만 블록으로 감싸 F5를 눌러야합니다.

특정 부분을 블록으로 감싸지 않고 F5를 누르면 해당 쿼리창의 시작부터 끝까지 모든 쿼리가 다시 실행되므로 에러가 발생할 수 있습니다.

 

위의 쿼리를 잠시 살펴보면, create 문을 사용하였지만 database 생성시와는 다르게 테이블명 뒤에 소괄호가 있고 그 내부에 여러 정보가 있습니다.

테이블은 특정 칼럼과 그 칼럼에 대한 설명이 존재하기 때문에 위와 같은 형태를 띄게 됩니다.

 

위의 쿼리에서, member 테이블은 id, name, email 이라는 3개의 칼럼을 가지고 있습니다.

그리고 id는 int형 데이터 타입, name과 email은 모두 char(10) 이라는 데이터 타입을 가집니다.

추가적으로 id 칼럼은 contraint pk_code primary key 라고 붙어있는데, 여기서 constraint는 해당 칼럼에 특정 제약조건을 주겠다라는 의미이고 그 제약조건의 내용이 뒤에 따라서 붙습니다.

여기서는 pk_code primary key 라는 제약조건이 붙었는데, 이는 pk_code 라는 이름의 primary key로 설정하겠다라는 의미입니다.

즉, member 테이블에서의 primary key, 기본키는 id컬럼이며 해당 기본키의 이름은 pk_code인 것 입니다.

 

그런데 이렇게 테이블을 만들고 보니 name이름에 null이 들어가면 안되는 것을 깜빡했습니다.

name이라는 칼럼에 not null 속성을 추가해주어야 하는데, 그렇다고 해서 테이블을 통째로 지우고 다시 날리는 것은 너무나 비효율적입니다.

이렇게 테이블의 속성을 변경하기 위해 데이터 정의어(DDL)에서 ALTER구문이 존재합니다.

 

ALTER문을 이용하여 member 테이블의 name 칼럼의 속성을 변경해보도록 하겠습니다.

 

alter table member
alter column name char(10) not null;

 

먼저 어떤 테이블에 대해서 변경을 진행할 지 알려줍니다.

그리고 column을 수정하는데 어떤 칼럼을 수정하는지 해당 칼럼의 이름을 적어주고 이후 속성을 그대로 적어줍니다.

우리가 not null만 추가하고자 했으나 char(10)까지 그대로 적어주는 이유는 해당 alter 구문이 추가하는 명령이 아닌 변경하는 명령이기 때문입니다.

즉, char(10) 이라는 속성을 가진 칼럼을 char(10) not null 속성을 가지도록 변경하는 것 입니다.

 

그럼 이제 우리가 만든 member 테이블에 데이터를 직접 입력해주도록 하겠습니다.

이렇게 데이터를 입력하거나 조회, 수정, 삭제하는 쿼리를 데이터 조작어(DML) 이라고 합니다.

데이터 조작어에는 크게 INSERT(삽입), UPDATE(수정), DELETE(삭제), SELECT(조회) 네가지가 있으나 이번 포스팅에서는 단순히 Transact-SQL을 경험해보는 것이 목적이기 때문에 INSERT와 SELECT문에 대해 간단히 사용만 하도록 하겠습니다.

 

해당 쿼리문들에 대해서는 추후에 좀 더 자세히 알아볼 것이니 잘 이해가 가지 않아도 괜찮습니다.

 

먼저 member 테이블에 아래와 같은 쿼리로 데이터를 입력합니다.

 

insert into member values(10, '홍범우', 'hong@email');

 

위의 쿼리는, member 라는 테이블에 데이터를 insert 할 것이다라는 의미입니다.

그리고 입력되는 데이터의 내용은 values(~~~) 내부에 입력합니다.

 

해당 쿼리를 실행시키고, 우리가 입력한 데이터가 잘 저장되었나 확인하기 위해서 아래 쿼리를 입력합니다.

 

select * from member;

 

select 문은 데이터를 조회하는 쿼리문 입니다.

select 문을 통해서 어떤 칼럼을 조회할 지 선택할 수 있는데, 이때 * 의 의미는 모든 것을 의미합니다.

즉, 위의 쿼리는 특정 칼럼만 확인하는게 아니라 모든 칼럼을 조회하겠다는 의미이고, 배경이 되는 테이블이 member라는 것을 알려주기 위해 from ~ 절을 작성해준 것 입니다.

 

위의 select 쿼리를 실행시키면 아래와 같이 우리가 위에서 입력한 데이터가 정상적으로 입력된 것을 볼 수 있습니다.

 


이렇게 해서 간단하게 Transact-SQL 을 통해 데이터베이스를 구축하는 방법에 대해서 알아보았습니다.

 

블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc