데이터베이스 입문 수업을 듣고 중요한 내용을 정리했습니다.
개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.
서브쿼리 사용법(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 = '여성신발'
```
참고 :
```
- 참고(다양한 서브쿼리 삽입 위치)
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;
```
참고:
```
'Database' 카테고리의 다른 글
MySQL - 데이터 분석과 SQL 문법 (0) | 2021.11.12 |
---|---|
MySQL - 실전 크롤링과 데이터베이스 (2) | 2021.11.11 |
MySQL - Foreign Key (0) | 2021.11.11 |
MySQL - pandas & pymysql 라이브러리 (0) | 2021.11.10 |
MySQL - 파일로 실행하는 SQL (0) | 2021.11.10 |
댓글