말 농장(Horse Farm)
이번 글에서는 말농장 주인이 되보고자 한다.
데이터베이스를 활용해 다양한 말과 고객을 관리하는 데이터베이스를 만드는 과정을 다뤄볼 예정이다.

데이터베이스 생성(Create Database)
우선 말농장을 관리할 마구간 데이터베이스를 만들어준다.
mysql> create database horsestable;
말농장에 들어갈 정보를 생성하기 위해 마구간 데이터베이스를 사용함을 명시해준다.
mysql> use horsetable;
테이블 생성(Create Table)
우리가 생성할 테이블은 총 9개로 (말, 기수, 학생, 곡물, 건초, 침구, 직원, 호실, 목초지)이다.
1. 마구간의 '말' 테이블을 생성한다.
mysql> create table horse (
-> ID int not null auto_increment,
-> registered_name varchar(15),
-> barn_name varchar(20) not null,
-> breed varchar(20),
-> age int,
-> height decimal(3,1),
-> start_date date not null,
-> primary key (ID)
-> );
2. 말의 주인이자 탑승자인 '기수' 테이블을 생성한다.
mysql> create table boarder (
-> ID int not null auto_increment,
-> first_name varchar(20) not null,
-> last_name varchar(30) not null,
-> address varchar(30) not null,
-> city varchar(20) not null,
-> state char(2),
-> zip int not null,
-> primary_phone char(10) not null,
-> email_address varchar(30),
-> primary key (ID)
-> );
3. 승마 수업에 참가할 '학생' 테이블을 생성한다.
mysql> create table student (
-> ID int not null auto_increment,
-> first_name varchar(20) not null,
-> last_name varchar(30) not null,
-> primary_phone char(10) not null,
-> email_address varchar(30),
-> primary key (ID)
-> );
4. 말들이 먹을 '곡물' 테이블을 생성한다.
mysql> create table grain (
-> ID int not null auto_increment,
-> manufacturer varchar(30) not null,
-> product varchar(30) not null,
-> weight int,
-> Cost decimal(5,2) not null,
-> primary key (ID)
-> );
5. 말들이 먹을 '건초' 테이블을 생성한다.
mysql> create table hay (
-> ID int not null auto_increment,
-> type enum('Coastal', 'Timothy', 'Orchard', 'Alfalfa', 'Peanut', 'Bermuda', 'Oat', 'Barley'),
-> size enum('Two string', 'Three string'),
-> Cost decimal(5,2) not null,
-> Weight int not null,
-> primary key (ID)
-> );
6. 말들이 잘 '침구' 테이블을 생성한다.
mysql> create table bedding (
-> ID int not null auto_increment,
-> type enum('Pellets', 'Shavings', 'Straw'),
-> size int,
-> cost decimal(5,2) not null,
-> primary key (ID)
-> );
7. 마구간을 관리할 '직원' 테이블을 생성한다.
mysql> create table staff (
-> ID int not null auto_increment,
-> first_name varchar(20) not null,
-> last_name varchar(30) not null,
-> primary_phone char(10) not null,
-> email_address varchar(30),
-> type enum('Trainer', 'Groom', 'Barn Staff', 'Maintenance'),
-> primary key (ID)
-> );
8. 각 말이 쓰는 '호실' 테이블을 생성한다.
mysql> create table stall (
-> stall_id int not null auto_increment,
-> stall_number enum('1', '2', '3', '4', '5', '6', '7', '8', '9', '10'),
-> base_price float(5,2) not null,
-> primary key (stall_id)
-> );
9. 말들이 뛰어 다닐 '목초지' 테이블을 생성한다.
mysql> create table pasture (
-> pasture_id int not null auto_increment,
-> pasture_number enum('1', '2', '3', '4'),
-> base_price float(5,2) not null,
-> primary key (pasture_id)
-> );
테이블 확인(Show Tables)
생성된 테이블들을 확인해보자.
mysql> show tables;

9개의 테이블이 모두 제대로 생성된 것을 확인할 수 있다.
테이블 확인(Describe)
그럼 이번에는 생성한 테이블의 속성이 제대로 들어갔는지 확인해보자. (desc로 줄여서 입력해도 무관하다.)
mysql> desc horse;

