[데이터베이스] 관계형 데이터베이스 - Learn SQL Part.4

윤후·2022년 3월 8일
0

Section 3

목록 보기
23/41

Sprint 풀이


Schema.sql에서 만들었던 user와 content의 테이블이 있을 것이다. mysql에 접속하여 데이터가 어떻게 되어 있는지 확인해보자.

mysql> select * from content;
+----+-----------------+------------------+---------------------+--------+
| id | title           | body             | created_at          | userId |
+----+-----------------+------------------+---------------------+--------+
|  1 | database sprint | database is easy | 2022-03-08 11:09:08 |      1 |
|  2 | deploy sprint   | deploydeploy     | 2022-03-08 11:09:08 |   NULL |
|  3 | first project   | happyhacking     | 2022-03-08 11:09:08 |   NULL |
+----+-----------------+------------------+---------------------+--------+
3 rows in set (0.00 sec)
mysql> select * from user;
+----+--------------+-----------------------------+
| id | name         | email                       |
+----+--------------+-----------------------------+
|  1 | duhyunkim    | duhyun.kim@codestates.com   |
|  2 | seunghwanoh  | seunghwan.oh@codestates.com |
|  3 | junhongpark  | junhong.park@codestates.com |
|  4 | jinsukjeong  | jinsuk.jeong@codestates.com |
|  5 | 김아무개       | abcd@naver.com              |
+----+--------------+-----------------------------+
5 rows in set (0.00 sec)
  • user 테이블에 존재하는 모든 컬럼을 포함한 모든 데이터를 확인하기 위한 SQL
SELECT * FROM user
  • user 테이블에 존재하는 모든 데이터에서 name 컴럼만을 확인하기 위한 SQL
SELECT name FROM user
  • user 테이블에 데이터를 추가하기 위한 SQL
INSERT INTO user(name, eamil) VALUES('김아무개', 'ABCD@naver.com')
  • user 테이블에서 특정 조건을 가진 데이터를 찾기 위한 SQL (name이 ‘duhyunkim’이어야 한다.)
SELECT * FROM user WHERE name='duhyunkim'
  • user 테이블에서 특정 조건을 가진 데이터를 찾기 위한 SQL(name이 ‘duhyunkim’아니어야 함.)
SELECT * FROM user WHERE name<>'duhyunkim'
  • content 테이블에 존재하는 모든 데이터에서 title 컬럼만을 찾기 위한 SQL
SELECT title FROM content
  • content의 title과 그 컨텐츠를 작성한 user의 name을 찾기 위한 SQL
    • 저자가 없더라도, 컨텐츠의 title을 모두 가져와야 한다.

⇒ 위의 데이터베이스를 보았을 때, user와 content는 Foreign Key와 Primary Key로 연결되어 있다.

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

content를 기준으로 Left Join을 한다. user.name의 값이 NULL이여도 content의 title이 존재하면 모두 가져올 수 있기 때문이다.

  • content의 title과 그 컨텐츠를 작성한 user의 name을 찾기 위한 SQL
    • 저자가 있는 컨텐츠의 title만 찾아야 한다.
SELECT content.title, user.name FROM content JOIN user ON content.userId=user.id

위의 상황과 반대의 입장이지만, 사실 생각해보면 title도 있고 user.name 모두 있는 경우를 말하는 것이겠다. 그래서 따로 Right, Left Join을 따로 쓰지 않고 일반 join인 inner Join을 사용한다.

  • content의 데이터 수정을 위한 SQL
    • title이 database sprint인 content 데이터에서 body database is very easy로 수정한다.
UPDATE content SET body='database is very easy' WHERE title='database sprint'
  • content의 데이터를 추가하기 위한 SQL
    • duhyunkim이 작성한 컨텐츠를 추가하고 제목과 본문은 자유이다.(duhyunkim의 아이디는 1)
INSERT INTO content (title, body, userId) VALUES('참', '재미있네', 1)
 mysql> select * from content;
+----+-----------------+------------------+---------------------+--------+
| id | title           | body             | created_at          | userId |
+----+-----------------+------------------+---------------------+--------+
|  1 | database sprint | database is easy | 2022-03-08 11:09:08 |      1 |
|  2 | deploy sprint   | deploydeploy     | 2022-03-08 11:09:08 |   NULL |
|  3 | first project   | happyhacking     | 2022-03-08 11:09:08 |   NULL |
+----+-----------------+------------------+---------------------+--------+
3 rows in set (0.00 sec)

사실 맨처음에 생각한 부분은 user와 join을 해야하는 부분에 고민이 많았다. 하지만, content에는 userId를 참조하고 있는 Foreign Key가 있기 때문에 content의 userId에 값만 추가 해주면 되는 것이었다.

profile
궁금한걸 찾아보고 공부해 정리해두는 블로그입니다.

0개의 댓글

관련 채용 정보