본문 바로가기
DB/SQL 예제

키워드 예제 3

by ssury94 2024. 11. 29.

-- 1980년 이전에 발행된 책을 가져오세요.

SELECT *
FROM books b
where released_year < 1980;

 

 

 

-- eggers 나 chabon이 쓴 책을 가져오세요.

SELECT *
FROM books b
where author_lname ='Eggers' or author_lname = 'Chabon';

 

 

더 깔끔한 코드! 항목 추가되도 수정하기도 편하고 보기도 편한 IN

SELECT *
FROM books b
WHERE author_lname in('Eggers','Chabon');

 

 

-- lahiri가 썼고, 2000년 이후에 발행된 책을 가져오세요.

SELECT *
FROM books b
where author_lname ='Lahiri' and released_year > 2000;

 

 

-- 페이지수가 100부터 200까지인 책들을 가져오세요.

SELECT *
FROM books b
WHERE pages BETWEEN 100 and 200;

 

 

-- lname이 c나 s로 시작하는 작가가 쓴 책을 가져오세요.

SELECT *
FROM books b
WHERE author_lname like 'C%'or author_lname like 'S%';

 

 

-- 제목에 스토리를 포함하면 short stories로

-- 제목이 just kids와 일치하면 menoir로

-- 제목에 heartbreaking 이 포함되어있으면 memoir로 하고

-- 그렇지 않으면 novel이라고 한다. 컬럼이름은 type

SELECT title, author_lname,
    CASE
        when title like '%story%' then 'Short Stories'
        when title ='Just kids' then 'Memoir'
        when title like '%heartbreaking%' then 'Memoir'
        else 'Novel'
   END as type
FROM books b ;

 

적절한 tap 사용으로 가독성 높이는쪽이 좋다.

 

 

-- 작가의 full name으로 각 작가별로 몇권의 책을 썼는지 개수를 나타내세요

-- 대신 1권이면 book, 2권 이상이면 books를 붙여주세요.

SELECT title,concat(author_fname,' ',author_lname)as full_name, concat(count(*),' ',if(count(*)=1,'book','books'))as volumes
FROM books b
group by full_name;

 

작동은 하였지만, Group by에는 별칭을 사용하지 않아야한다.

 

올바르지 않은 이유:

  1. 그룹화 열: GROUP BY 절에서 사용하는 열은 선택된 열과 일치해야 합니다. 그러나 full_name은 별칭으로, 직접 사용할 수 없습니다. 대신, author_fname과 author_lname을 사용해야 합니다.
  2. 집계 함수: COUNT(*)는 각 그룹의 행 수를 계산하지만, 제목(title)을 포함한 다른 열도 그룹화에 포함되어야 합니다.

다음은 수정된 쿼리입니다.

SELECT CONCAT(author_fname, ' ', author_lname) AS full_name, 
CONCAT(COUNT(*), ' ', IF(COUNT(*) = 1, 'book', 'books')) AS volumes 
FROM books b 
GROUP BY author_fname, author_lname;

* group by 옆 컬럼은 2개여도 가능두 컬럼을 붙여서 연산해준다.

 

 

 

-- 년도별 책의 개수와 평균 페이지수를 나타내세요. 년도로 정렬하세요.

SELECT released_year as year ,count(*)as '# books', avg(pages)as avg_pages
FROM books b
group by released_year
order by released_year ;