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);
결과는 같게 된다
'MYSQL' 카테고리의 다른 글
MYSQL - CASE문 작성법, if( ) 사용법 (0) | 2024.05.14 |
---|---|
MYSQL - null 확인법 is null( ), null 처리법 ifnull( ) (0) | 2024.05.14 |
MYSQL - 숫자를 세는 count( ),합산sum( ), 평균avg( ), 최대/최소값 max( ),min( ) (0) | 2024.05.14 |
MYSQL - 원하는 조건을 '찾는' like, 중첩 and,둘 중 하나True or, 제외 not (0) | 2024.05.14 |
MYSQL - 데이터를 끊어 보여주는 Paging- limit, offset (1) | 2024.05.14 |