인프런 강의의 예제나 데이터 테이블 문제를 통해 문법을 복기하는 편이다.
특히, PROGRAMMERS에서 푼 문제들이 너무 도움이 됐다! 난 역시 실전교육파
- 상반기에 판매된 아이스크림의 맛을 총주문량을 기준으로 내림차순 정렬하고 총주문량이 같다면 출하 번호를 기준으로 오름차순 정렬 (테이블명 FIRST_HALF)
SELECT FLAVOR
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID;
- ONLINE_SALE테이블에서 동일한 회원이 동일한 상품을 재구매한 데이터를 구하여, 재구매한 회원 ID와 재구매한 상품 ID를 출력하는 SQL문을 작성. 결과는 회원 ID를 기준으로 오름차순 정렬. 회원 ID가 같다면 상품 ID를 기준으로 내림차순 정렬 (동일한 날짜, 회원 ID, 상품 ID 조합은 하나의 판매 데이터만 존재함)SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
-- 중복조건을 위해서는 그룹으로 엮은 것이 최소 2번 겹쳐야 함
HAVING COUNT(ONLINE_SALE_ID) >= 2
ORDER BY USER_ID, PRODUCT_ID DESC;
3. ONLINE_SALE, OFFLINE_SALE 테이블의 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량을 출력. OFFLINE_SALE테이블의 판매 데이터의 USER_ID값은 NULL 로 표시. 결과는 판매일을 기준으로 오름차순 정렬, 판매일이 같다면 상품 ID를 기준으로 오름차순, 상품ID까지 같다면 유저 ID를 기준으로 오름차순 정렬해라. (단, USER_ID는 INTGER이다)
테이블은 2번 테이블과 동일하여 사진 생략
--date_format을 통해 반드시 추출할 byte를 구한다.
-- 년도함수 4자리는 ‘%Y’는 반드시 대문자 (2자리면 %y)
SELECT DATE_FORMAT(sales_date,'%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE sales_date BETWEEN '2022-03-01' AND '2022-03-31'
UNION ALL
-- NULL이라는 별칭을 붙여줘야함 (내가 아는 NULL 개념X 별칭O)
SELECT sales_date, product_id, NULL AS user_id, sales_amount FROM OFFLINE_SALE
WHERE sales_date BETWEEN '2022-03-01' AND '2022-03-31'
ORDER BY sales_date, product_id ASC, user_id ASC;
4. ANMIAL_INS가 테이블 명이고, 동물 보호소에 들어온 동물 중 젊은 동물의 아이디와 이름을 조회하는 SQL 문을 작성. 이때 결과는 아이디 순으로 조회.
SELECT animal_id, name
FROM ANMIAL_INS
-- aged는 늙었다는 의미
WHERE intake_condition != 'Aged'
ORDER BY animal_id;
5. 동물 보호소에 가장 먼저 들어온 동물의 이름을 조회하는 SQL 문을 작성
테이블은 4번 테이블과 동일하여 사진 생략
SELECT name
FROM ANIMAL_INS
-- 집계함수는 반드시 서브쿼리 처리
WHERE datetime IN (SELECT MIN(datetime) FROM ANIMAL_INS);
6. 2021에 가입하고 20_29인 회원 수는 ?
SELECT COUNT(*) as users
FROM USER_INFO
WHERE year(joined) = 2021 AND age BETWEEN 2 AND 29 ;
7. 가장 최근 들어온 동물의 시간은?
-- datetime을 별칭으로 시간이라 명명필요
SELECT max(datetime) AS '시간'
FROM ANIMAL_INS;
8. (인프런 강의 문제 테이블 중~) 음료명, 가격, 최대 가격과의 차이
--1. 음료명, 가격, 최대 가격과의 차이
SELECT
name AS "음료명",
price AS "가격",
price - (SELECT MAX(price) FROM beverages) AS "최대 가격과의 차이"
FROM
beverages
;
9. (인프런 강의 문제 테이블 중~) 사진 1에 달린 모든 댓글과 작성자 조회 (INNER JOIN)
SELECT comments.body(모든댓글)
users.nickname(작성자) FROM comments
-- INNER JOIN : 두 테이블의 겹치는 데이터를 가져옴
JOIN users ON
users.id = comments.user_id
WHERE comments.photo_id = 1 (사진1)
;
10. (인프런 강의 문제 테이블 중~) 사진2 좋아요한 사용자 닉네임과 그 사진의 파일명
SELECT user.nickname(닉네임)
photos.filenmae(파일명) FROM likes(좌측T)
-- JOIN 1회
JOIN users ON (우측T)
users.id = likes.user_id
-- JOIN 2회
JOIN photos ON
photos.id = likes.photos_id
WHERE photo.id = 2 (사진2)
;
11. ANIMAL_OUTS 테이블에서 시간대별 입양 발생 리스트 조회하기
--PM수준에선 이정도가 합리적..
SELECT 0 hour, SUM(IF(HOUR(DATETIME) = 0,1,0 COUNT FROM ANIMAL_OUTS
UNION
1~23 HOUR까지 입력
12. PRODUCT 테이블에서 만원 단위의 가격대 별로 상품 개수를 출력하는 SQL 문을 작성해라. 컬럼명은 각각 컬럼명은 PRICE_GROUP, PRODUCTS로 지정하고 가격대 정보는 각 구간의 최소금액(10,000원 이상 ~ 20,000 미만인 구간인 경우 10,000)으로 표시. 결과는 가격대를 기준으로 오름차순 정렬해라.
-- 4자리에서 절삭 그니까 천원자리수는 제외하기
-- 원하는 대로 컬럼명 짓기
SELECT TRUNCATE(price, -4) AS price_group, COUNT(product_id) AS products
FROM PRODUCT
-- 그룹도 4자리 절삭 그니까 천원자리수 제외
GROUP BY TRUNCATE(price, -4)
-- 오름차순 정렬
ORDER BY price_group ASC;
'분석 역량 > 데이터 분석(SQL)' 카테고리의 다른 글
[R] 통계 프로그램 R studio 사용하기 (1) (0) | 2023.01.06 |
---|---|
[SQL] MYSQL 알아보기 (0) | 2023.01.03 |
[SQL] 자주 쓰지만 헷갈리는! SQL 구문 정리하기 (0) | 2022.12.24 |
PM이 데이터를 알아야 하는 이유 (0) | 2022.12.17 |
[ SQL ] postgreSQL : 불필요한 DB삭제하기 (데이터베이스를 다른 사용자가 액세스하기 시작했습니다 뜨는 경우) (0) | 2022.12.16 |