Skip to content

Commit

Permalink
200714 | add ERD, Data Type at 02_sql_advanced
Browse files Browse the repository at this point in the history
  • Loading branch information
wally-wally committed Jul 14, 2020
1 parent f1ac094 commit cfcba23
Show file tree
Hide file tree
Showing 2 changed files with 95 additions and 0 deletions.
60 changes: 60 additions & 0 deletions 05_DB/02_sql_for_data_analysis/02_sql_advanced/02_SQL_Advanced.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,3 +86,63 @@ DELETE FROM Users WHERE id = 2 -- 특정 행만 삭제

<br>

## 2. ERD & 데이터 타입

### (1) ERD(Entity Relationship Diagram)

- ERD 내용 참고 문서 : https://www.lucidchart.com/pages/er-diagrams#section_5

- ERD : 테이블 간의 관계를 쉽게 파악하기 위해 시각화한 것

- Entity(개체)

- 데이터베이스에 저장된 <b>테이블 하나하나</b>를 의미

- Attribute(속성)

- 각 Entity가 가지고 있는 특징이자 각 <b>컬럼</b>을 의미
- `PK`(Primary Key, 기본키)
- 테이블을 대표하는 Key
- 각 테이블의 주키로 두 개 이상의 기본키가 존재할 수 없다.
- `PK`는 중복되어 저장될 수 없다.
- `FK`(Foreign Key, 외래키)
- 외부 식별자로 부름
- 다른 엔티티의 `PK`에서 참조되는 키
- 참조되는 테이블의 기본키와 대응되어 테이블 간에 참조 관계를 표현하는데 중요한 도구
- 선으로 표현하는 테이블 간에 관계

![01](https://user-images.githubusercontent.com/52685250/87399971-22cff400-c5f3-11ea-9d93-dccd9a52f6f5.PNG)

​ (이미지 출처 : https://www.lucidchart.com/pages/er-diagrams#section_5)

- Relationship(관계)

- 개체 간의 관계 또는 속성 간의 관계

<br>

### (2) 데이터 타입

<img src="https://user-images.githubusercontent.com/52685250/66879523-5f85a500-eff9-11e9-82d8-47398c49e371.JPG" width="650px">

- 숫자
- 정수 : `TINYINT`, `SMALLINT`, `MEDIUMINT`, `INT`, `BIGINT`
- 실수 : `DECIMAL`, `DOUBLE`, `FLOAT`
- `DECIMAL` : 정밀하게 숫자를 계산해야 할 때(ex. 돈)
- `DOUBLE` : 일반적으로 사용되는 실수 타입
- `FLOAT` : 정확성은 떨어지지만 속도가 빠름

- 문자
- `VARCHAR`(글자 수가 다양한 문자), `CHAR`(글자 수 일정한 문자)
- 주로 `VARCHAR`를 사용한다.
- 날짜, 시간
- `DATE` : 1000-01-01 ~ 9999-12-31
- `DATETIME` : 1000-01-01 00:00:00.000000 ~ 9999-12-31 23:59:59.999999(= `DATE` + TIME)
- `TIMESTAMP` = `DATETIME` + `TIMEZONE`

- 간혹 어떤 테이블에는 날짜 데이터가 들어가는 컬럼의 데이터 타입을 `DATETIME`이나 `TIMESTAMP`로 하지 않고 `VARCHAR` 형태로 지정한다.
- 왜냐하면 `DATETIME`, `TIMESTAMP`의 형태로 저장되어 있지 않고 12/08/2019와 같은 형태의 텍스트로 저장되어 있을 수 있기 때문이다.
- 그래서 이와 같이 저장되어 있으면 저번에 살펴보았던 `DATE_ADD` 함수를 이용한 시간이나 날짜 계산을 할 수가 없다.
- 이러한 문제를 해결하기 위해 `MySQL`에서는 문자형 데이터를 DATE형으로 바꿔주는 함수(`str_to_date()`)가 있다.
- 참고 문서 : https://stackoverflow.com/questions/38677002/mysql-convert-string-to-datetime
- 다른 데이터베이스에서도 string을 date형으로 바꿔주는 함수가 있으니 구글링을 통해서 살펴보도록 하자.
35 changes: 35 additions & 0 deletions 05_DB/02_sql_for_data_analysis/02_sql_advanced/leetcode/02.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
-- #1 서브쿼리 이용
DELETE
FROM Person
WHERE Id NOT IN(
SELECT sub.min_id
FROM (
SELECT Email, MIN(Id) AS min_id FROM Person GROUP BY email
) sub)


-- #2 DELETE + INNER JOIN
SELECT *
FROM Person p1
INNER JOIN Person p2 ON p1.Email = p2.Email
-- 위 SELECT문 출력 결과
-- p1.Id p1.Email p2.Id p2.Email
-- 1 john@example.com 1 john@example.com => 삭제
-- 1 john@example.com 3 john@example.com => 유지
-- 2 bob@example.com 2 bob@example.com => 유지
-- 3 john@example.com 1 john@example.com => 삭제
-- 3 john@example.com 3 john@example.com => 삭제

SELECT *
FROM Person p1
INNER JOIN Person p2 ON p1.Email = p2.Email
WHERE p1.Id > p2.Id
-- 위 SELECT문 출력 결과
-- p1.Id p1.Email p2.Id p2.Email
-- 1 john@example.com 3 john@example.com
-- 2 bob@example.com 2 bob@example.com

DELETE p1
FROM Person p1
INNER JOIN Person p2 ON p1.Email = p2.Email
WHERE p1.Id > p2.Id

0 comments on commit cfcba23

Please sign in to comment.