앞서 'horse' 테이블에서 정의했던 속성들이 모두 제대로 들어간 것을 확인할 수 있다.
데이터 삽입(Insert Into Table)
테이블이 모두 정상적으로 생성된 것을 확인했다면, 이번에는 각 테이블에 들어갈 정보(데이터)를 넣어보자.
데이터를 삽입할때에는 Insert Into를 사용해 앞서 정의한 속성에 알맞게 데이터를 values 안에 넣어주면 된다.
1. horse 테이블에 아래와 같은 말들의 정보를 넣어준다.
(registered_name, barn_name, breed, age, height)
a. Babe's Blazing Pine, Blaze, Quarter Horse,11,15.3, July 1 2016 b. Sweet Peppy, Cruise, Paint,13,15.3, July 1 2016 c. Sagitario, Sag, Lusitano, 19, 15.3, July 1 2016 d. NA, Zico, Lusitano,17,15.3, January 1 2008 e. Independence Hill, Indy, Holsteiner,2,16, March 1 2017 f. NA, Kamen, Holsteiner,12,18, May 1 2018 g. NA, Thunder, Paint,15,16, September 1 2017 h. NA, Allie, Saddlebred,20,15.3, April 1 2018 i. NA, Jet, Egyptian Arab,12,15.3, August 1 2013 j. NA, Timothy, Quarter Horse Pony,5,10, April 1 2018 k. NA, Johnny, Thoroughbred,12,16, September 1 2017 l. NA, Carera, Holsteiner,3,17, March 1 2018 |
insert into horse (registered_name, barn_name, breed, age, height, start_date)
values ('Babe\'s Blazing Pine', 'Blaze', 'Quarter Horse', 11, 15.3, '2016-07-01');
insert into horse (registered_name, barn_name, breed, age, height, start_date)
values ('Sweet Peppy', 'Cruise', 'Paint', 13, 15.3, '2016-07-01');
...
insert into horse (barn_name, breed, age, height, start_date)
values ('Johnny', 'Thoroughbred',12,16, '2017-09-01');
insert into horse (barn_name, breed, age, height, start_date)
values ('Carera', 'Holsteiner',3,17, '2018-03-01');
2. staff 테이블에 아래와 같은 정보를 넣어준다.
(first_name, last_name, primary_phone, email, position)
a. Martin, Brett, 4071234567, martinbrett@email.com, Maintenance b. Karin, Whiting, 4072345678, karinwhiting@email.com, Barn c. Vanessa, Talcott, 4073456789, vanessatalcott@email.com, Trainer d. Bruce, Patti, 4074567890, brucepatti@email.com, Trainer |
insert into staff (first_name, last_name, primary_phone, email_address, `type`)
values ('Martin', 'Brett', 4071234567, 'martinbrett@email.com', 'Maintenance');
...
insert into staff (first_name, last_name, primary_phone, email_address, `type`)
values ('Bruce', 'Patti', 4074567890, 'brucepatti@email.com', 'Trainer');
3. hay 테이블에 아래와 같은 정보를 넣어준다.
(type, size, cost, weight)
a. Coastal, Two string, 45.00, 50 b. Timothy,Two string, 65.00, 50 c. Orchard,Three string, 35.00, 100 d. Alfalfa,Three string, 67.00, 100 e. Peanut,Two string, 35.00, 50 f. Bermuda,Three string, 30.00, 100 g. Oat,Two string, 40.00, 50 h. Barley,Two string, 50.00, 50 |
insert into hay (`type`, size, cost, weight)
values ('Coastal', 'Two string', 45.00, 50);
insert into hay (`type`, size, cost, weight)
values ('Timothy','Two string', 65.00, 50);
...
insert into hay (`type`, size, cost, weight)
values ('Oat','Two string', 40.00, 50);
insert into hay (`type`, size, cost, weight)
values ('Barley','Two string', 50.00, 50);
4. bedding 테이블에 아래와 같은 정보를 넣어준다.
(type, size, cost)
a. Pellets,30,6.50 b. Shavings,40,8.00 c. Straw,50,10.00 |
insert into bedding (`type`, size, cost)
values ('Pellets',30,6.50);
insert into bedding (`type`, size, cost)
values ('Shavings',40,8.00);
insert into bedding (`type`, size, cost)
values ('Straw',50,10.00);
5. grain 테이블에 아래와 같은 정보를 넣어준다.
(manufacturer, product, weight, cost)
a. Nutrena,ProForce Fuel,50,19.25 b. Nutrena,ProForce XTN,50,23.99 c. Nutrena,ProForce Senior,50,24.99 d. Nutrena,ProForce Fiber,50,23.99 |
insert into grain (manufacturer, product, weight, cost)
values ('Nutrena','ProForce Fuel',50,19.25);
...
insert into grain (manufacturer, product, weight, cost)
values ('Nutrena','ProForce Fiber',50,23.99);
6. boarder 테이블에 아래와 같은 정보를 넣어준다.
(first_name, last_name, address, city, state, zip, primary_phone, email)
a. Karin, Whiting,1234 Street Name, Orlando,FL,32825,4071234678,karinwhiting@email.com b. Vanessa, Talcott,123 Road Name, Orlando,FL,32826,4072345678,vanessatalcott@email.com c. Bruce, Patti,2775 East Oscelosa Road, Geneva,FL,32820,4073912009,brucepatti@email.com d. Maria, Gonzalez,234 West Boulevard, Oviedo,FL,32821,4075557894,mariagonzalez@email.com e. Nancy, Smith,479 East Boulevard, Oviedo,FL,32821,4075697412,nancysmith@email.com f. Julia, Yancy,5795 Avenue Name, Sanford,FL,32751,4075670112,juliayancy@email.com g. Mystery, Owner,0000 Mystery Street, Mystery,FL,32751,4077044740,mystry@email.com h. Jennifer, Jumper,I-4 Corridor, Orlando,FL,32756,4079875412,jenniferjumper@email.com i. Alix, Kamen,Nightmare Before Christmas, Bithlo,FL,32666,4073578521,alixkamen@email.com |
insert into boarder (first_name, last_name, address, city, state, zip, primary_phone, email_address )
values ('Karin', 'Whiting','1234 Street Name', 'Orlando','FL',32825,4071234678,'karinwhiting@email.com');
insert into boarder (first_name, last_name, address, city, state, zip, primary_phone, email_address )
values ('Vanessa', 'Talcott','123 Road Name', 'Orlando','FL',32826,4072345678,'vanessatalcott@email.com');
...
insert into boarder (first_name, last_name, address, city, state, zip, primary_phone, email_address )
values ('Jennifer', 'Jumper','I-4 Corridor', 'Orlando','FL',32756,4079875412,'jenniferjumper@email.com');
insert into boarder (first_name, last_name, address, city, state, zip, primary_phone, email_address )
values ('Alix', 'Kamen','Nightmare Before Christmas', 'Bithlo','FL',32666,4073578521,'alixkamen@email.com');
7. student 테이블에 아래와 같은 정보를 넣어준다.
(first_name, last_name, address, city, state, zip, primary_phone, email)
a. Lauren, White, 4074589687, laurenwhiteg@email.com b. Lorisa, Grey, 4077894561, lorisagrey@email.com c. Rebecca, Black, 4070147567, rebeccablack@email.com d. Alice, Brett, 4070140026, alicebrett@email.com e. Heidi, Horse, 4077536987, heidihorse@email.com f. Misty, Lane, 4071090321, mistylane@email.com g. Deborah, Twohorse, 4078521470, debbytwohorse@email.com h. Catherine, Neighbor, 3215211478, catherinesparents@email.com |
insert into stall (stall_number, base_price)
values (1, 150.00);
insert into stall (stall_number, base_price)
values (2, 150.00);
...
insert into stall (stall_number, base_price)
values (9, 150.00);
insert into stall (stall_number, base_price)
values (10, 150.00);
8. stall 테이블에 아래와 같은 정보를 넣어준다.
(stall_number, base_price)
a. 1, 150.00 b. 2, 150.00 c. 3, 150.00 d. 4, 150.00 e. 5, 150.00 f. 6, 150.00 g. 7, 150.00 h. 8, 150.00 i. 9, 150.00 j. 10, 150.00 |
insert into stall (stall_number, base_price)
values (1, 150.00);
insert into stall (stall_number, base_price)
values (2, 150.00);
...
insert into stall (stall_number, base_price)
values (9, 150.00);
insert into stall (stall_number, base_price)
values (10, 150.00);
9. pasture 테이블에 아래와 같은 정보를 넣어준다.
(pasture_number, base_price)
a. 1, 75.00 b. 2, 75.00 c. 3, 150.00 d. 4, 100.00 |
insert into pasture (pasture_number, base_price)
values (1, 75.00);
...
insert into pasture (pasture_number, base_price)
values (4, 100.00);
데이터 확인
모두 입력을 마쳤다면, 테이블에 정보가 제대로 들어갔는지 확인해보자. (여기서 *은 전체 튜플을 선택함을 의미한다.)
mysql> select * from horse;

모두 정상적으로 입력된 것을 확인할 수 있다. registered_name의 NULL값들은 아직 이름이 정해지지 않은 말들이다.
확인이 끝났으면, 나머지 8개의 테이블에도 정보가 제대로 입력되었는지 확인해주자.
마무리하며
이번 포스트에서는 말농장에 필요한 객체들의 속성을 테이블로 정의하고 그 안에 알맞은 정보를 입력해 볼 수 있었다.
여기까지 직접 해보았다면, DB 구축의 절반은 다했다고 볼 수 있다. (사실상, 설계가 제일 오래 걸린다.)
다음 포스트에서는 생성한 테이블 안에 각 객체를 연결하여 새로운 관계 테이블을 만드는 과정을 다루어 보겠다.
'데이터베이스 > SQL' 카테고리의 다른 글
HorseFarm(3) - View생성 (0) | 2022.01.06 |
---|---|
HorseFarm(2) - 데이터의 연결 (0) | 2022.01.05 |