2023. 5. 15. 17:57ㆍRDBMS/mysql
이 글은 생활코딩 님의 MySQL 강의를 듣고 정리한 글입니다.
MySQL 의 구조
관계형 데이터베이스는 엑셀과 비슷한 표(table)로 저장된다.
서로 연관된 표를 그룹핑 한 것을 데이터베이스 라고 한다.
스키마 : 서로 연관된 표를 그룹핑한 일종의 폴더
MySQL 서버 접속
실제로는 root 로 작업을 하면 위험하니 다른 계정을 만들어 사용하는 것이 권장된다.
mysql -uroot -p
MySQL 스키마의 사용
데이터 베이스를 만들때
CREATE DATABASE opentutorials;
데이터 베이스를 지울때
DROP DATABASE opentutorials;
데이터 베이스 생성 확인
SHOW DATABASES;
데이터 베이스 사용
USE opentutorials;
SQL 과 테이블 구조
테이블은 x, y 축으로 쪼갤수 있는데 수평이로 되어있는 것을 row (행) 이라고 한다.
수직으로 된 칸 하나 하나를 column(열) 이라고 한다.
MySQL 테이블 생성
CREATE TABLE topic(
id INT(11) NOT NULL AUTO_INCREMENT,
title VARCHAR(100) NOT NULL,
description TEXT NULL,
created DATETIME NOT NULL,
author VARCHAR(15) NULL,
profile VARCHAR(200) NULL,
PRIMARY KEY(id)
);
ERROR 1820(HYOOO): You must reset your password using ALTER USER statement before executing this statement
-> MySQL 이 기본으로 준 비밀번호를 사용하면 나타나는 에러
해결방법
mysql> SET PASSWORD = PASSWORD('your_new_password');
MySQL CRUD
테이블 구조 보기
DESC topic;
INSERT (C)
INSERT TOPIC (title, description, created, author, profile) VALUES('MySQL', 'MySQL is ...', NOW(), 'egoing', 'developer');
SELECT (R)
- topic 행 모두 출력
SELECT * FROM topic;
- id, title, created, author 만 출력
select id, title, created, author from topic;
- select 뒤에는 column 을 작성해야한다.
- from 은 생략 가능하다.
- author 의 값이 'egoing' 인 값만 가져오기 ( where 문은 from 다음에 위치한다 )
select id, title, created, author from topic where author='egoing';
- 정렬하기
select id, title, created, author from topic where author='egoing' order by id desc;
- 2개만 보고싶다면
select id, title, created, author from topic where author='egoing' order by id desc limit 2;
UPDATE (U)
update topic set description='Oracle is ...', title='Oracle' where id=2;
- where 절을 빼먹는다면 모두 다 바뀔수 있으니 조심해야한다.
DELETE (D)
delete from topic where id=5;
- 마찬가지로 where 절을 빼먹으면 인생이 바뀔 수도 있으니 조심
관계형 데이터베이스의 필요성
- 만약 데이터가 중복된다면 개선할 필요가 있다는 것
- 테이블을 나누어 준다면 개선할 수 있다.
- 테이블을 나누면 데이터를 볼때 행에 해당되는 표를 비교하면서 봐야하는 불편함이 생기긴 하나 mysql 은 이 불편함을 없앨수 있다.
테이블 분리하기
- rename 은 테이블 이름을 바꾼다.
rename table topic to topic_backup;
show tables;
- author 테이블 만들기
CREATE TABLE `author` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`profile` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`)
);
- author 테이블에 값 넣기
INSERT INTO `author` VALUES (1,'egoing','developer');
INSERT INTO `author` VALUES (2,'duru','database administrator');
INSERT INTO `author` VALUES (3,'taeho','data scientist, developer');
- topic 테이블 생성
CREATE TABLE `topic` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(30) NOT NULL,
`description` text,
`created` datetime NOT NULL,
`author_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
);
- topic 테이블에 값 넣기
INSERT INTO `topic` VALUES (1,'MySQL','MySQL is...','2018-01-01 12:10:11',1);
INSERT INTO `topic` VALUES (2,'Oracle','Oracle is ...','2018-01-03 13:01:10',1);
INSERT INTO `topic` VALUES (3,'SQL Server','SQL Server is ...','2018-01-20 11:01:10',2);
INSERT INTO `topic` VALUES (4,'PostgreSQL','PostgreSQL is ...','2018-01-23 01:03:03',3);
INSERT INTO `topic` VALUES (5,'MongoDB','MongoDB is ...','2018-01-30 12:31:03',1);
JOIN
- 분리된 테이블을 읽을 때 하나의 테이블을 보는 것 같이 할 수 있다.
- 두 개의 테이블의 결합고리는 topic 테이블의 author_id 와 author 테이블의 id
select * from topic left join author on topic.author_id = author.id;
- 위의 코드에서 id 를 숨기고 싶다면?
select topic.id, topic.title, topic.description, topic.created, author.name, author.profile from topic left join author on topic.author_id = author.id;
- id 를 구분하고 싶다면 바꿀 수도 있다.
- as 를 사용해 그 이름으로 보이게 할 수 있다.
select topic.id as topic_id, topic.title, topic.description, topic.created, author.name, author.profile from topic left join author on topic.author_id = author.id;
- 테이블을 분리함으로써 데이터 하나를 바꾸면 관련있는 모든 테이블의 정보를 바꿀 수 있다.
MySQL 검색 키워드
index
- 데이터를 찾는데 걸리는 시간을 줄여줌
- 미리 정리해두는 느낌
modeling
- 정규화 비정규화
- 데이터들이 많아짐에 따라 어떻게 테이블을 만들어야 하나?
backup
- 언제 고장날지 모름
- 데이터를 복제해서 보관한다.
- mysql 덤프
# mysqldump -u 계정 -p패스워드 DB명 > /디렉토리/파일명.sql
cloud
- AWS RDS
- Google Cloud SQL for MySQL
- AZURE Database for MySQL
programming
- Python mysql api
- PHP mysql api
- Java mysql api
'RDBMS > mysql' 카테고리의 다른 글
mysql homebrew 설치 (0) | 2023.04.10 |
---|---|
데이터베이스 생성, 확인, 삭제 (0) | 2023.04.10 |