본문 바로가기
Database

MySQL - 서브쿼리 활용

by DGK 2021. 11. 15.

 

데이터베이스 입문 수업을 듣고 중요한 내용을 정리했습니다.
개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.

 

서브쿼리 사용법(MySQL)

서브쿼리는 SQL 구문안에 포함되어 있는 SQL 구문으로 테이블 간의 검색 시, 검색범위를 좁히는 기능으로 사용한다.

 

MySQL SubQuery

예제를 통해, 서브쿼리와 JOIN 구문의 사용법을 비교하고자 한다. (동일한 검색 결과)

 

 

  • 서브카테고리가 '여성신발'인 상품의 타이틀만을 가져오기

*서브쿼리를 사용해서 작성하는 방법

SELECT title FROM items WHERE item_code IN (SELECT item_code FROM ranking WHERE sub_category = '여성신발')

 

*JOIN SQL을 사용해서 작성하는 방법

SELECT title FROM items INNER JOIN ranking ON item.item_code = ranking.item_code WHERE ranking.sub_category = '여성신발'

 

 

 

  • 서브카테고리가 '여성신발'인 상품 중 할인가격이 가장 높은 상품의 할인가격 가져오기

*서브쿼리를 사용해서 작성하는 방법

SELECT MAX(dis_price) FROM items WHERE item_code IN (SELECT item_code FROM ranking WHERE sub_category = '여성신발')

 

*JOIN SQL을 사용해서 작성하는 방법

SELECT MAX(items.dis_price) FROM items INNER JOIN ranking ON items.item_code = ranking.item_code WHERE ranking.sub_category = '여성신발'

 

```

참고 :

items TABLE
ranking TABLE

```

 

 

 

  • 참고(다양한 서브쿼리 삽입 위치)
SELECT category_id, COUNT(*) AS film_count FROM film_category WHERE film_category.category > (SELECT category.category_id FROM category WHERE category.name = 'Comedy') GROUP BY film_category.category_id

 

(SELECT category.category_id FROM category WHERE category.name = 'Comedy') 코드의 결과 값은

특정 id 값이다.

즉, 앞선 코드로 가져온 id 값 보다 큰 필름 카테고리의 id 값을 검색해서 가져오는 SQL 구문이다.

 

SELECT a, b, c FROM (SELECT * FROM atoz_table)

FROM 절 뒤에 서브쿼리를 삽입할 수도 있다.

즉, (SELECT * FROM atoz_table) 코드의 결과에서 a, b, c 컬럼의 데이터를 가져오는 것이다.

 

 

 

  • 다양한 복합쿼리 연습문제

1. 메인 카테고리 별로 할인 가격이 10만원 이상인 상품이 몇 개 있는지를 출력하기

SELECT main_category, COUNT(*) FROM ranking WHERE item_code IN (SELECT item_code FROM items WHERE dis_price >= 100000) GROUP BY main_category;

 

2. 메인 카테고리, 서브 카테고리에 대해 평균할인 가격과 평균할인율을 출력하기

SELECT ranking.main_category, ranking.sub_category, AVG(items.dis_price), AVG(items.discount_percent) FROM items INNER JOIN ranking ON items.item_code = ranking.item_code GROUP BY ranking.main_category, ranking.sub_category;

 

3. 판매자별, 베스트상품 개수, 평균할인가격, 평균할인율을 베스트상품 개수가 높은 순으로 출력하기

SELECT items.provider, COUNT(*), AVG(items.dis_price), AVG(items.discount_percent) FROM items INNER JOIN ranking ON items.item_code = ranking.item_code GROUP BY items.provider ORDER BY COUNT(*) DESC;

 

4. 각 메인 카테고리에서 베스트상품 개수가 20개 이상인 판매자의 판매자별 평균할인가격, 평균할인율,

    베스트상품 개수 출력하기

SELECT ranking.main_category, items.provider, AVG(items.dis_price), AVG(items.discount_percent), COUNT(*) FROM items INNER JOIN ranking ON items.item_code = ranking.item_code GROUP BY items.provider, ranking.main_category HAVING COUNT(*) >= 20;

 

```

참고:

items TABLE
ranking TABLE

```

 

'Database' 카테고리의 다른 글

MySQL - 데이터 분석과 SQL 문법  (0) 2021.11.12
MySQL - 실전 크롤링과 데이터베이스  (1) 2021.11.11
MySQL - Foreign Key  (0) 2021.11.11
MySQL - pandas & pymysql 라이브러리  (0) 2021.11.10
MySQL - 파일로 실행하는 SQL  (0) 2021.11.10

댓글