데이터베이스
데이터베이스란 여러 사람이나 프로그램이 데이터를 쉽게 공유하기 위해
체계적으로 관리되는 데이터의 집합을 칭한다.
DBMS - 데이터베이스 관리 시스템
- SQL DB (관계형 데이터베이스)
행과 열로 이루어저 있다.
엑셀처럼(표형식) 스키마(Schema: 구조와 제약 조건에 관한 명세)
형식에 맞춰서 데이터가 저장된다.
그러므로 체계적이고 안정적으로 데이터를 관리할 수 있다.
대표적으로 PostgreSQL, MySQL, OracleDB, SQLite, MariaDB 가 있다. - NoSQL DB (관계형이 아닌 모든 데이터베이스)
Key-Value : 파이썬의 딕셔너리처럼 키와 벨류로 데이터를 저장하는
가장 단순한 데이터베이스다. ex) { 'name' : 'zeriong' }
단순한 만큼 속도가 빠르고 주로 캐싱, 세션관리, 리더보드, 실시간분석 등에
주로 사용된다.
대표적인 제품으로 redis , amazon DynamoDB 등이 있다.
Document : key와 value가 있는건 마찬가지 이지만 json의 형식으로 데이터를
저장할 수 있는 Document형식의 데이터베이스다.Document형식이기 때문에
스키마가 변경되는 것에 유연하게 대처할 수 있다.
대표적으로 mongoDB, Amazon DocumentDB, Firestore 등이 있다.
Gracph : 노드의 속성별로 데이터를 저장하는 방식이다.
페이스북같은 소셜 네트워크 혹은 추천엔진을 위한 데이터베이스다.
대표적으로 neo4j, Amazon Neptune, Giraph 등이 있다.
MySQL 시작하기
https://dev.mysql.com/downloads/installer/
링크를 통해서 용량이 높은 (mysql-installer-community-8.0.32.0.msi) 를 다운로드한다.
기본설정
- MySQL Workbench를 실행하고 localhost에서 설정했던 비밀번호로 root 계정에 접속한다.
- Add SQL아이콘을 눌러서 SQL을 추가할 수 있는 SQL File을 띄워준다.
- 아래의 코드를 입력하여 스키마를 만들어준다.
CREATE SCHEMA `mydatabase` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ;
위 코드에서 utf8mb4 는 한글을 포함한 전세계문자와 이모티콘사용이 가능해진다.
utf8mb4 _ general _ ci 는 정확도가 가장 높지는 않지만 정렬속도가 빠른 코드이다.
원하는 테이블에서 쿼리를 실행하고자 할땐 반드시 스키마리스트에서
해당 테이블을 더블클릭한 후 +SQL을 눌러야 해당 테이블내에서 쿼리를
실행시켜 원하는 데이터를 가져올 수 있다.
MySQL서버 파워쉘로 열기
( CLI = Comend Line Interface )
C:\Program Files\MySQL\MySQL Server 8.0\bin 에서
./mysql -u root -p
입력한다. 내용은
-u 유저네임은 root이고 -p 패스워드를 사용한다는 뜻이다.
이 후 지정한 패스워드를 입력하고
show databases; 를 입력하면
데이터베이스 테이블이 쭉 나온다.
이 후 사용할 테이블을 use와 함께 입력하면 사용가능하다.
ex) use mydatabase
이 후에
Database changed
문구가 뜨면 쿼리를 사용해주면 결과가 선택한 테이블 내의
데이터가 적용되어 나온다.
CREATE TABLE - 테이블 만들기
CREATE TABLE people ( -- 테이블이름은 people
person_id INT, -- 콜룸데이터명은 person_id이고 int속성이다.
person_name VARCHAR(10), -- VARCHAR 가변길이 문자열 10byte까지
age TINYINT, -- TINYINT 범위: 0~255 숫자
birthday DATE -- 날짜
);
ALTER TABLE - 테이블 변경
-- 테이블명 변경
ALTER TABLE people RENAME TO friends,
-- 컬럼 자료형 변경
CHANGE COLUMN person_id person_id TINYINT,
-- 컬럼명 변경
CHANGE COLUMN person_name person_nickname VARCHAR(10),
-- 컬럼 삭제
DROP COLUMN birthday,
-- 컬럼 추가
ADD COLUMN is_married TINYINT AFTER age;
DROP TABLE - 테이블 삭제
DROP TABLE friends;
-- friends테이블을 삭제한다.
INSERT INTO - 데이터 삽입
INSERT INTO people
(person_id, person_name, age, birthday)
VALUES (1, '홍길동', 21, '2000-01-31');
-- 콜룸명과 순서에 맞게 VALUES에 넣어주면 데이터가 입력된다.
INSERT INTO people
VALUES (2, '전우치', 18, '2003-05-12');
-- 모든 컬럼에 값 넣을 때는 컬럼명들 생략 가능
INSERT INTO people
(person_id, person_name, birthday)
VALUES (3, '임꺽정', '1995-11-04');
-- 일부 컬럼에만 값 넣기 가능 (NOT NULL은 생략 불가)
INSERT INTO people
(person_id, person_name, age, birthday)
VALUES (1, '임꺽정', '스물여섯', '1995-11-04');
-- 자료형에 맞지 않는 값은 오류 발생
INSERT INTO people
(person_id, person_name, age, birthday)
VALUES
(4, '존 스미스', 30, '1991-03-01'),
(5, '루피 D. 몽키', 15, '2006-12-07'),
(6, '황비홍', 24, '1997-10-30');
-- 여러 행을 한 번에 입력 가능
테이블 생성시 제약 넣기
CREATE TABLE people (
person_id INT AUTO_INCREMENT PRIMARY KEY,
person_name VARCHAR(10) NOT NULL,
nickname VARCHAR(10) UNIQUE NOT NULL,
age TINYINT UNSIGNED,
is_married TINYINT DEFAULT 0
);
--AUTO_INCREMENT = 새 행 생성시마다 자동으로 1씩 증가
--PRIMARY KEY = 중복 입력 불가, NULL(빈 값) 불가
--UNIQUE = 중복 입력 불가 (NULL값 가능)
--NOT NULL = NULL(빈 값) 입력 불가
--UNSIGNED = (숫자일시) 양수만 가능
--DEFAULT = 값 입력이 없을 시 기본값
= PRIMARY KEY (기본키) =
1. 테이블마다 하나만 가능
2. 기본적으로 인덱스 생성 (기본키 행 기준으로 빠른 검색 가능)
3. 보통 AUTO_INCREMENT와 함께 사용
(각 행을 고유하게 식별 가능 - 테이블마다 하나씩 둘 것)
숫자 자료형
< 숫자 자료형 표 >
자료형 | 바이트 | SIGNED | UNSIGNED |
TINYINT | 1 | -128 ~ 127 | 0 ~ 255 |
SMALLINT | 2 | -32,768 ~ 32,767 | 0 ~ 65,535 |
MEDIUMINT | 3 | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 |
INT | 4 | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 |
BIGINT | 8 | -2^63 ~ 2^63 - 1 | 0 ~ 2^64 - 1 |
고정 소수점(Fixed Point) 수
- 좁은 범위의 수 표현이 가능하며, 정확한 값을 칭한다.
- DECIMAL( s, d ) 실수 부분 총 자릿수( s ) & 소수 부분 자릿수 ( d ) s 최대 65
ex: DECIMAL(5, 2) 1번째인자가 5라서 숫자 5자릿수,
2번째 인자가 2라서 소수점 2자릿수까지만 가능하다.
12345, 1234.5, 123.45 이런식으로 가능하다 숫자가 5자리면 된다.
부동 소수점(Floating Point) 수
- 넓은 범위의 수 표현 가능하며, 정확하지 않은 값이지만
일반적으로 충분히 정확하다. - FLOAT
-3.402...E+38 ~ -1.175...E-38 , 0 , 1.175...E-38 ~ 3.402...E+38 - DOUBLE
-1.797...E+308 ~ -2.225E-308 , 0 , 2.225...E-308 ~ 1.797...E+308
문자열
- CHAR( s )
설명 : 고정 사이즈 (남는 글자 공백으로 채움)
차지하는 바이트 : s (고정값)
MAX 바이트 : 255 - VARCHAR ( s )
설명 : 가변 사이즈(남는 글자를 제외하고 맞춰진다.)
차지하는 바이트 : 실제 글자 수(최대 s) + 1 (글자수 정보)
MAX 바이트 : 65,535
VARCHAR와 CHAR 이해하기
검색시 CHAR가 더 빠르다
VARCHAR 컬럼 길이값이 4글자보다 적을 경우 CHAR로 자동 변환된다
VARCHAR는 남는 글자수를 없애는 처리를 추가로 하고 기본적으로
글자수 정보를 반드시 넣어야 함으로 1바이트가 반드시 추가된다.
ex)
CHAR(4) : { VALUE: 'ABCD' } = 4bytes
VARCHAR(4) : { VALUE: 'ABCD' } = 5bytes
이렇게 상황에 따라 경제적으로 사용하는 것이 효율적이다.
< 텍스트 / 최대바이트 >
TINYTEXT | 255 |
TEXT | 65,535 |
MEDIUMTEXT | 16,777,215 |
LONGTEXT | 4,294,967,295 |
날짜와 시간
- DATE
YYYY-MM-DD - TIME
HHH:MI:SS
HHH: -838 ~ 838까지의 시간 - DATETIME
YYYY-MM-DD HH:MI:SS
입력된 시간값을 그 자체로 저장 ex) String(1995-05-18)=> Date(1995-05-18) - TIMESTAMP
YYYY-MM-DD HH:MI:SS
MySQL이 설치된 컴퓨터의 시간대를 기준으로 저장
DATETIME와 TIMESTAMP의 사용은?
- 시간 데이터를 가감없이 기록할 때 DATETIME
역사나 계획일자처럼 정해져있는 시간을 기록할때 사용한다. - 시간 자동기록, 국제적인 서비스를 할 경우 TIMESTAMP 사용
국제적인 sns는 시차가 나라별로 다르기 때문에 사용한다.
마치며...
다음 포스팅에도 간단한 예시들과 적당한 설명을 포스팅 할 예정이다. 생각보다 MySQL과 데이터베이스에 대해서는 쓸 내용이 많은 것 같다...
예시자료 출처 - https://www.yalco.kr/lectures/sql/
'Backend > MySQL' 카테고리의 다른 글
[ MySQL ] 상관,비상관 서브쿼리와 JOIN (0) | 2023.02.02 |
---|---|
[ MySQL ] 데이터베이스 SELECT (0) | 2023.01.30 |