[프로그래머스] SQL 고득점 키트 풀이 및 정리 - 1편 SELECT

Bini by Bini·2023년 4월 4일
0

코테

목록 보기
20/24

코테 대비 프로그래머스 SQL 고득점 Kit를 벼락치기로 풀어보고자 한다.

문제를 풀이하며 잊고있던 MySQL 문법을 정리하여 풀이와 함께 올리겠다!

1편 - SELECT

[출제 빈도 : 낮음, 평균 점수 : 높음, 문제세트 : 20]

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

[Level 2]

조건
1. 3월 생일
2. 여성
3. 전화번호 null 제외

+회원id 기준 오름차순 정렬

주의사항
DATE_OF_BIRTH의 데이트 포맷이 예시와 동일해야 정답처리

답안

SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_FORMAT(DATE_OF_BIRTH, '%Y-%m-%d') AS DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE GENDER = 'W' 
    AND MONTH(DATE_OF_BIRTH) = 3 
    AND TLNO IS NOT NULL
ORDER BY MEMBER_ID

필요 문법

1. Date 추출

  • 연도 추출 : YEAR(칼럼명)
  • 월 추출 : MONTH(칼럼명)
  • 일 추출 : DAY(칼럼명)
  • 시간 추출 : HOUR(칼럼명)
  • 분 추출 : MINUTE(칼럼명)
  • 초 추출 : SECOND(칼럼명)
SELECT * FROM 테이블 WHERE YEAR(컬럼명) = "2021"

문자열이 아닌 그냥 = 2021 을 해도 되는 것 같다. 위의 문제에서도 = 3이 아니라 = '03', = '3'으로 해도 맞다.

2. 원하는 포맷 바꾸기 : DATE_FORMAT(컬럼명, 형식)

%Y : 연도, 숫자, 네자리, %y : 연도, 숫자, 두자리
%M : 월, 이름(January..December), %m : 월, 숫자(00..12)
%D : 영어, 날(0th, 1st, 2nd, ..), %d : 월, 일(00..31)

SELECT DATE_FORAT(컬럼명, '%Y-%m-%d') FROM 테이블

3. is Null

  • is null
    특정 컬럼에 null 값이 있으면 가지고 있는 데이터 반환

  • is not null
    특정 컬럼에 null값을 가지고 있지 않은 데이터 반환

SELECT *
FROM 테이블
WHERE TLNO IS NOT NULL

4. 정렬 : ORDER BY

정렬은 기본적으로 오름차순(ASC)이다.

  • 오름차순 정렬
    ORDER BY 컬럼명 또는 ORDER BY 컬럼명 ASC

  • 내림차순 정렬
    ORDER BY 컬럼명 DESC

SELECT *
FROM 테이블
WHERE TLNO IS NOT NULL
ORDER BY MEMBER_ID

첫 문제여서 정리할 부분이 많은 거겠지요 .. ? ^.^
중복되는 부분은 문법으로 다루지 않을 것입니다!
두번째 문제 풀이도 이어가겠습니다.


🎈 과일로 만든 아이스크림 고르기

[Level 1]

조건
1. 총주문량 3000 초과
2. 주성분이 과일

+아이스크림 맛을 총주문량 큰 순서대로(내림차순) 정렬

답안

1. INNER JOIN

SELECT F.FLAVOR
FROM FIRST_HALF AS F, ICECREAM_INFO AS I
WHERE F.FLAVOR = I.FLAVOR
    AND F.TOTAL_ORDER > 3000
    AND I.INGREDIENT_TYPE = 'fruit_based'
ORDER BY F.TOTAL_ORDER DESC
SELECT F.FLAVOR
FROM FIRST_HALF AS F
    INNER JOIN ICECREAM_INFO AS I
    ON F.FLAVOR = I.FLAVOR
WHERE F.TOTAL_ORDER > 3000
    AND I.INGREDIENT_TYPE = 'fruit_based'
