코린이의 소소한 공부노트

[MySQL] SUB QUERY 본문

Back-End

[MySQL] SUB QUERY

무지맘 2023. 4. 4. 14:48

[예시에 쓰이는 테이블]


# student_info에서 idols별로 몇 명이 좋아하는지 추려서
# 아이돌 이름이랑 좋아하는 학생수를 구한 다음
# 좋아하는 학생수에 따라 분류해줘
select *, case when cnt>40 then '인기 아이돌' else '유명 아이돌' end as '아이돌 분류'
from (
    select idols, count(*) cnt
    from student_info
    group by idols
) idolcount; # from절에 사용한 서브쿼리의 이름

# 결과
idols		cnt	아이돌 분류
ITZY		30	유명 아이돌
G-idle 		31	유명 아이돌
LESSERAFIM 	54	인기 아이돌
IVE		44	인기 아이돌
NMIXX		31	유명 아이돌
New Jeans	49	인기 아이돌
Aespa		61	인기 아이돌

[sub query, 서브 쿼리]

1. 쿼리 내부에 있는 또 다른 쿼리를 의미한다.

- 기존 데이터를 이용해 새로운 데이터를 만들어 활용하거나, 상수로만 표현할 수 없는 조건절이 필요한 경우에 쓰인다.

 

2. 서브 쿼리는 SELECT, FROM, WHERE 어디에나 사용할 수 있다.

- select절에 이용된 서브 쿼리는 스칼라 서브쿼리(scalar sub-query)라고도 한다. 단일 값을 반환하기 때문이다.

- from절에 이용된 서브 쿼리는 인라인 뷰(inline view)라고도 한다. 내부에 테이블을 새로 만들었다고 보기 때문이다.

- where절에 이용된 서브 쿼리는 중첩 서브쿼리(nested sub-query)라고도 한다. 조건절을 쿼리로 표현하면서 쿼리가 중첩됐다고 보기 때문이다.

 

3. 서브 쿼리의 시작과 끝은 소괄호 ()로 감싸야한다..

- 소괄호로 감싼 후 뒤에 서브 쿼리의 별명을 붙여줘야 한다서브쿼리의 내용과 연관 있는 이름을 짓는 게 도움이 된다.

 

4. 서브 쿼리에는 order by를 사용할 수 없다.

- 최종 출력이 아니기 때문에 굳이 정렬할 필요가 없기 때문이다.


[where절에 사용한 서브 쿼리 예시]

# 수학 성적이 A인 학생들의
# 한달 정보를 모두 보여줘
select * from student_monthly m
where m.hakbeon in (select g.hakbeon from student_grade g where Math='A');

# 결과
hakbeon	book	volunteer	youtube	allowance
10101	2	39		124	170000
10105	9	39		148	60000
10115	8	43		206	120000
10119	6	9		205	200000
10201	4	29		13	140000
...

- where절 서브 쿼리가 많이 쓰이는 편이다.


[select절에 사용한 서브 쿼리 예시] 

# 국어 영어 모두 A인 학생들의 과목 점수와
# 한달에 읽은 책의 양을 함께 보여줘
select g.*, (select book from student_monthly m where g.hakbeon=m.hakbeon) as '책', '권' as '단위'
from student_grade g
where Korean='A' and English='A';

# 결과
hakbeon	Korean	English	Math	책	단위
10111	A	A	B	3	권
10402	A	A	A	10	권
10511	A	A	C	7	권
10513	A	A	D	10	권
...

- select절 서브 쿼리 대신 join을 더 많이 사용한다.

'Back-End' 카테고리의 다른 글

[MySQL] LIKE, NOT LIKE  (0) 2023.03.31
[MySQL] CASE WHEN, THEN, ELSE  (0) 2023.03.29
[MySQL] INSERT, UPDATE, DELETE  (0) 2023.03.29
[MySQL] COUNT, GROUP BY, HAVING  (0) 2023.03.28
[MySQL] ORDER BY, LIMIT  (0) 2023.03.18