Skip to content

Commit

Permalink
[README] Mysql readme update
Browse files Browse the repository at this point in the history
  • Loading branch information
rrabit42 authored Jul 30, 2020
1 parent b7a7e7b commit 2dea32b
Showing 1 changed file with 239 additions and 1 deletion.
240 changes: 239 additions & 1 deletion Node.js+Mysql/README.md
Original file line number Diff line number Diff line change
@@ -1 +1,239 @@
# Node.js와 SQL 연동
# Node.js와 MYSQL 연동

## MYSQL

### 구조
* 표(table)
* 스키마(skema): 관련있는 표들끼리 그룹핑한 일종의 데이터베이스(database)
* 데이터베이스 서버(server): 스키마들의 집합

### Mysql 서버 접속
```
mysql -u(사용자) -p(비밀번호)
```
```
mysql -h(호스트주소) -p(포트번호) -u(아이디) -p(비밀번호)
```

### Mysql 클라이언트
* mysql monitor : mysql 서버의 bundle로 제공하는 기본 프로그램, 명령어 기반, 우리가 흔히 보는 그 창 맞음
* mysql workbench: GUI
* phpMyAdmin: 사기프 프로젝트 때 썼다
* 그 외

### SQL 기본 쿼리문

```CREATE DATABASE (DB이름) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;```
> 문자셋(Character set)은 각 문자가 컴퓨터에 저장될 때 어떠한 '코드'로 저장될지에 대한 규칙의 집합
콜레이션(Collation)은 특정 문자셋에 의해 데이터베이스에 저장된 값들을 비교 검색하거나 정렬 등의 작업을 위해 문자들을 서로 '비교'할 때 사용하는 규칙들의 집합

```
use (DB이름);
show tables;
// 테이블 구조보기(describe)
DESC (테이블);
// 별명(AS)
ex. topic.id AS topic_id => column명이 topic_id로 출력
```

```
DROP DATABASE (DB이름);
DROP table (테이블명);
```

```
create table (테이블명(
속성명1 속성타입,
속성명2 속성타입2,
...
);
```

```
// 속성추가
alter table 테이블명 add 속성명 속성타입;
// 속성삭제
alter table 테이블명 drop 속성명;
// 속성 변경
alter table 테이블명 change column 이전 속성명 새 속성명 속성타입;
// 속성 타입 변경
alter table 테이블명 modify column 속성명 새 속성타입;
// 테이블명 변경
alter table 테이블명 rename 새 테이블명;
```

```
insert into 테이블명 values('값', '값',...);
insert into 테이블명 (속성1, 속성2) values ('값','값');
```

```
select * from 테이블명;
select * from 테이블명 where 조건1 and/or 조건2...;
select 속성1, 속성2,... from 테이블명 (where 조건절);
```

```
update 테이블명 set 속성1='값',속성2='값',... where 조건;
```

```
// 데이터 삭제
delete from 테이블명 where 속성1='값' and/or 속성2='값'....;
// 데이터 전체 삭제
truncate 테이블명;
```

### GROUP BY(그룹핑)
mysql에서 유형별로 개수를 가져오고 싶다.
단순히 count 함수로 데이터를 조회하면 전체 갯수만을 가져온다.
유형별로 갯수를 알고 싶을 때는 컬럼에 데이터를 그룹화할 수 있는 group by를 사용해야함

* 특정 column을 그룹화 하는 GROUP BY
* 특정 column을 그룹화한 결과에 조건을 거는 HAVING
*WHERE는 그룹화 하기 전이고, HAVING은 그룹화 후에 조건

```
// 컬럼 그룹화
SELECT 컬럼 FROM 테이블 GROUP BY 그룹화할 컬럼;
```

```
// 조건 처리 후에 컬럼 그룹화
SELECT 컬럼 FROM 테이블 WHERE 조건식 GROUP BY 그룹화할 컬럼;
```

```
// 컬럼 그룹화 후에 조건 처리
SELECT 컬럼 FROM 테이블 GROUP BY 그룹화할 컬럼 HAVING 조건식;
```

```
//조건 처리 후에 컬럼 그룹화 후에 조건 처리
SELECT 컬럼 FROM 테이블 WHERE 조건식 GROUP BY 그룹화할 컬럼 HAVING 조건식;
```

```
// ORDER BY가 존재하는 경우
SELECT 컬럼 FROM 테이블 [WHERE 조건식]
GROUP BY 그룹화할 컬럼 [HAVING 조건식] ORDER BY 컬럼1 [, 컬럼2, 컬럼3 ...];
```