ORDER BY F.TOTAL_ORDER DESC

위의 두 코드는 결국 같은 실행 결과를 보인다. (mysql에서만 가능)
대신 where에 조건으로 F.FLAOR = I.FLAVOR을 꼭 추가해줘야 한다.

2. LEFT JOIN

SELECT F.FLAVOR
FROM FIRST_HALF AS F
    LEFT JOIN ICECREAM_INFO AS I
    ON F.FLAVOR = I.FLAVOR
WHERE F.TOTAL_ORDER > 3000
    AND I.INGREDIENT_TYPE = 'fruit_based'
ORDER BY F.TOTAL_ORDER DESC

🎈 모든 레코드 조회하기

SELECT *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

설명 생략
(그냥 * 이용하면 끝.)


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

[Level 1]

조건
1. 나이 12세 이하
2. 성별 여자
3. 조회할 것 : 환자이름, 환자번호, 성별코드, 나이, 전화번호 순
4. 전화번호 NULL이면 'NONE'으로 출력

+나이 기준 내림차순 정렬, 나이 같으면 환자이름 기준 오름차순 정렬

답안

SELECT PT_NAME, PT_NO, GEND_CD, AGE, IFNULL(TLNO, 'NONE') AS TLNO
FROM PATIENT
WHERE AGE <= 12
    AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME ASC

주의할 점 : 테이블 조회 순서 주의, PT_NO보다 PT_NAME가 먼저 출력되어야 함. 아니면 틀림킄킄

필요 문법

1. NULL 처리 : IFNULL

