오늘 배운 SQL 내용들을 잊기 전에 정리해보자.
목차
- 데이터베이스 만들기
- 테이블과 필드 만들기
- 필드에 내용 추가하기
- 인덱스를 기준으로 내림차순 정렬
1. 데이터 베이스 만들기
제일 먼저 My SQL에 연결을 해야한다.
CMD를 켜고
MySQL -u root -p
(비밀번호)
이제 데이터 베이스를 만들어보자
CREATE DATABASE `MEI` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
각각의 구문을 분석하면 다음과 같다.
CREATE DATABASE `MEI` : MEI라는 이름을 가진 데이터 베이스를 만든다. 본 구문에서 MEI는 데이터 베이스 이름이기 때문에 당연히 만들때 MEI가 아니라 다른 자신이 원하는 이름으로 만들면 된다.
DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci : 기본 문자열 설정을 UTF-8 형식으로 설정하며 이를 4바이트로 설정한다. 4바이트로 설정해야 이모티콘과 같은 그림 문자도 쓸 수 있다고 한다.
utf8mb4_general_ci 는 대소문자를 구분하지 않고 정렬하겠다는 의미라고 한다.
1 - 1 데이터 베이스 목록 보기
데이터베이스가 제대로 만들어졌는지 확인하자.
SHOW DATABASES;
다음 구문을 입력하면 데이터베이스들을 볼 수 있다. 데이터베이스"들"을 보는 것이기 때문에 DATABASE가 아니라 DATABASES이다.
1 - 2 데이터 베이스 삭제
이번에는 데이터 베이스를 삭제해보겠다. 데이터 베이스 삭제는 윈도우의 삭제처럼 휴지통으로 가거나 하지 않고 즉시 모든 자료가 복구 불가능하게 삭제됨으로 삭제하기 전에 정말로 삭제해도 되는지 두번 세번 확인해야한다고 한다.
DROP DATABASE `MEI`;
MEI 부분은 데이터베이스 명이 들어가는 곳으로 삭제하고 싶은 데이터 베이스 이름을 입력하면 된다.
1 - 3 데이터베이스 선택
이제 테이블을 만들어보자. 그전에 필드를 만들 데이터베이스를 선택해야 한다.
USE `MEI`;
MEI라는 이름을 가진 데이터베이스를 사용하겠다는 뜻이다. 1-2에서 MEI 데이터 베이스를 삭제했기 때문에 다시 CREATE 구문을 사용하여 데이터베이스를 만들고 USE를 사용하였다.
2. 테이블과 필드 만들기
이제 데이터 베이스에 테이블과 그 안에 들어갈 필드를 만들어보자. 필드는 데이터베이스의 열들을 말하며 필드를 추가하면 열의 갯수가 늘어난다.
CREATE TABLE `borad`(
`id` VARCHAR(10),
`content` TEXT,
`title` VARCHAR(20),
`like` int,
`owner` VARCHAR(10),
`view` int
);
-- 다음과 같이 만들어도 동일한 결과이다.
-- CREATE TABLE `borad`(`id` VARCHAR(10), `content` TEXT, `title` VARCHAR(20), `like` int, `owner` VARCHAR(10), `view` int);
위와 같은 구문은 borad라는 테이블을 만들고 그 안에 필드로 id, content, title, like, owner, view를 쓰겠다는 뜻이다.
정확한 구문의 사용법은 CREATE TABLE `테이블이름` (`필드명` 타입, `필드명` 타입, ...) 과 같은 식으로 사용하면 된다.
2 - 1 타입
SQL은 데이터를 사용하기 위해서 데이터의 타입을 지정해주어야 한다. C 계열 언어나 자바 등과 비슷한 데이터타입이 존재하며 대표적인 타입은 다음과 같다.
문자형 | 숫자형 | ||
정수형 | |||
VARCHAR(길이) | 가변 길이 문자형 원하는 길이를 지정해야하면 그 만큼의 문자만 쓸 수 있게 되며 그에 못미치는 문자를 입력하면 최대 길이가 그에 맞게 줄어든다. |
INT or INTEGER | 32bit 길이의 숫자 저장 |
CHAR(길이) | 고정 길이 문자형 최대 길이에 못 미치는 문자를 입력할 경우 나머지는 공백으로 채워진다. |
TINYINT | 8bit 길이의 숫자 저장 |
TEXT | 최대 64KB의 문자열을 저장한다. 이는 VARCHAR 형의 최대 길이와 같다. | SMALLINT | 16bit |
MEDIUMTEXT | 최대 16MB | MEDIUMINT | 24bit |
LONGTEXT | 최대 4GB | BIGINT | 64bit |
날짜형 | 실수형 | ||
DATE | YYYY-MM-DD 형식으로 날짜 정리 | DECIMAL(precision, scale) | 고정 소수점 저장 precision: 소수점을 포함한 전체 자릿수 scale: 소수점 이하 자릿수 |
DATETIME | 날짜와 시간을 저장 | FLOAT | 부동 소수점 저장 |
TIME | 시간을 저장 | DOUBLE | 부동 소수점 저장 FLOAT 형보다 더 큰 값을 저장할 수 있다. |
TIMESTAMP | 데이터가 마지막으로 저장된 시간 |
2 - 2 테이블 확인
만든 테이블이 존재하는지 확인해보자.
SHOW TABLES;
다음과 같이 입력하면
Table in mei | |
▶ | borad |
테이블이 아주 잘 만들어진 것을 볼 수 있다. 지금은 테이블을 하나만 만들어서 borad 테이블만 보이지만 더 많은 테이블을 만들면 위의 구문을 통해 mei 데이터 베이스 안에 있는 모든 테이블을 볼 수 있다.
근데 테이블 명을 보니 뭔가 이상하다. 그렇다 오타가 난것이다. 테이블 명을 다시 제대로 수정해보자.
2 - 3 테이블 이름 수정
원래 의도했던 테이블 이름은 게시판을 의미하는 보드였다. 하지만 지금 보라드가 되어서 다시 제대로 만들어야 한다.
ALTER TABLE `borad` RENAME `board`;
다음과 같이 사용하면 borader 테이블의 이름을 boarder 테이블로 바꿀 수 있다. 당연히도 실제로 사용할때 테이블 명은 원하는 이름으로 사용하면 된다.
2 - 4 테이블 내 필드들 보기
이제 테이블 내에 필드들이 제대로 들어갔는지 확인할 차례다. DESC 구문을 이용하면 테이블에 존재하는 열의 이름과 속성 등을 볼 수 있다.
DESC `board`;
Field | Type | Null | Key | Default | Extra | |
id | varchar(10) | YES | (NULL) | |||
content | text | YES | (NULL) | |||
title | varchar(20) | YES | (NULL) | |||
like | int | YES | (NULL) | |||
owner | varchar(10) | YES | (NULL) | |||
view | int | YES | (NULL) |
Field : 필드의 이름을 나타낸다.
Type : 필드의 타입.
Null : 내용을 공백으로 나타낼 수 있나 없나를 나타낸다. 처음 필드를 만들때 NOT NULL 속성을 지정해주면 해당부분이 NO로 바뀐다.
Key : 해당 열이 고유한 열(Unique)이나 기본 키(Primary Key)로 지정이 되어있는지를 나타낸다.
Default : 아무 내용도 입력하지 않으면 기본으로 입력되는 내용을 나타낸다. 여기서는 아무것도 지정하지 않았기 때문에 NULL 로 나온다.
Extra : 해당요소가 auto_increment 속성으로 지정되있는지등 추가적인 옵션이 있는지 나타낸다.
3. 필드에 내용 추가하기
이제 각각의 필드(열)들에 내용을 추가해보자.
INSERT INTO `board` (`id`, `content`, `title`, `like`, `owner`)
VALUES ("Mei", "콘텐츠.", "제목", 3, "Mei", "0");
INSERT INTO `테이블명` (`필드명1`, `필드명2`, ...) VALUES ("필드명1에 들어갈 내용", "필드명2에 들어갈 내용" ...);
다음과 같이 입력하면 되는데 이때 순서대로 값을 잘 입력하는 것이 중요하다. 첫번째 줄 구문에 필드명 순서는 꼭 처음 테이블을 만들때의 필드명 순서대로 할 필요는 없지만 이후 밸류에 들어갈 값은 첫번째 구문 순서대로 들어가니 타입이랑 내용을 잘 들어가게 조심해서 써야한다.
또한 주의사항으로 여태까지 이름을 나타낼때 `백틱` 으로 감쌌는데 밸류에 들어갈 값은 "큰따옴표"나 '작은따옴표'로 감싸야한다는 것이다. 이때 숫자는 아무것도 감싸지 않아도 상관없다.
이제 인덱스를 기준으로 오름차순이나 내림차순을 하면 된다. 근데 중요한 문제점이 생겼다. 생각해보니 처음만들때 인덱스를 만들지 않았다는 점이다. 필드에 인덱스를 추가해보자.
3 - 1 필드를 추가
필드를 추가하기 위해서는 ALTER ... ADD .... 구문을 사용하면 된다. ALTER를 사용하는 이유는 SQL에서 필드 자체를 삭제하거나 수정할 수는 없어서 구조를 바꾸어야하기 때문이라고 한다.
우리가 추가하려는 INDEX는 고유한 값을 가져야하기 때문에 PRIMARY KEY를 추가해보려고 한다. 거기에 반드시 입력되어야 하기 때문에 NOT NULL 구문도 추가해보려고 한다.
ALTER TABLE `board` ADD `index` INT NOT NULL PRIMARY KEY; -- 주의! 오류가 발생할 수도 있는 구문
이렇게 하면 아무런 문제없이 인덱스 필드가 추가된다. 하지만 정말로 아무 문제가 없을까? 만약 여기서 행이 2개 이상 존재한다면 오류가 발생할 것이다.
그 이유가 무엇일까? PRIMARY KEY는 오로지 하나의 값만 가지고 있어야 한다. 하지만 우리가 행을 만들때 2개 이상 만든 상황을 보자. INDEX는 나중에 추가된 것이기 때문에 우리는 그 안에 아무런 값을 넣지 않았고 이곳에는 NULL의 값이 들어간다.
문제는 여기서 발생하는데 행이 두개라는 것은 NULL의 값도 2개라는 뜻이다. PRIMARY는 같은 데이터값이 오로지 하나만 존재해야 하기 때문에 이러면 오류가 발생하는 것이다.
이를 방지하기 위해서는 행을 하나만 남기고 다 삭제를 하던가 아니면 AUTO_INCREMENT 구문을 사용하는 방법이 있다.
어차피 INDEX 구문은 INT형이고 행을 저장할때 마다 값이 증가하게 할 예정이니 AUTO_INCREMENT를 사용하기에 딱 좋은 필드라고 볼 수 있다.
ALTER TABLE `board` ADD `index` INT PRIMARY KEY AUTO_INCREMENT;
수정된 구문이다. AUTO_INCREMENT 구문을 추가해서 자동으로 숫자가 증가하게 하였으며 굳이 추가할 필요가 없는 NOT NULL 부분도 제거하였다. 이제 자동으로 INDEX 번호가 붙어서 NULL로 값이 지정되는 경우는 없기 때문이다.
이제 우리는 필드까지 추가하였다 다음에는 필드를 삭제하거나 수정하는 법을 알아보자.
포스트가 길어졌기 때문에 이어서 써보려고 한다.
'웹프로그래밍 > SQL' 카테고리의 다른 글
(공부중) MySQL CRUD 공부(3) - 정렬, 필드 데이터 수정/삭제 (0) | 2024.06.18 |
---|---|
(공부중) MySQL CRUD 공부(2) - 필드 삭제와 필드의 이름, 타입 수정 (0) | 2024.06.17 |