본문 바로가기
개발 공부/데이터베이스

im_sprint_learn_sql 스프린트 분석 learnmysql

by 크롱이크 2021. 7. 27.

part-3

 목표 : 데이터베이스를 연결하고 주어진 스키마를 구현할 수 있도록 SQL문 작성하기

 

1) .env.example 파일 확인 후 .env 생성하기

2) lib/common/mysql.js 에서 변수들이 어떻게 사용되나 확인하기

 

스키마 작성 (다음과 같이 만들어져야한다.)

파트3의 sql문은 비교적 쉬웠다.

테이블의 구조를 보기위한 sql문을 작성하는 건데 금방 찾으니까 패스~

 

part-4

파트 4에서는 데이터베이스에 데이터를 추가하는 명령어 INSERT INTO 와 JOIN 을 활용하는 문제들로 구성되어 있다.

 

join은 outer(외부) join과 inner(내부) join으로 나뉜다.

 

part 4-9 참조

아우터 조인은 OUTER(외부) JOIN 이란 조인 조건에서 동일한 값이 없는 행도 반환할 때 사용하는 구문이다.
즉 A, B 테이블을 JOIN 할 경우, 조건에 맞지 않는 데이터도 표시하고 싶을 때 OUTER JOIN을 사용한다.

 

LEFT (OUTER) JOIN은 왼쪽 테이블의 모든 레코드를 리턴하고,  이에 매칭하는 오른쪽 테이블의 레코드를 리턴하지만

매칭되는게(content.userId와 user.id가 매칭되지 않으면) 없으면 NULL을 리턴한다고 한다.

 

part 4-8 참조

반대로  inner join은 조인 조건에서 동일한 값만을 반환한다.

이 문제에서는 content 테이블의 userId와 user 테이블의 id이 매칭되어야 하는데 title이 'database sprint'와 'sql practice'만 userId(1)를 갖고 있기 때문에 이에 매칭되는 user의 id(1)인 name(duhyunkim)이 출력되었다.

 

 

 

part-5 

스키마 모델

part 5_2_6

위의 스키마 모델에서 보면, 카테고리에서 출발하여 하나하나 연결되어 user.name에 도달했다.

user.name= "jiSungPark"은 조건이 되고, 그 조건을 알아보기 위해 join으로 연결했다.

 

part 5_2_9

COUNT() 함수는 저렇게 사용된다.

조금 헷갈렸던 부분이 이문제와 마지막 문제의 카운트 변수의 차이였다.

이 문제는 기준 테이블인 content 자체에서 카운트를 세기 때문에 *를 사용할 수 있었다.

조건도 'duRiCha'  한명만을 찾는 조건이였다.

 

part 5_2_10

 

하지만 이 문제의 경우 content.userId 를 카운트 세고 있다.

이번 기준테이블은 user이고 각 유저의 컨텐트의 갯수를 세기 위해서는 

content.userId의 갯수를 세줘야 하기 때문이다.

GROUP BY의 예시도 볼 수 있었다. 이름에 따라 정렬이 된다.

 

반응형

댓글