[출처](https://extbrain.tistory.com/56)

### ORDER(정렬)

### INDEX
색인, 조회할 때 원하는 행을 빠르게 찾을 수 있게 준비해둔 데이터
자주 조회되는 칼럼에 적용
조회 시 오랜시간을 소모하는 컬럼에 적용
데이터가 긴 경우 인덱스를 사용하지 않는다.

* primary: 중복되지 않는 유일한 키
> 테이블 전체를 통틀어서 중복되지 않는 값을 지정해야 한다.
where 문을 이용해서 데이터를 조회할 때 가장 고속으로 데이터를 가져올 수 있다.
테이블마다 딱 하나의 primary key를 가질 수 있다.
```select * from student where id=3;```

* normal : 중복을 허용하는 인덱스
> 중복을 허용한다.
primary, unique 보다 속도가 느리다.
여러개의 키를 지정할 수 있다.
```select * from student where department='국문과'```

* unique : 중복을 허용하지 않는 유일한 키
> 테이블 전체를 통틀어서 중복되지 않는 값을 지정해야 한다. (== primary key)
고속으로 데이터를 가져올 수 있다.
여러개의 unique key를 지정할 수 있다.
```select * from student where number=0534543;```

* foreign : 다른 테이블과의 관계성을 부여하는 키

* full text : 자연어 검색, myisam에서만 지원
> mysql의 기본설정(ft_min_word_len)이 4로 되어 있기 때문에 최소 4글자 이상을 입력하거나 이 값을 조정해야 한다.
mysql은 전문 검색 엔진이 아니기 때문에 한글 검색이 잘 안된다
전문검색엔진으로 lucene, sphinx 참고
스토리지 엔진 중 myisam에서만 사용가능
```
SELECT introduction, MATCH(introduction) AGAINST('영문과에') FROM student WHERE MATCH (introduction) AGAINST('영문과에');
```

* 중복키
> 하나의 키에 여러개의 칼럼을 포함
```select * from student where department='국문과' AND address='제주';```

[출처](http://pager.kr/x/index.php?mid=board_WsUz20&document_srl=1143)

### 테이블 쪼개기(모델링) -> 수정에 용이, but 한번에 정보 파악은 어려움
중복된 정보, 여러번 사용되는 정보는 객체로 나누기
ex. 회원정보, 프로필 등
모든 표는 하나의 테마(주제)를 가져야한다!!!
중복은 절대X

### JOIN (뒤로 갈수록 잘 안쓰이는 명령어)
JOIN을 이용해 테이블 쪼개기 전의 상태로 만드는 것
sql joins visualizer 사이트 등을 이용해 명령어 찾기, 검색 등
벤다이어그램(A와 B)을 생각해보자! 무슨 결합으로 어떤 칼럼들을 결합하는지!

1. A : LEFT JOIN

> ```SELECT * from (테이블) left JOIN (합칠테이블) ON topic.author_id = author.id;```
```SELECT (칼럼들 지정) from (테이블) left JOIN (합칠테이블) ON topic.author_id = author.id;```
근데 두 테이블에 같은 칼럼명이 있을 수 있으니 그럴때는 (테이블명).(컬럼명) 으로 해주면 된다!
NULL이 나오는 경우: 해당하는 값이 없구나!
2개 외에도 3개, 4개 join 가능
ex. ```SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.aid LEFT JOIN profile ON author.profile_id = profile.pid```

> 불필요한 정보(aid, pid 등)는 \*로 하지말고 원하는거 빼면 됨!
```SELECT tid, topic.title, author_id, name, profile.title, AS job_title FROM topic LEFT JOIN author ON topic.author_id = author.aid LEFT JOIN profile ON author.profile_id = profile.pid```

> 특정 조건(aid=1)만 JOIN해서 가져옴!
```SELECT tid, topic.title, author_id, name, profile.title, AS job_title FROM topic LEFT JOIN author ON topic.author_id = author.aid LEFT JOIN profile ON author.profile_id = profile.pid WHERE aid=1;```


2. A 교집합 B : INNER JOIN
> NULL 행이 존재하지 않음
데이터베이스에서 NULL 값은
NULL == NULL -> false ???? => 찾아보자!

> ```SELECT * FROM topic INNER JOIN author ON topic.author_id = author.aid```
양쪽에 값이 모두 있는 것만 가져온다! 값이 채워지지 못하는 행(NULL이 존재할 행)은 JOIN하지 않는다!
INNER JOIN도 여러번 가능
```SELECT * FROM topic INNER JOIN author ON topic.author_id = author.aid INNER JOIN profile ON profile.pid = author.profile_id```

3. A 합집합 B : FULL OUTER JOIN
> ex. 차이점 비교...거의안씀
```SELECT * FROM topic FULL OUTER JOIN author ON topic.author_id = author.id```
```(SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.id) UNION (SELECT * FROM topic RIGHT JOIN author ON topic.author_id=author.id)```
UNION 명령어는 DISTINCT 라는 명령어가 생략되어 있음. 그래서 중복되는거 제외됨!
위의 두 쿼리문 모두, 오른쪽 기준 왼쪽 채운거 가져옴 + 왼쪽 기준 오른쪽 채운거 가져옴 - 중복되는 행은 제외
즉, 왼쪽에만 있는 행도 나오고(오른쪽은 NULL), 오른쪽에만 있는 행도 나옴(왼쪽은 NULL)

4. A- B: EXCLUSIVE LEFT JOIN
> 집합에서 A-B 같은거, A에서 B와 관련있는거 모두 제외
```SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.aid WHERE author.aid is NULL;```
즉 B의 칼럼들이 null인 행만 나옴
(여기서 author.aid=NULL 하면 X)

5. B : RIGHT JOIN (그냥 LEFT 많이 씀)

### 그 외 정보
* query문 마지막이 ;(세미콜론)으로 끝나는 이유는 여러 query문을 한줄에 처리할 수 있게 하기 위함

### 그 뒤에 해보면 좋을 기능들
* 검색기능
form method="get", sql-where 사용
* index
검색하는데 오래 걸리면 sql-index 사용
* 정렬
sql-orer by
* page 기능
sql-LIMIT 0 OFFSET 20
* NOSQL

0 comments on commit 2dea32b

Please sign in to comment.