본문 바로가기
MYSQL

MYSQL - ㅁㅁ별로 묶어서 Group by, having 작성법, 서브 쿼리 Sub Query

by 하니__ 2024. 5. 14.

 
author_lname 별로 몇권의 책을 썼는지,
author_lname과 책의 권수를 보여달라
 
라는 질문이 있을때
 

group by

를 사용 하면 되겠다
 
우선 select 부분에서
author_lname과 책의 권수를 카운트 해야하겠고
마지막에 그룹바이를 해준다

select author_lname , count(author_lname)as 'Book_cnt'
from books
group by author_lname;

이렇게 하면 lname이 중복되는 결과값들이 뭉쳐서 카운트 해주게 된다

 
 
 

having 사용법

 
년도별 stock_quantity 의 평균값이 70보다 큰 책들의
년도와 평균값을 보여달라
라는 질문이 왔을때

select released_year , avg(stock_quantity) avg
from books
group by released_year
where avg > 70;

라고 생각하고 적었는데
에러가 나오게 된다
 
문제는
where라고 적은 부분이 group by 되기 전의 위치라는것
그래서 이 때는
where가 아니라

select released_year , avg(stock_quantity) avg
from books
group by released_year having avg > 70
order by avg;

having을 적어줘야 한다

 
그렇다면
출판년도가 2000년 이상인 데이터에서
년도별 stock_quantity의 평균값이 70보다 큰 책들의
년도와 평균값을 보여달라
 
질문이 이렇게 바뀌었다면 어떨까

select released_year , avg(stock_quantity) avg
from books
where released_year > 2000
group by released_year having avg > 70
order by avg;

이때는 웨어가 그룹바이보다 먼저 나올수 있게 되어 가능해진다
웨어는 그룹바이보다 뒤에 나올수 없다
지문을 잘 읽어보면
그룹바이가 '가지고있는 조건'이라서
having 이라고 생각하자
 
 
 
 

Sub Query

 
 
페이지수가 가장 긴 책의 제목은 무엇?
이라는 지문이 있다면
 
이전까지는

select *
from books
order by pages desc
limit 1;

이 처럼 오더바이와 desc로 내림차순 정렬을 한후에
리밋으로 하나의 행만을 나오게끔 했다

 
하지만 다른 방법도 있다
 
 

select max(pages)
from books;

이렇게 입력하면 위에서의 결과와는 달리
행이 아니라 페이지의 최대값만을 알려주게 된다

그렇다면
 

select *
from books
where pages = 634;

라고 쓰게 된다면?

 
행을 가져올 수 있게된다
그렇다면 저 634라는 수치를 알기 위해
이 쿼리를 매번 2번씩 써줘야 할까
그래서 나오게 된게 서브 쿼리다
 
일단 위의 씌여진 일반명령문을 쿼리 라고 하는데
서브 쿼리는
그 쿼리 안에 또 다른 쿼리를 말하는데
 
634 대신에
저 위의 select max(pages) from books 를
괄호로 묶어 넣어주는 것을 말한다

select *
from books
where pages = (select max(pages) from books);

결과는 같게 된다