image





코드스테이츠와 함께하는 ‘SQL Challenge’ 4일차

코드스테이츠에서 5~6월 연휴기간동안 방학을 줬다. 방학에는 방학숙제가 있다. 방학숙제는 프로그래머스 스쿨 “SQL 고득점 Kit” 하루에 3문제씩 풀기





Daily Reflection : 3L 회고

배운 것(Learned)

LEFT OUTER JOIN을 통하여 한 테이블에는 있지만, 다른 테이블에는 없는 데이터를 조회할 수 있다.


아쉬웠던 점(Lacked)

다양한 JOIN의 예를 연습해봐야겠다.


좋았던 점(Liked)

LEFT OUTER JOIN 을 어떠한 경우에 사용해야하는지 몰랐는데, 연습문제를 통해서 경험할 수 있어서 좋았다.





SELECT : 흉부외과 또는 일반외과 의사 목록 출력하기

문제 설명과 문제📜

문제 설명

다음은 종합병원에 속한 의사 정보를 담은 DOCTOR 테이블입니다. DOCTOR 테이블은 다음과 같으며 DR_NAME, DR_ID, LCNS_NO, HIRE_YMD, MCDP_CD, TLNO 는 각각 의사이름, 의사ID, 면허번호, 고용일자, 진료과코드, 전화번호를 나타냅니다.

Column name Type Nullable
DR_NAME VARCHAR(20) FALSE
DR_ID VARCHAR(10) FALSE
LCNS_NO VARCHAR(30) FALSE
HIRE_YMD DATE FALSE
MCDP_CD VARCHAR(6) TRUE
TLNO VARCHAR(50) TRUE


문제

DOCTOR 테이블에서 진료과가 흉부외과(CS)이거나 일반외과(GS)인 의사의 이름, 의사ID, 진료과, 고용일자를 조회하는 SQL문을 작성해주세요. 이때 결과는 고용일자를 기준으로 내림차순 정렬하고, 고용일자가 같다면 이름을 기준으로 오름차순 정렬해주세요.



풀이🔎

DOCTOR 테이블 살펴보기

SELECT      *
FROM        DOCTOR
;
  • 의사 이름이 깨미, 니모, 띠띠, 루피, 베지 ...😂


의사의 이름, 의사ID, 진료과, 고용일자 출력하기

SELECT      DR_NAME, DR_ID, MCDP_CD, HIRE_YMD
FROM        DOCTOR
;


진료과가 흉부외과(CS)이거나 일반외과(GS) 경우 출력하기

SELECT      DR_NAME, DR_ID, MCDP_CD, HIRE_YMD
FROM        DOCTOR
WHERE       MCDP_CD = 'CS'
      OR    MCDP_CD = 'GS'
;


정렬조건에 따라서 출력하기

SELECT      DR_NAME, DR_ID, MCDP_CD, HIRE_YMD
FROM        DOCTOR
WHERE       MCDP_CD = 'CS'
      OR    MCDP_CD = 'GS'
ORDER BY    HIRE_YMD DESC, DR_NAME ASC
;
  • 실패😢
  • 문제 조건에는 없는데, 아래 예시를 보니깐 날짜 포멧을 맞춰서 출력해야 함


날짜 포멧 맞춰서 출력하기

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
;
  • 통과🎉





GROUP BY : 즐겨찾기가 가장 많은 식당 정보 출력하기

문제 설명과 문제📜

문제 설명

다음은 식당의 정보를 담은 REST_INFO 테이블입니다. REST_INFO 테이블은 다음과 같으며 REST_ID, REST_NAME, FOOD_TYPE, VIEWS, FAVORITES, PARKING_LOT, ADDRESS, TEL은 식당 ID, 식당 이름, 음식 종류, 조회수, 즐겨찾기수, 주차장 유무, 주소, 전화번호를 의미합니다.

Column name Type Nullable
REST_ID VARCHAR(5) FALSE
REST_NAME VARCHAR(50) FALSE
FOOD_TYPE VARCHAR(20) TRUE
VIEWS NUMBER TRUE
FAVORITES NUMBER TRUE
PARKING_LOT VARCHAR(1) TRUE
ADDRESS VARCHAR(100) TRUE
TEL VARCHAR(100) TRUE


문제

REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.



풀이🔎

REST_INFO 테이블 살펴보기

SELECT      *
FROM        REST_INFO
;
  • 음식 종류에는 한식, 일식, 양식 등이 있음


음식종류별로 즐겨찾기수가 가장 많은 식당의 즐겨찾기 수 출력하기

SELECT      FOOD_TYPE, MAX(FAVORITES)
FROM        REST_INFO
GROUP BY    FOOD_TYPE
;
  • 음식 종류별 가장 많은 즐겨찾기 수는 다음과 같음
    • 한식 734
    • 일식 230
    • 양식 102
    • 분식 151
    • 중식 20


음식종류별로 즐겨찾기수가 가장 많은 식당의 즐겨찾기 수와 같은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수 출력하기

SELECT      FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM        REST_INFO
WHERE       (FOOD_TYPE, FAVORITES) IN (
                          SELECT      FOOD_TYPE, MAX(FAVORITES)
                          FROM        REST_INFO
                          GROUP BY    FOOD_TYPE
                          )
;


음식 종류를 기준으로 내림차순 정렬 출력하기

SELECT      FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM        REST_INFO
WHERE       (FOOD_TYPE, FAVORITES) IN (
                          SELECT      FOOD_TYPE, MAX(FAVORITES)
                          FROM        REST_INFO
                          GROUP BY    FOOD_TYPE
                          )
ORDER BY    FOOD_TYPE DESC
;
  • 통과🎉





JOIN : 없어진 기록 찾기

문제 설명과 문제📜

문제 설명

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

NAME TYPE NULLABLE
ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
INTAKE_CONDITION VARCHAR(N) FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_INTAKE VARCHAR(N) FALSE

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다. ANIMAL_OUTS 테이블의 ANIMAL_IDANIMAL_INSANIMAL_ID의 외래 키입니다.

NAME TYPE NULLABLE
ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_OUTCOME VARCHAR(N) FALSE


문제

천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.



풀이🔎

ANIMAL_INS 테이블 살펴보기

SELECT      *
FROM        ANIMAL_INS
;


ANIMAL_OUTS 테이블 살펴보기

SELECT      *
FROM        ANIMAL_OUTS
;


ANIMAL_OUTS을 기준으로 LEFT JOIN으로 테이블 합치기

SELECT      *
FROM        ANIMAL_OUTS OUTS
LEFT JOIN   ANIMAL_INS INS
      ON    OUTS.ANIMAL_ID = INS.ANIMAL_ID
;


입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물 조회하기

SELECT      *
FROM        ANIMAL_OUTS OUTS
LEFT JOIN   ANIMAL_INS INS
      ON    OUTS.ANIMAL_ID = INS.ANIMAL_ID
WHERE       INS.ANIMAL_ID IS NULL
;


동물의 ID와 이름을 ID 순으로 조회하기

SELECT      OUTS.ANIMAL_ID, OUTS.NAME
FROM        ANIMAL_OUTS OUTS
LEFT JOIN   ANIMAL_INS INS
      ON    OUTS.ANIMAL_ID = INS.ANIMAL_ID
WHERE       INS.ANIMAL_ID IS NULL
ORDER BY    OUTS.ANIMAL_ID
;
  • 통과🎉
  • 레프트 아웃터 조인
    image





끝까지 읽어주셔서 감사합니다😉





댓글남기기