본문 바로가기
MySQL/실습문제

[EXERCISES] 17. 실습예제(7-2)

by Fletcher 2024. 8. 10.

 

반갑습니다

저번 포스트에 이어서 실습예제 7-2입니다

 

이번 문제에서는 샘플 데이터로

customers 테이블과 orders 테이블을 사용합니다 ^^

하단에 파일 첨부합니다

customers.sql
0.01MB
orders.sql
0.06MB

 

 

 

 

 

 

customers 테이블의 스키마 구조와 데이터 정보입니다 ^^

 

 

 

 

 

orders 테이블의 스키마 구조와 데이터 정보입니다 ^^

 

 

 

 

 

 

 

 

예제6.

first_name에 문자열 'ty'가 포함되어 있

회원의 주문내역을 조회하시오.

 

 

SELECT * FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
WHERE c.first_name LIKE '%ty%';

 

WHERE 구에 LIKE 키워드와 메타문자를 사용하여

특정 문자가 포함된 문자열을 갖는 레코드를 모두 조회해주시면 되겠습니다 ^^

 

 

 

 

 

 

예제7.

amount 값이 300이상이고 500이하인 주문내역에

해당 주문자의 이메일 정보를 추가하여 조회하시오.

 

 

SELECT o.*, c.email
FROM orders o
JOIN customers c ON o.customer_id = c.id
WHERE amount BETWEEN 300 AND 500;

 

WHERE 조건식 지정시 특정 조건이 만약 일정 값 범위 내부를 가리킨다면

두 개의 조건식(amount > 300, amount < 500)을 AND로 연결하는 것보다

BETWEEN 키워드를 이용하는 것이 더 효율적입니다 ^^

 

 

 

 

 

 

 

예제8.

각 고객별 주문 수를 조회하되, 고객의 이름과 이메일 정보를 포함하시오.

 

 

SELECT c.first_name, c.last_name, email, COUNT(o.id)
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
GROUP BY email;

 

이번에도 마찬가지로 그냥 JOIN 연산이 아니라, LEFT JOIN 연산을 적용했는데요

고객 정보는 존재하지만 해당 고객이 한 번도 주문을 한 적이 없을 수 있기 때문입니다 ^^

 

 

 

 

 

 

 

 

예제9.

각 고객별로 주문 금액 평균이 300 달러 이상인 데이터를 조회하되

이메일, 이름, 평균금액까지 포함하시오.

 

 

SELECT c.email, c.first_name, c.last_name, AVG(amount) AS avg_amount
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
GROUP BY email
HAVING AVG(amount)>300;

 

이번에는 HAVING 키워드를 적용하여,

그룹화 이후에 특정 조건을 만족하는 데이터만 조회하도록 하였습니다 ^^

 

SQL문의 내부 처리 순서가 다음과 같았죠 ^^?

WHERE → GROUP BY → HAVING → SELECT → ORDER BY

 

때문에 그룹화 이후에 조건을 적용시키려면

WHERE가 아니라 HAVING을 사용해야 했습니다 ^^!

 

 

 

 

 

예제10.

각 고객별로 주문 금액의 최대값을 구하고

이 값이 600 이상인 데이터만 내림차순으로 조회하시오.

 

 

SELECT c.id, c.first_name, c.last_name, c.email, max(o.amount) as max_amount
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
GROUP BY email
HAVING max(o.amount)>600
ORDER BY max(amount) DESC;

 

일단 customers 테이블과 orders 테이블을 JOIN 연산으로 합치되,

고객 정보만 있고 주문은 한 건도 안 했을 수도 있으므로 LEFT JOIN 연산을 수행해줍니다 ^^

 

그리고 GROUP BY 키워드를 이용해 email을 기준으로 묶어주고

각 고객별로 주문금액의 최대치가 몇인지 max() 함수를 이용해 집계를 해줍니다 ^^

 

그리고 문제의 조건과 같이 HAVING 키워드를 이용해

최대 주문금액이 600 이상인 사용자만 조건 조회하여

최대 주문금액을 기준으로 내림차순 정렬을 해주면 되겠습니다 ^^!

 

 

 

이제 3문제만 남았는데요

다음 포스트에서 마저 풀고 실습예제 7을 마무리하도록 하겠습니다 ^^!

'MySQL > 실습문제' 카테고리의 다른 글

[EXERCISES] 18. 실습예제(7-3)  (0) 2024.08.10
[EXERCISES] 16. 실습예제(7-1)  (0) 2024.08.10
[EXERCISES] 15. 실습예제(6-4)  (0) 2024.08.10
[EXERCISES] 14. 실습예제(6-3)  (0) 2024.08.10
[EXERCISES] 13. 실습예제(6-2)  (0) 2024.08.08