10월 15일 (화) [그룹스터디]
[LV1 SELECT] Python 개발자 찾기
/*
https://school.programmers.co.kr/learn/courses/30/lessons/276013
LV1 SELECT
Python 개발자 찾기
DEVELOPER_INFOS 테이블에서 Python 스킬을 가진 개발자의 정보를 조회하려 합니다.
Python 스킬을 가진 개발자의 ID, 이메일, 이름, 성을 조회하는 SQL 문을 작성해 주세요.
결과는 ID를 기준으로 오름차순 정렬해 주세요.
*/
SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPER_INFOS
WHERE SKILL_1 = 'PYTHON' OR SKILL_2 = 'PYTHON' OR SKILL_3 = 'PYTHON'
ORDER BY ID;
SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPER_INFOS
WHERE 'Python' IN (SKILL_1, SKILL_2, SKILL_3)
ORDER BY ID;
-- 키포인트 : WHERE 절 조건문에 "... OR ... OR ..." 대신 "... IN (...)"으로 사용 가능
10월 16일 (수) [그룹스터디]
[LV3 JOIN] 있었는데요 없었습니다
/*
https://school.programmers.co.kr/learn/courses/30/lessons/59043
LV3 JOIN
있었는데요 없었습니다
관리자의 실수로 일부 동물의 입양일이 잘못 입력되었습니다.
보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회하는 SQL문을 작성해주세요.
이때 결과는 보호 시작일이 빠른 순으로 조회해야합니다.
*/
SELECT I.ANIMAL_ID, I.NAME
FROM ANIMAL_INS I
JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID -- I.DATETIME : 보호시작일, O.DATETIME : 입양일
WHERE I.DATETIME > O.DATETIME
ORDER BY I.DATETIME; -- 입양일 빠른순(오름차순) 정렬 (ORDER BY 에 DESC 붙여서 틀렸음)
-- 키포인트 : 같은 명칭인 컬럼의 서로 다른 내용
[LV2 SELECT] 재구매가 일어난 상품과 회원 리스트 구하기
/*
https://school.programmers.co.kr/learn/courses/30/lessons/131536
LV2 SELECT
재구매가 일어난 상품과 회원 리스트 구하기
ONLINE_SALE 테이블에서 동일한 회원이 동일한 상품을 재구매한 데이터를 구하여,
재구매한 회원 ID와 재구매한 상품 ID를 출력하는 SQL문을 작성해주세요.
결과는 회원 ID를 기준으로 오름차순 정렬해주시고
회원 ID가 같다면 상품 ID를 기준으로 내림차순 정렬해주세요.
*/
SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(PRODUCT_ID) >= 2
ORDER BY USER_ID, PRODUCT_ID DESC;
-- 키포인트 : GROUP BY 기준을 2개 이상 설정 가능
[LV2 GROUP BY] 조건에 맞는 사원 정보 조회하기
/*
https://school.programmers.co.kr/learn/courses/30/lessons/284527
LV2 GROUP BY
조건에 맞는 사원 정보 조회하기
HR_DEPARTMENT, HR_EMPLOYEES, HR_GRADE 테이블에서 2022년도 한해
평가 점수가 가장 높은 사원 정보를 조회하려 합니다.
2022년도 평가 점수가 가장 높은 사원들의 점수, 사번, 성명, 직책, 이메일을 조회하는 SQL문을 작성해주세요.
2022년도의 평가 점수는 상,하반기 점수의 합을 의미하고, 평가 점수를 나타내는 컬럼의 이름은 SCORE로 해주세요.
*/
-- ORDER BY 절 & LIMIT 함수
SELECT SUM(SCORE) AS SCORE, E.EMP_NO, EMP_NAME, POSITION, EMAIL
FROM HR_EMPLOYEES E
JOIN HR_GRADE G
ON E.EMP_NO = G.EMP_NO
GROUP BY E.EMP_NO
ORDER BY SUM(SCORE) DESC
LIMIT 1;
-- HAVING 절 & MAX() 함수
SELECT SUM(SCORE) AS SCORE, G.EMP_NO, EMP_NAME, POSITION, EMAIL
FROM HR_GRADE G
JOIN HR_EMPLOYEES E
ON G.EMP_NO = E.EMP_NO
WHERE YEAR = 2022
GROUP BY E.EMP_NO
HAVING SUM(SCORE) = (
SELECT MAX(R.RESULT) FROM (
SELECT SUM(SCORE) AS RESULT, EMP_NO
FROM HR_GRADE
GROUP BY EMP_NO
) AS R
);
-- JOIN 절 & RANK() 함수
SELECT G.SCORE, G.EMP_NO, E.EMP_NAME, E.POSITION, E.EMAIL
FROM HR_DEPARTMENT AS D
JOIN HR_EMPLOYEES AS E
ON D.DEPT_ID = E.DEPT_ID
JOIN (
SELECT EMP_NO, SCORE, RANK() OVER (ORDER BY SCORE DESC) AS RANKING
FROM (
SELECT EMP_NO, SUM(SCORE) AS SCORE
FROM HR_GRADE
WHERE YEAR = 2022
GROUP BY EMP_NO
) AS TEMP
) AS G
ON E.EMP_NO = G.EMP_NO
WHERE G.RANKING = 1
ORDER BY G.SCORE DESC;
-- 키포인트 : ORDER BY & LIMIT을 사용하면 가장 높은 평가점수가 2개 이상일 경우 기준이 모호해짐.
-- MAX() 함수 혹은 RANK() 함수를 사용하면 해결 가능
[LV2 GROUP BY] 물고기 종류 별 잡은 수 구하기
/*
https://school.programmers.co.kr/learn/courses/30/lessons/293257
LV2 GROUP BY
물고기 종류 별 잡은 수 구하기
FISH_NAME_INFO에서 물고기의 종류 별 물고기의 이름과 잡은 수를 출력하는 SQL문을 작성해주세요.
물고기의 이름 컬럼명은 FISH_NAME, 잡은 수 컬럼명은 FISH_COUNT로 해주세요.
결과는 잡은 수 기준으로 내림차순 정렬해주세요.
*/
SELECT COUNT(*) AS FISH_COUNT, FISH_NAME -- 잡은 수 : FISH_INFO의 행 수
FROM FISH_INFO F
JOIN FISH_NAME_INFO FN
ON F.FISH_TYPE = FN.FISH_TYPE
GROUP BY FISH_NAME
ORDER BY FISH_COUNT DESC;
-- 키포인트 : COUNT() 함수에 넣을 값 구분
[LV1 SELECT] 조건에 부합하는 중고거래 댓글 조회하기
/*
https://school.programmers.co.kr/learn/courses/30/lessons/164673
LV1 SELECT
조건에 부합하는 중고거래 댓글 조회하기
USED_GOODS_BOARD와 USED_GOODS_REPLY 테이블에서
2022년 10월에 작성된 게시글 제목, 게시글 ID, 댓글 ID,
댓글 작성자 ID, 댓글 내용, 댓글 작성일을 조회하는 SQL문을 작성해주세요.
결과는 댓글 작성일을 기준으로 오름차순 정렬해주시고,
댓글 작성일이 같다면 게시글 제목을 기준으로 오름차순 정렬해주세요.
*/
SELECT TITLE, B.BOARD_ID, REPLY_ID, R.WRITER_ID, R.CONTENTS, DATE_FORMAT(R.CREATED_DATE, '%Y-%m-%d')
FROM USED_GOODS_REPLY AS R
JOIN USED_GOODS_BOARD AS B
ON R.BOARD_ID = B.BOARD_ID
WHERE B.CREATED_DATE BETWEEN '2022-10-01' AND '2022-10-31'
ORDER BY R.CREATED_DATE, TITLE;
SELECT B.TITLE,B.BOARD_ID,R.REPLY_ID,R.WRITER_ID,R.CONTENTS,DATE_FORMAT(R.CREATED_DATE,'%Y-%m-%d') AS CREATED_DATE
FROM USED_GOODS_BOARD AS B
JOIN USED_GOODS_REPLY AS R
ON R.BOARD_ID = B.BOARD_ID
WHERE DATE_FORMAT(B.CREATED_DATE,'%Y-%m') = '2022-10'
ORDER BY R.CREATED_DATE,B.TITLE;
-- 키포인트1 : JOIN한 후 같은 컬럼명의 데이터 구분
-- 키포인트2 : WHERE 절에 기간 설정 시 BETWEEN ... IN 혹은 DATE_FORMAT 사용