이제 본격적으로 SQL을 사용해서 데이터베이스를 다뤄볼 차례이다.
데이터베이스는 데이터를 저장하는 공간이다. MySQL을 설치한 후에는 가장 먼저 데이터베이스를 준비해야 한다. 그리고 데이터베이스 안에 테이블을 생성해야 한다.
테이블은 2차원의 표 형태로 이루어져 있으며, 각 열에 해당하는 데이터를 한 행씩 입력할 수 있다. 필요하다면 행에 입력된 데이터를 수정하거나 삭제할 수도 있다. 마지막으로 입력이 완료된 데이터를 조회해서 활용할 수 있다.
DBMS 설치하기
데이터베이스를 구축하기 위해서는 DBMS를 설치해야 한다. 다행히 우리는 이미 DBMS의 한 종류인 MySQL을 설치해 놓았다. DBMS는 있지만 아직 DBMS 내부에 우리가 사용할 쇼핑몰 데이터베이스는 없는 상태이다.
데이터베이스 만들기
이제 DBMS 안에 데이터베이스를 만들 차례이다. 이번 실습을 마치면 다음과 같이 비어 있는 '쇼핑몰 데이터베이스'가 생성된다.
MySQL Workbench에 접속하면 좌측 하든에 Administraion과 Schemas 탭이 있다. Schemas 탭을 클릭하면 MySQL에 기본적으로 들어 있는 데이터베이스가 3개 보인다. 스키마와 데이터베이스는 동일한 용어이다. 앞으로 스키마 용어가 나오면 그냥 데이터베이스라고 이해해도 무방하다.
Schemas 탭을 클릭한후 좌측 패널의 빈 부분에서 마우스 오른쪽 버튼을 클릭한 후 Create Schema를 선택해서 스키마를 만들 수 있다.
테이블 만들기
이제는 테이블을 만들 차례이다.
테이블 설계하기
건물을 짓기 전에 설계도를 그려야 한다고 이야기 했었다. 테이블을 생성하기 위해서도 설계가 필요하다. 테이블을 설계한다는 것은 테이블의 열 이름과 데이터 형식을 지정하는 것이다.
회원 테이블은 다음과 같이 설계를 완성했다고 가정하자.
열 이름(한글) | 영문 이름 | 데이터 형식 | 최대 길이 | 널 허용 안함(Not Null) |
아이디(기본 키) | member_id | 문자(CHAR) | 8글자 | Yes |
회원 이름 | member_name | 문자(CHAR) | 5글자 | Yes |
주소 | member_addr | 문자(CHAR) | 20글자 | No |
회원 테이블은 아이디, 회원 이름, 주소 3개 열로 구성하고 각각의 영문 이름도 지정했다. 또한 데이터 형식은 모두 문자로 지정했다. 문자는 CHAR라는 MySQL 문법상 이미 약속된 예약어를 사용해야 한다. 문자의 최대 길이도 적절히 지정했다.
널(Null)은 빈 것을 의미하여 널 허용 안함(Not Null, NN)은 반드시 입력해야 한다는 의미이다. 회원이라면 당연히 아이디와 이름은 있어야 하기 때문에 아이디 및 회원 이름 열은 꼭 입력하도록, 주소는 넣지 않아도 무방하도록 설계했다.
제품 테이블도 마찬가지 개념으로 다음과 같이 설계를 완성했다고 가정하자.
열 이름(한글) | 영문 이름 | 데이터 형식 | 문자의 최대 길이 | 널 허용 안함(Not Null) |
제품 이름(기본 키) | product_name | 문자(CHAR) | 4글자 | Yes |
가격 | cost | 숫자(INT) | Yes | |
제조일자 | make_date | 날짜(DATE) | No | |
제조회사 | company | 문자(CHAR) | 5글자 | No |
남은 수량 | amout | 숫자(INT) | Yes |
열 이름을 영문으로 만들 때 띄어쓰기는 하지 않는 것이 좋다. 띄어쓰기를 할 경우에는 열 이름을 큰따옴표로 묶어 줘야 해서 불편하다. 그래서 보통은 언더 바(_)로 구분하는데, 예로 회원 아이디의 의미를 명확하게 전달하기 위해 member_id로 설정했다.
회원 테이블과 차이점이 있다면 INT가 새롭게 등장했다. INT는 Integer의 약자로 소수점이 없는 정수를 의미한다. DATE는 연, 월, 일을 입력한다.
테이블 생성하기
테이블을 생성하는 것도 MySQL 워크벤치에서 진행하면 된다.
Schemas 패널에서 shop_db의 ▶를 클릭해 확장하고 Tables를 마우스 오른쪽 버튼으로 클릭한 후 Create Tables을 선택한다.
데이터 입력하기
테이블 구성까지 완료했다. 이제는 실제로 데이터를 입력할 차례이다. 데이터는 행(가로) 단위로 입력한다. 회원 테이블에는 4건, 제품 테이블에는 3건의 데이터를 입력해보자. 입력된 결과는 다음 그림과 같다.
MySQL Workbench 창의 Schemas 패널에서 shop_db - Tables - member 를 선택하고 마우스 오른쪽 버튼을 클릭한 후 Select Rows - Limits 1000을 선택한다.
MySQL Workbench 창의 중앙에 Result Grid 창이 나타난다. 아직은 모두 NULL로 표시되어 있는데 member_id, member_name, member_addr 항목의 NULL 부분을 클릭해서 데이터를 생성한다. 여기까지 완료했다면 apply를 클릭한다.
apply 버튼을 누르면 sql 문이 등장하는데 이 sql 문은 3장에서 자세히 다룰 예정이다.
위 이미지를 확인해보면 데이터를 입력한 순서와 실제로 입력된 데이터의 정렬이 다름을 알 수 있다. 그 이유는 member_id를 기본키로 설정했기 때문이다. 즉, 기본키로 설정한 열이 기준이 되어 오름차순으로 자동 정렬된다.
product 테이블에 데이터를 넣는 SQL은 다음과 같으니 참고하자
INSERT INTO `shop_db`.`product` (`product_name`, `cost`, `make_date`, `company`, `amount`) VALUES ('바나나', '1500', '2021-07-01', '델몬트', '17');
INSERT INTO `shop_db`.`product` (`product_name`, `cost`, `make_date`, `company`, `amount`) VALUES ('삼각김밥', '800', '2023-09-01', 'CJ', '22');
INSERT INTO `shop_db`.`product` (`product_name`, `cost`, `make_date`, `company`, `amount`) VALUES ('카스', '2500', '2022-03-01', 'OB', '3');
조금전에 입력한 데이터를 수정해보자. 수정할 데이터를 클릭하고 변경하면 된다. 이번에는 수정이기 때문에 UPDATE문이 생성된 것을 확인할 수 있다. Apply와 Finish 버튼을 클릭해서 수정한 내용을 적용한다.
UPDATE `shop_db`.`member` SET `member_addr` = '경기 부천시 중동' WHERE (`member_id` = 'tess');
이번에는 데이터를 삭제해보자. 삭제하고자 하는 행의 제일 앞 부분을 클릭하면 행이 파란색으로 선택된다. 그 상태에서 마우스 오른쪽 버튼을 클릭하고 Delete Row를 선택한다. 삭제한 후에도 역시 Apply 버튼을 클릭해야 한다. 이번에는 삭제이기 때문에 Delete 문이 생성된 것을 확인할 수 있다. Apply와 Finish 버튼을 클릭해서 수정한 내용을 적용한다.
DELETE FROM `shop_db`.`member` WHERE (`member_id` = 'test');
데이터 활용하기
데이터를 입력하여 데이터베이스 구축을 완료했다. 이번에는 데이터베이스를 활용하는 방법을 살펴보자. SQL에서는 데이터베이스를 활용하기 위해 주로 SELECT 문을 사용하며, 이 책 에서도 SELECT 문을 활용하는 내용이 가장 많다. 직접 SQL을 입력해서 데이터를 조회해보자
1. 쿼리창이 열려 있지 않은 상태에서 새 SQL을 입력하기 위해 툴바의 Create a new SQL tab for executing queries 아이콘을 클릭한다. 실행된 결과를 보기 위해 Output 아이콘을 클릭하여 Output 패널도 활성화한다.
2. 작업할 데이터베이스를 선택하기 위해 SCHEMAS 패널의 shop_db를 더블클릭 한다. 진하게 변경되면 앞으로 쿼리 창에 입력한 SQL이 선택된 shop_db에 적용된다는 의미이다. 처음 MySQL을 사용할 때 자주 빼먹는 부분이니까 주의하자.
3. 먼저 회원 테이블의 모든 행을 조회하기 위해 다음 SQL을 입력한다. SELECT의 기본 형식은 SELECT 열_이름 FROM 테이블_이름 [WHERE 조건]이고, *는 모든 열을 의미한다. 따라서 '회원 테이블의 모든 열을 보여줘'라는 의미이다.툴바에서 Execute the selected portion of the script or everything 아이콘을 클릭하면 Result Grid 창에는 결과가, Output 패널에는 현재 결과의 건수와 조회하는데 소요된 시간이 표시된다.
쿼리를 실행하는 방법은 Query - Execute 메뉴를 선택하거나 Ctrl+Shift+Enter 키를 눌러도 SQL을 실행할 수 있다.
SQL은 대소문자를 구분하지 않는다. 하지만 관례적으로 SQL의 예약어는 대문자로 표시한다. SQL의 제일 뒤에는 세미콜론(;)이 꼭 있어야 된다고 기억하자. 가끔 없어도 되는 경우도 있지만 그걸 모두 기억하는 것보다 있어야 한다고 생각하는게 더 편하다.
4. 회원 테이블 중에 이름과 주소만 출력해보자. 기존 쿼리를 지우고 다음과 같이 새로 입력한 후 실행하자.
SELECT member_name, member_addr FROM member;
열 이름 부분에 회원 이름(member_name)과 주소(member_addr)만 나왔다. 이렇게 여러 개의 열 이름을 콤마(,)로 분리하면 필요한 열만 추출된다.
5. 이번에는 아이유 회원에 대한 정보만 추출해보자. 앞의 SQL을 지우지 말고 다음 줄에 이어서 다음과 같이 입력한 후 실행하자.
SELECT * FROM member WHERE member_name='아이유';
WHERE 다음에 특정 조건을 입력하여 회원 이름(member_name)이 '아이유'인 회원만 출력되도록 한 것이다. 그런데 Result Grid 창의 아래쪽 탭을 살펴보면 2개의 SQL이 모두 실행된 것을 확인할 수 있다.
2개의 SQL 결과가 모두 나온것은 SQL을 실행할 때 쿼리 창에 있는 모든 SQL을 실행하기 때문이다. 지금은 SELECT만 있고 두 줄뿐이므로 큰 문제가 없지만, 향후에 여러 개의 SQL을 사용할 때 주의해야 한다.
위와 같은 경우를 방지하기 위해서 1개의 SQL만 남기고 모두 지우는 방법도 있지만, 더 편리한 방법은 필요한 부분만 마우스로 드래그해서 선택한 후에 실행하는 것이다. 두 번째 SQL만 선택하고 실행해보자. 마우스로 선택된 부분만 실행되기 때문에 하나의 결과 탭만 생성된다. 앞으로는 이 방법을 사용하자.
핵심 포인트
- 스키마는 MySQL 안의 데이터베이스를 말한다. 데이터베이스와 동일한 용어라고 생각하면 된다.
- 데이터 형식은 문자형(CHAR), 정수형(INT) 등과 같이 열에 저장될 데이터의 형식을 말한다.
- 예약어는 SELECT, FROM, WHERE와 같은 기존에 약속된 SQL이다.
- 기본 키는 열에 지정하며, 각 행을 구분하는 유일한 값이다.
'혼공학습단 12기' 카테고리의 다른 글
[혼공S] 1주차 미션 (0) | 2024.07.07 |
---|---|
[혼공S] 02 - 3 '데이터베이스 개체' 정리 (0) | 2024.07.06 |
[혼공S] 02 - 1 '건물을 짓기 위한 설계도: 데이터베이스 모델링' 정리 (0) | 2024.07.03 |
[혼공S] 01 - 2 'MySQL 설치하기' 정리 (0) | 2024.07.02 |
[혼공S] 01 - 1 '데이터베이스 알아보기' 정리 (0) | 2024.07.01 |