Personal Research

MySQL 서브쿼리

마손리 2023. 3. 31. 00:31

MySQL의 서브쿼리에 대해 연습겸 실험을 진행 해봣다.

 

실험 예제

위의 그림과 같이 데이터베이스에 테이블들을 생성 및 관계를 형성해주었다.

 

category의 name이 'homework'인 content의 title, created_at 그리고 user의 name을 찾기위한 쿼리를 작성하려고한다.

예상 답안

 

 

1. Join 활용

select user.name as username, content.title, content.created_at from user
inner join content on user.id = content.userid
inner join content_category on content.id = content_category.contentid
inner join category on content_category.categoryid = category.id
where category.name = "homework"

서브쿼리를 활용하기전에 일단 가장 기본적인 방식인 Join으로 작성해봣다. inner join을 활용하여 겹치는 요소들을 연결한뒤 category.name에 구하려는 카테고리 이름을 넣어 원하는 데이터들을 얻었다.

 

 

2. 그냥 where에 늘여쓰기

select user.name as username, content.title, content.created_at 
from user, content, content_category, category
where user.id=content.userid 
and content.id = content_category.contentid 
and content_category.categoryid = category.id 
and category.name = "homework";

이것도 특별할것 없는 방식이다. from절에 필요한 테이블들을 불러온후 where절에 해당 결과에 만족하는 식을 만들어 결과를 얻었다. 

 

크게 나쁘지는 않았지만 Join과 비교하자면 관계도가 복잡해질수록 사용하기 복잡햇고 가독성도 좋지 않아 보인다.

 

 

3. Inline View Subquery (From절의 서브쿼리)

select user.name as username, C.title, C.created_at 
from user, 
(select title, created_at, userid,id from content) as C, 
(select contentid, categoryid from content_category) as A, 
(select id, name from category) as B
where user.id = C.userid 
and C.id = A.contentid
and A.categoryid = B.id
and B.name = "homework"

인라인 뷰 서브쿼리를 간단히 설명하자면 from절에 쿼리문을 새로 작성하여 새로운 테이블을 임시적으로 만든뒤 변수에 할당하여 사용하는 방식이다. 

 

이 방식 또한 나쁘지 않았다. 2번의 방식과 굉장히 비슷하지만 내가 필요한 column들만 지정해서 불러와 코드를 짜기에도 편리했고 가독성도 매우 나아진 모습을 보인다.

 

 

4. Nested Subquery (Where절의 서브쿼리)

select user.name as username, content.title, content.created_at from user, content
where user.id=content.userid and content.id 
in (select contentid from content_category where categoryid 
in (select id from category where name="homework"))

네스티드 서브쿼리는 인라인 뷰와는 조금 다르게 where절에 새로운 쿼리문을 작성하는 방식이다.

 

결과 부터 말하자면 정말 별로다...쿼리문을 짜기에도 복잡했고 가독성도 좋지 않다... 테이블간의 관계가 복잡해질수록 더 별로일거 같다... 

 

 

마무리

위의 예제들을 모두 비교해 종합적으로 평가해보자면 Join, Inline View Subquery, 그냥 where에 늘여쓰기, Nested Subquery 순으로 실용성이 좋았다.

 

물론 상황에 따라 알맞은 쿼리문이 있겠지만 현재 예제와 같이 여러 관계가 얽혀있는 상황에서 부분적인 데이터만을 탐색할때에는 Join과 Inline View Subquery가 가장 실용적으로 보인다.

'Personal Research' 카테고리의 다른 글

SecurityContextHolder  (0) 2023.05.18
BindException과 MethodArgumentNotValidException  (0) 2023.05.10
Mysql, safe update mode  (0) 2023.03.31
실험을 통해 깨닳은 추상화의 중요성  (0) 2023.03.11