위 문제는 desciption이 'boring'한 영화와 id컬럼이 홀수인 영화를 추출하는 문제이다.
간단하게 where 절만으로 해결할 수 있었다.select id, movie, description, rating from cinema where description <> 'boring' #해당 컬럼에서 특정 키워드 제외하기 and id%2 <> 0 #홀수 id만 추출하기 위해 id를 2로 나누었을 때 나머지가 존재하면 홀수이기 때문에 나머지가 0과 같지 않다. order by 4 desc #정렬조건 'rating'의 내림차순
![]()
판매 금액의 평균을 구하자!
위 문제는 기간별로 판매단가가 다르기 때문에 팔린 금액이 해당 기간에 적정한 금액인지를 두 테이블을 조인하여 집계하는 문제이다. 여기서 팔리지 않은 상품도 있기 때문에 IFNULL함수를 이용해서 집계되지 않는 값은 0으로 호출해야한다.SQL 읽는 순서에 따른 풀이
From -> Where -> group by -> Select -> order by#FROM : prices 테이블에 unitssold 테이블 left join #WHERE(on, and절) : 기본키인 product_id로 두 테이블 기본 조인 + where이 아닌 and로 팔린 기간(purchase_date)을 가격이 산정된 기간인 start_date와 end_date사이에 존재하는 조건으로 join을 붙힌다. #-> 여기서 and절을 where로 사용하여 혼선이 왔는데 여기선 where절로 쓰면 동시에 적용하는 것이 아닌 개별적용으로 보기 때문에 정확하지 않을 수 있다. 두 조건을 모두 적용하기 위해 where절을 생략하고 join하면서 and로 두 조건이 모두 True여야 join되게 한다. #GROUP BY : 각 제품별 평균 판매 금액이기 때문에 첫 번째 컬럼 1을 기입 #SELECT : 판매상품id와 가격과 수량의 곲을 수량으로 나눈 값(평균가격)을 찾고 해당 인스턴스에 판매기록이 없다면 join이 되지않고 prices열에 판매 금액만 있기 때문에 집계 불가인 NULL로 존재한다. 하여 IFNULL을 사용하여 NULL일 때, 0으로 대치한다. SELECT p.product_id, IFNULL(ROUND(SUM(p.price*s.units)/SUM(s.units), 2), 0) average_price FROM prices p left join unitssold s ON p.product_id = s.product_id AND s.purchase_date BETWEEN p.start_date AND p.end_date GROUP BY 1;
위 문제는 프로젝트를 진행한 직원들의 연차를 프로젝트별 해당되는 직원의 연차의 평균을 구하는 문제였다. 두 개의 테이블이 있었고, employee_id가 기본키(외래키)로 사용되었다. join을 이용해서 필요한 컬럼과 집계컬럼을 호출하면 되는 문제!
select p.project_id, #project_id와 연차의 평균을 소숫점 두번째 자리까지 표시한다. ROUND(AVG(experience_years), 2) as average_years from project p left join employee e #project별로 평균연차를 구할거기 때문에 project테이블로 left join실행 on p.employee_id = e.employee_id group by 1; #project별로 볼꺼니까 1로 그룹화
안녕하세요 A08조 팀원 황인성입니다. 노션에 적힌 링크를 타고 방문했어요. 좋은 글 잘 보았습니다!