🚩 프로그래머스(programmers)에서 제공하는 SQL 문제풀기
🚩 SELECT
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/59403
2. 코드
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC; -- 또는 ORDER BY ANIMAL_ID
3. 코드 해석
해당 문제는 ANIMAL_INS
테이블에서 동물의 아이디(ANIMAL_ID
)와 이름(NAME
)을 조회하기 위해 SELECT~FROM
문을 사용하고, 이때 동물의 아이디(ANIMAL_ID
)순으로 나열해야 되므로 ORDER BY
절을 추가하여 정렬한다. ORDER BY
절에서 데이터를 오름차순으로 정렬하는 ASC
와 내림차순으로 정렬하는 DESC
가 있으며 ORDER BY
정렬의 기본값(Default
)은 ASC
이기 때문에 현재 문제에서 ASC
를 생략하고 코드를 작성해도 된다.
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/59404
2. 코드
SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME ASC, DATETIME DESC;
3. 코드 해석
해당 문제는 ANIMAL_INS
테이블에서 동물의 아이디(ANIMAL_ID
)와 이름(NAME
), 보호 시작일(DATETIME
)을 조회하기 위해 SELECT~FROM
문을 사용한다. 또한 이때 이름(NAME
)순으로 나열하면서 동시에 이름이 같은 동물 중에서 보호 시작일(DATETIME
)이 나중인 동물을 먼저 보여줘야 하므로 ORDER BY
절에 NAME ASC
(오름차순)와 DATETIME DESC
(내림차순)를 추가하여 정렬한다.
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/59036
2. 코드
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION = 'Sick'
ORDER BY ANIMAL_ID;
3. 코드 해석
해당 문제는 ANIMAL_INS
테이블에서 동물의 아이디(ANIMAL_ID
)와 이름(NAME
)을 조회하기 위해 SELECT~FROM
문을 사용한다. 또한 동물 중에 아픈 동물만(INTAKE_CONDITION = 'Sick'
)을 조회하기 위해 WHERE 조건
절을 사용한다. 추가적으로 ORDER BY
절을 추가하여 아이디(ANIMAL_ID
) 순으로 조회해야 한다.
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/59405
2. 코드
SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME ASC
LIMIT 1;
3. 코드 해석
해당 문제는 ANIMAL_INS
테이블에서 동물의 이름(NAME
)을 조회하기 위해 SELECT~FROM
문을 사용하고, ORDER BY
절을 사용하여 보호 시작일(DATETIME
)순으로 오름차순 정렬하고 이때 가장 먼저 들어온 동물 하나를 출력하기 LIMIT 1
을 추가한다. LIMIT
는 출력하는 개수를 제한하여 조회할 수 있다.
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/59037
2. 코드
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION != 'Aged'
ORDER BY ANIMAL_ID;
3. 코드 해석
해당 문제는 ANIMAL_INS
테이블에서 동물의 아이디(ANIMAL_ID
)와 이름(NAME
)을 조회하기 위해 SELECT~FROM
문을 사용한다. 또한 동물 중에 젊은 동물만(INTAKE_CONDITION != 'Aged'
)을 조회하기 위해 WHERE 조건
절을 사용한다. 추가적으로 ORDER BY
절을 추가하여 아이디(ANIMAL_ID
) 순으로 조회해야 한다.
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/59035
2. 코드
SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC;
3. 코드 해석
해당 문제는 ANIMAL_INS
테이블에서 동물의 이름(NAME
)과 보호 시작일(DATETIME
)을 조회하기 위해 SELECT~FROM
문을 사용한다. 이때 동물의 아이디(ANIMAL_ID
)역순으로 나열해야 되므로 ORDER BY
절과 내림차순의 의미인 DESC
을 추가하여 정렬한 결과를 조회한다.
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/131112
2. 코드
SELECT FACTORY_ID, FACTORY_NAME, ADDRESS
FROM FOOD_FACTORY
WHERE ADDRESS LIKE '강원도%'
ORDER BY FACTORY_ID ASC; -- 또는 ORDER BY FACTORY_ID
3. 코드 해석
해당 문제는 FOOD_FACTORY
테이블에서 강원도에 위치한 식품공장의 공장 ID(FACTORY_ID
), 공장 이름(FACTORY_NAME
), 주소(ADDRESS
)를 조회하기 위해 SELECT~FROM
문을 사용한다. 또한 강원도에 위치한 식품공장만(ADDRESS LIKE '강원도%'
)을 조회하기 위해 WHERE 조건
절을 사용한다. 이때 동물의 아이디(FACTORY_ID
)를 기준으로 오름차순 정렬을 해야 되므로 ORDER BY
절을 사용하고 오름차순의 의미인 ASC
는 생략해도 된다.
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/59034
2. 코드
SELECT *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC; -- 또는 ORDER BY ANIMAL_ID
3. 코드 해석
해당 문제는 ANIMAL_INS
테이블에서 모든 동물의 정보(*
)를 조회하기 위해 SELECT~FROM
문을 사용한다. 이때 동물의 아이디(ANIMAL_ID
)순으로 나열해야 되므로 ORDER BY
절을 사용하여 정렬하고 오름차순의 의미인 ASC
는 생략해도 된다.
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/131535
2. 코드
SELECT COUNT(USER_ID) AS USERS
FROM USER_INFO
WHERE (YEAR(JOINED)='2021') AND (AGE>=20 AND AGE<=29);
3. 코드 해석
해당 문제는 USER_INFO
테이블에서 회원의 수(COUNT(USER_ID)
)를 조회하기 위해 SELECT~FROM
문을 사용한다. 이때 2021년에 가입한 회원(YEAR(JOINED)='2021'
)중에서 나이가 20세 이상 29세 이하인 회원(AGE>=20 AND AGE<=29
) 조건을 추가하기 위해 WHERE 조건
절을 사용한다.
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/132201
2. 코드
SELECT PT_NAME, PT_NO, GEND_CD, AGE, IFNULL(TLNO, 'NONE')
FROM PATIENT
WHERE AGE<=12 AND GEND_CD='W'
ORDER BY AGE DESC, PT_NO ASC;
3. 코드 해석
해당 문제는 PATIENT
테이블에서 모든 열 이름인 환자이름(PT_NAME
), 환자번호(PT_NO
), 성별코드(GEND_CD
), 나이(AGE
), 전화번호(TLNO
)를 조회하기 위해 SELECT~FROM
문을 사용하고, 전화번호(TLNO
)가 없는 경우에는 'NONE'으로 출력하기 위해 IFNULL(열이름,대체값)
함수를 사용한다. 이때 12세 이하(AGE<=12
)인 여자환자(GEND_CD='W'
) 조건을 추가하기 위해 WHERE 조건
절을 사용한다. 또한 ORDER BY
절을 사용하여 나이(AGE
)를 기준으로 내림차순(DESC
) 정렬하고, 나이 같다면 환자 번호(PT_NO
)를 기준으로 오름차순(ASC
) 정렬한다.
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/132203
2. 코드
SELECT DR_NAME, DR_ID, MCDP_CD, DATE_FORMAT(HIRE_YMD, '%Y-%m-%d') AS HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD='CS' OR MCDP_CD='GS'
ORDER BY HIRE_YMD DESC, DR_NAME ASC;
3. 코드 해석
해당 문제는 DOCTOR
테이블에서 의사이름(DR_NAME
), 의사ID(DR_ID
), 진료과(MCDP_CD
), 고용일자(HIRE_YMD
)를 조회하기 위해 SELECT~FROM
문을 사용하고, DATE_FORMAT(date, format)
함수를 사용하여 고용일자를 년-월-일('%Y-%m-%d'
)만 나타나게 한다. 이때 진료과(MCDP_CD
)가 흉부외과(CS
)이거나 일반외과(GS
) 조건을 추가하기 위해 WHERE 조건
절을 사용한다. 또한 ORDER BY
절을 사용하여 고용일자(HIRE_YMD
)를 기준으로 내림차순(DESC
) 정렬하고, 고용일자가 같다면 이름(DR_NAME
)을 기준으로 오름차순(ASC
) 정렬한다.
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/131120
2. 코드
SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_FORMAT(DATE_OF_BIRTH, '%Y-%m-%d') AS DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE MONTH(DATE_OF_BIRTH) = '3' AND GENDER = 'W' AND TLNO != 'NULL'
ORDER BY MEMBER_ID ASC;
3. 코드 해석
해당 문제는 MEMBER_PROFILE
테이블에서 회원의 ID(MEMBER_ID
), 이름(MEMBER_NAME
), 성별(GENDER
), 생년월일(DATE_OF_BIRTH
)을 조회하기 위해 SELECT~FROM
문을 사용하고, 생년월일을 출력하기 위해 DATE_FORMAT(칼럼 이름, 날짜 형식)
구문을 활용한다.
또한 회원 중에서 생일이 3월(MONTH(DATE_OF_BIRTH) = '3'
)인 여성(GENDER = 'W'
)이고, 전화번호가 NULL인 경우를 제외(TLNO != 'NULL'
)하여 조회하기 위해 WHERE 조건
절을 사용한다. 추가적으로 ORDER BY
절을 추가하여 회원의 ID(MEMBER_ID
)를 기준으로 오름차순(ASC
) 정렬을 한다.
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/131536
2. 코드
SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) >= 2
ORDER BY USER_ID ASC, PRODUCT_ID DESC;
3. 코드 해석
해당 문제는 ONLINE_SALE
테이블에서 재구매한 회원 ID(USER_ID
)와 재구매한 상품 ID(PRODUCT_ID
)를 출력하기 위해 SELECT~FROM
문을 사용한다. 이때 동일한 회원(USER_ID
)이 동일한 상품(PRODUCT_ID
)을 재구매한 데이터를 구하기 위해 GROUP BY
절과 HAVING 조건
절을 사용한다. 추가적으로 ORDER BY
절을 추가하여 회원 ID(USER_ID
)를 기준으로 오름차순(ASC
) 정렬하고, 회원 ID가 같다면 상품 ID(PRODUCT_ID
)를 기준으로 내림차순(DESC
) 정렬을 한다.
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/131118
2. 코드
SELECT I.REST_ID, I.REST_NAME, I.FOOD_TYPE, I.FAVORITES, I.ADDRESS, ROUND(AVG(R.REVIEW_SCORE), 2) AS SCORE
FROM REST_INFO I
JOIN REST_REVIEW R
ON I.REST_ID = R.REST_ID
WHERE I.ADDRESS LIKE '서울%'
GROUP BY I.REST_ID
ORDER BY SCORE DESC, I.FAVORITES DESC;
3. 코드 해석
해당 문제는 REST_INFO
테이블과 REST_REVIEW
에서 REST_ID
로 내부 조인(INNER JOIN
)을 하고(SELECT~FROM~JOIN~ON
), 서울에 위치한 식당들만(ADDRESS LIKE '서울%'
)을 WHERE조건
절로 조회한다.
이때 REST_INFO
테이블의 식당 ID(REST_ID
), 식당 이름(REST_NAME
), 음식 종류(FOOD_TYPE
), 즐겨찾기수(FAVORITES
), 주소(ADDRESS
)와 REST_REVIEW
의 리뷰 점수(REVIEW_SCORE
)의 평균인 리뷰 평균 점수(SCORE
)를 조회한다. 리뷰 평균 점수(SCORE
)는 소수점 세 번째 자리에서 반올림하기 위해 ROUND(숫자, 반올림 할 자리수)
함수를 사용한다. 이것은 GROUP BY
절을 사용하기 때문에 REST_ID
별 리뷰 평균 점수를 구할 수 있다.
추가적으로 ORDER BY
절을 추가하여 평균점수(SCORE
)를 기준으로 내림차순(DESC
) 정렬하고, 평균점수가 같다면 즐겨찾기수(FAVORITES
)를 기준으로 내림차순(DESC
) 정렬을 한다.
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/131537
2. 코드
SELECT DATE_FORMAT(A.SALES_DATE, "%Y-%m-%d") AS SALES_DATE, A.PRODUCT_ID, A.USER_ID, A.SALES_AMOUNT
FROM ONLINE_SALE A
WHERE YEAR(A.SALES_DATE) = 2022 AND MONTH(A.SALES_DATE) = 3
UNION ALL
SELECT DATE_FORMAT(B.SALES_DATE, "%Y-%m-%d") AS SALES_DATE, B.PRODUCT_ID, NULL AS USER_ID, B.SALES_AMOUNT
FROM OFFLINE_SALE B
WHERE YEAR(B.SALES_DATE) = 2022 AND MONTH(B.SALES_DATE) = 3
ORDER BY SALES_DATE ASC, PRODUCT_ID ASC, USER_ID ASC;
3. 코드 해석
UNION ALL