55일차 [데이터 베이스] 관계형 데이터베이스3

2021. 10. 13. 23:22
반응형

2021. 10. 13 수요일

1. Today's Key Points!🔑

  • SQL문법
  • INSERT INTO, JOIN, NULL, GROUP BY

2. 정리해보자!🧹

 오늘은 데이터를 조회하는 다양한 SQL 문법을 사용하는 과제를 진행했다. 그 중에 몇개를 꼽아서 정리를 해보고자 한다.

INSERT INTO : 데이터 삽입

INSERT INTO table_name
  (column1, column2, column3, ...)
  VALUES ( value1, value2, value3, ...);

위 처럼 작성해주면 데이터를 삽입할 수 있다.

칼럼명을 생략해서 작성할 경우 모든 column의 순서에 맞춰서 값을 넣어주어야 한다.

INSERT INTO table_name
  VALUES (value1, value2, value3, ...)
-- 여기서 id칼럼이 존재하고 id값에 auto_increment 속성이 있다면 굳이 value에 값을 지정해서 넣어줄 필요가 없을 것이다.
-- 그럴 때에는 default라고 넣어주면 된다.

자세한 예시는 Sprint과제 복기에서 설명할 것이다.

한번에 여러행을 넣는 것도 가능하다.

INSERT INTO table_name
  (column1, column2, column3, ...)
  VALUES 
    (value1_1, value1_2, value1_3, ...),
    (value2_1, value2_2, value2_3, ...),
    (value3_1, value3_2, value3_3, ...),
    ...;

JOIN  : 여러 테이블 조립하기

JOIN은 내부 조인과 외부 조인으로 나뉜다.

  • 내부 조인 : INNER JOIN
SELECT * FROM table1
  INNER JOIN table2 ON table1.table2_id = table2.id

내부조인은 조인해준 테이블에서 양쪽 모두 값이 있는 행을 반환한다. INNER는 선택사항이다. 입력을 해주지 않아도 된다. 

  • 외부 조인 : LEFT JOIN / RIGHT JOIN
SELECT * FROM table1
  LEFT JOIN table2 ON table1.table2_id = table2.id

FROM뒤에 있는 테이블이 기준이되며 LEFT 조인을 하게되면 기준 테이블에있는 것을 모두 반환한다. JOIN해준 테이블에 값이 없으면 NULL이 반환된다. RIGHT 조인은 LEFT와 반대가 된다고 생각하면 된다. 그리고 기준을 어떻게 하냐에 따라 LEFT와 RIGTH는 같아질 수 있다.

SELECT * FROM table1
  RIGHT JOIN table2 ON table1.table2_id = table2.id
  
-- 위와 동일하려면
SELECT * FROM table2
  LEFT JOIN table1 ON table1.table2_id = table2.id

NULL

특정한 조건에서 값을 찾으려면 WHERE name = '홍길동' 이런 방식으로 name이 홍길동인 행을 찾아달라는 쿼리를 날리게 된다.

근데 NULL값을 가진 데이터를 찾는 방법은 좀 다르다. WHERE hobby = NULL 이렇게 주면 될 것 같지만 아니다.

SELECT * FROM table1
  WHERE hobby is NULL;

위 처럼 is NULL을 해주어야 한다.

GROUP BY : 조건에 따라 집계된 값을 가져온다.

SELECT table1.name FROM table1
  GROUP BY table1.name;

table1에 있는 name열에서 중복되는 값을 하나로 묶어 그룹으로 만들어준다.

그래서 보통 집계된 값을 얻고자할 때 GROUP BY를 사용한다. 아래처럼 작성해주면 동명이인이 몇명인지 볼 수 있을 것이다.

SELECT table.name, COUNT(table1.name) AS '동명이인' FROM table1
  GROUP BY table1.name;

3. Sprint과제 복기!🧐

 위에 정리해 놓은 것에 대한 예시를 보여줄 것이다.

 우선 테이블의 관계와 각 테이블의 정보는 아래와 같다.

각 Table 정보

INSERT INTO

 user 테이블에 데이터를 추가할 것이다.

INSERT INTO user VALUES(default, 'heungMinSon', 'heungmin@tottenham.com', 1);
-- column명 생략한 경우

INSERT INTO user (name, email, roleId)
  VALUES('kangInLee', 'kangIn@mallorca.com', 1);

 잘 들어간 것을 볼 수 있다.

JOIN

SELECT content.title, user.name FROM content 
  LEFT JOIN user ON content.userId = user.id;
-- content 테이블을 기준으로 content.title, user.name을 조회하는데, 
-- content 테이블에 존재하는 데이터는 전부 조회될 것이고, 
-- user.name은 content.userId = user.id인 데이터만 조회될 것이다.

그럼 RIGHT JOIN은?

SELECT content.title, user.name FROM content 
  RIGHT JOIN user ON content.userId = user.id;

위에 보이는 것 처럼 user 테이블에 있는 것은 모두 조회되고, content.title은 content.userId = user.id인 값이 조회 되는데 없으면 NULL로 나오게 된다.

NULL

roleId에 NULL 값을 가지고 있는 데이터를 조회해 보자.

SELECT * FROM user WHERE roleId is NULL

GROUP BY

 각 user가 작성한 글의 개수를 출력해보자.

SELECT user.name, COUNT(content.userId) AS ContentCount FROM user
  LEFT JOIN content ON content.userId = user.id
  GROUP BY user.name;

content테이블에서 userId 갯수를 세고, user.name으로 그룹핑을 해서 user.name을 조회하면 각 user가 작성한 글의 갯수를 볼 수 있게 된다.

반응형
LIST

BELATED ARTICLES

more