MySQL_프로그래머스-1

soyeong·2022년 10월 12일
0

프로그래머스 SQL

목록 보기
1/6
post-thumbnail

🚩 프로그래머스(programmers)에서 제공하는 SQL 문제풀기
🚩 SELECT

📌 Level 1

🟩 동물의 아이디와 이름

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) 순으로 조회해야 한다.

🟩 상위 n개 레코드

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 조건절을 사용한다.

🟩 12세 이하인 여자 환자 목록 출력하기

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) 정렬한다.


📌 Level 2

🟩 3월에 태어난 여성 회원 목록 출력하기

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) 정렬을 한다.


📌 Level 4

🟩 서울에 위치한 식당 목록 출력하기

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


profile
The ultimate goal is to be a Data Scientist.

0개의 댓글