(MySQL에서 컬럼 값이 NULL인 경우를 처리해주는 함수에는 IFNULL, CASE 등이 있다.

  • IFNULL(컬럼명, 'NULL일 경우 대체값')
    해당 컬럼 값이 NULL을 반환할 때, 다른 값으로 출력하도록 하는 함수
SELECT IFNULL(컬럼명, "Null일 경우 대체 값") FROM 테이블
	CASE에 대해서는 추후 다룰 예정..
    

2. 다중 정렬

위와 같이 AGE를 기준으로 내림차순 정렬, AGE 값이 같다면 ID 기준 오름차순 정렬을 하고 싶을 때 다중 정렬 이용.

원하는 우선순위대로 ORDER BY 뒤에 써주면 된다.

SELECT * FROM TABLE ORDER BY AGE, ID, ...

내림차순, 오름차순을 반영하려면

SELECT * FROM TABLE ORDER BY AGE DESC, ID ASC, ...

🎈 재구매가 일어난 상품과 회원 리스트 구하기

[Level 2]

조건
1. 동일한 회원이 동일한 상품 재구매 했는지

  • 회원id 기준 오름차순 정렬, 회원id 같다면 상품id 기준 내림차순 정렬

답안

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
셀프조인.. ? 뭐 이런 거 써야 되나 했는데 해결 못함.
사실 개쉬웠음. group by랑 having, count 쓰면 끝

필요 문법

1. GROUP BY & HAVING

GROUP BY 를 통해 집계하고, HAVING문을 통해 집계 결과에 조건을 넣는 방식

이 문제에서는 USER_ID, PRODUCT_ID 두개의 속성을 GROUP BY 시킨다.
이때, 이 두개의 속성은 모두 SELECT절에 나타나야 한다.

WHERE문 VS HAVING문
WHERE문 : 데이터 행에서 조건을 만족하는 데이터만을 필터링하는 구문
HAVING문 : GROUP BY문을 통해 집계한 이후, 만족하는 데이터만을 필터링하는 구문

2. 집계함수

(설명 생략)

  • MAX
  • MIN
  • SUM
  • COUNT
  • AVG

불친절해도 이해해주세효 .. 이것은 단순 정리용


🎈 역순 정렬하기

[Level 1]

SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC

설명 생략


🎈 아픈 동물 찾기

[Level 1]

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION = 'Sick'
ORDER BY ANIMAL_ID

설명 생략


🎈 어린 동물 찾기

[Level 1]

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE NOT INTAKE_CONDITION = 'Aged'
ORDER BY ANIMAL_ID

설명 생략


🎈 여러 기준으로 정렬하기

[Level 1]

SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME, DATETIME DESC

설명 생략


🎈 상위 n개 레코드

[LEVEL 1]

답안

SELECT NAME
FROM ANIMAL_INS
WHERE DATETIME = (SELECT MIN(DATETIME) FROM ANIMAL_INS)

WHERE구문에 서브 쿼리를 이용하면 된다.
찾는 조건의 ROW를 가져오고, 그 중 NAME을 SELECT.

SELECT NAME
FROM ANIMAL_INS 
ORDER BY DATETIME
LIMIT 1;

정렬하고, LIMIT 구를 이용해도 된다.

필요 문법

1. 서브 쿼리 : MAX, MIN 값을 가진 ROW SELECT하기

SELECT * FROM EMPLOYEE WHERE SALARY = (SELECT MAX(SALARY) FROM EMPLOYEE)

2. LIMIT

LIMIT 1 : 맨 위에서부터 1개까지의 정보 조회
따라서, ORDER BY와 짝지어 사용하면 된다.

SELECT *
FROM EMPLOYEE
ORDER BY DATETIME
LIMIT 1

🎈 조건에 맞는 회원수 구하기

[Level 1]

답안

SELECT COUNT(*)
FROM USER_INFO
WHERE YEAR(JOINED) = '2021'
    AND AGE BETWEEN 20 AND 29

필요 문법

1. BETWEEN a AND b

a와 b 사이의 모든 값에 해당하는지 확인

SELECT * FROM 테이블명 WHERE DATETIME BETWEEN '2022-09-01' and '2022-09-26'

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

[Level 1]

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

❗ 주의사항 잘보기..! 날짜 포맷 출력 예시와 똑같이 출력하기


🎈 평균 일일 대여 요금 구하기

[Level 1]

답안

SELECT ROUND(AVG(DAILY_FEE)) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV'

필요 문법

1. ROUND(AVG(컬럼명)) - 소수점 반올림

  • ROUND 함수 : 반올림
    - ROUND(컬럼명) : 소수점 첫번째 자리에서 반올림
    • ROUND(컬럼명, 1) : 소수점 두번째 자리에서 반올림 .. 등

추가로,

  • TRUNCATE 함수 : 버림
    - TRUNCATE(컬럼명, 1) : 버릴 자릿수 명시
  • FLOOR 함수 : 버림
    - FLOOR(컬럼명) : 소수점 아래 버림

🎈 강원도에 위치한 생산공장 목록 출력하기

[Level 1]

조건
1. address칼럼에서 '강원도'를 포함하는지

답안

SELECT FACTORY_ID, FACTORY_NAME, ADDRESS
FROM FOOD_FACTORY
WHERE ADDRESS LIKE '강원도%'

필요 문법

1. Like 연산자

: 특정 문자가 포함되어 있는 데이터를 검색할 때 사용

1) 특정 문자로 시작하는 데이터 검색

SELECT * FROM 테이블명 WHERE 컬럼명 LIKE '특정 문자열%'

2) 특정 문자로 끝나는 데이터 검색

SELECT * FROM 테이블명 WHERE 컬럼명 LIKE '%특정 문자열'

3) 특정 문자를 포함하는 데이터 검색

SELECT * FROM 테이블명 WHERE 컬럼명 LIKE '%특정 문자열'%

14개 문제에 대해 풀이를 적었는데 .. 나머지는 너무 겹치는 내용이거나, Level 4 문제여서 일단 스킵하였다.
다음 편을 먼저 풀어보고 시간이 되면 Level 4 문제를 풀이하도록 하겠다 ^-6

SQL 100% 정답률을 위하여 .. 💭

profile
My Precious Records

0개의 댓글