[프로그래머스] SQL 고득점 Kit 정리 - SELECT

susu·2023년 6월 21일
0

Algorithm & Coding Test

목록 보기
5/6
post-thumbnail

📌 조건에 부합하는 중고거래 댓글 조회하기

Level 1

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 B.BOARD_ID = R.BOARD_ID
WHERE R.CREATED_DATE AND B.CREATED_DATE between "2022-10-01" and "2022-10-31"
ORDER BY R.CREATED_DATE ASC, B.TITLE ASC

날짜 형식 지정

DATE_FORMAT(포맷을 변경할 컬럼명, 변경하고 싶은 날자 타입)
SELECT DATE_FORMAT('20201224', '%Y-%m-%d') : Y만 대문자
M 대문자로 할 경우 월 이름(January...)으로 출력,
D 대문자로 할 경우 일자가 1st, 2nd... 이런 식으로 출력

정렬 기준이 여러 개인 경우

ORDER BY 뒤에 기준을 순서대로 나열, 쉼표로 구분
ORDER BY level DESC, name ASC

JOIN

JOIN 컬럼명 AS C ON A.컬럼1 = C.컬럼2

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

Level 1

SELECT 
    FACTORY_ID, 
    FACTORY_NAME, 
    ADDRESS
FROM FOOD_FACTORY
WHERE ADDRESS LIKE "강원도%"
ORDER BY FACTORY_ID

와일드카드 문자와 LIKE 사용

강아지로 시작하는 데이터 select * from dog where title like '강아지%';
강아지로 끝나는 데이터 select * from dog where title like '%강아지';
강아지가 들어가는 데이터 검색 select * from dog where title like '%강아지%';

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

Level 4

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 AS I
JOIN REST_REVIEW AS R
ON I.REST_ID = R.REST_ID
WHERE I.ADDRESS LIKE "서울%"
GROUP BY I.REST_ID
ORDER BY SCORE DESC, I.FAVORITES DESC

집계함수에서 GROUP BY

값들의 '집합'을 계산해서 '하나'의 값을 리턴하는 것.

  • COUNT(*)를 제외하고 집계함수는 NULL을 무시한다.
  • 집계함수는 WHERE 절에서 사용할 수 없다.
    SELECT 구문이나, WHERE 절의 서브쿼리에서만 사용 가능하다.
  • GROUP BY : 집계함수의 대상이 되는 그룹을 지정해줌
    예) 가게의 별점 평균 ➡️ SELECT(AVG(별점)) GROUP BY 가게ID

GROUP BY 이후 HAVING

  • WHERE절에는 집계함수를 사용할 수 없으므로,
    HAVING으로 집계함수의 대상을 제한함.
  • WHERE절처럼 조건을 걸어준다고 생각하면 된다.
    🚨 GROUP BY절 다음에 나와야 함 (순서가 바뀌면 안 됨)

자리수 올림, 내림, 반올림

  • 올림 : CEIL(값) ➡️ 무조건 정수값으로 올림
  • 내림 : FLOOR(값) ➡️ 무조건 정수값으로 내림
    TRUNCATE(값, 자리수) ➡️ 특정 자리수까지 버려줌
  • 반올림 : ROUND(값) / ROUND(값, 자리수)

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

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

📌 조건에 맞는 도서 리스트 출력하기

Level 1

SELECT
    BOOK_ID,
    DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK
WHERE CATEGORY = '인문' 
AND DATE_FORMAT(PUBLISHED_DATE, '%Y') = '2021'
ORDER BY PUBLISHED_DATE

특정 연도만 검색

# 2023년만 검색
WHERE DATE_FORMAT(날짜, '%Y') = '2023'
# 3월만 검색
WHERE DATE_FORMAT(날짜, '%m') = '03'
OR
WHERE DATE_FORMAT(날짜, '%M') = 'March'

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

Level 1

SELECT
    ROUND(AVG(DAILY_FEE)) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
GROUP BY CAR_TYPE
HAVING CAR_TYPE = 'SUV'

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

Level 1

SELECT 
    H.FLAVOR
FROM FIRST_HALF AS H
JOIN ICECREAM_INFO AS I
ON H.FLAVOR = I.FLAVOR
WHERE H.TOTAL_ORDER > 3000
AND I.INGREDIENT_TYPE LIKE 'fruit%'
ORDER BY H.TOTAL_ORDER DESC

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

Level 1

SELECT
    PT_NAME,
    PT_NO,
    GEND_CD,
    AGE,
    CASE WHEN TLNO IS NULL THEN 'NONE'
    ELSE TLNO
    END AS TLNO
FROM PATIENT
WHERE AGE<=12 AND GEND_CD='W'
ORDER BY AGE DESC, PT_NAME ASC

또는

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

NULL인 경우 대체 표기하는 법

  • IFNULL(컬럼명, NULL인 경우 표기할 값) 표기할 컬럼명
SELECT IFNULL(환자번호, 'NONE') 환자번호
FROM PATIENT
# 환자번호가 NULL인 경우 NONE으로 표기
  • CASE WHEN - THEN 사용

CASE WHEN (컬럼 값 조건) THEN (표기할 값) ELSE (표기할 값) END AS 표시할 컬럼명

  • SELECT 절에 사용
  • 특정 컬럼값의 조건에 따라 값을 다르게 표시한다
  • ELSE절은 생략 가능
  • END AS로 끝내야 함

📌 인기있는 아이스크림

Level 1

SELECT
    FLAVOR
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID ASC

📌 모든 레코드 조회하기

Level 1

SELECT *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

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

Level 2

SELECT 
	USER_ID, 
    PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) >= 2
ORDER BY USER_ID, PRODUCT_ID DESC

두 개 이상의 컬럼을 묶어 집계함수 적용하기

HAVING 절에는 집계함수 사용이 가능함
➡️ 일단 GROUP BY로 묶은 뒤 HAVING 집계함수~

📌 역순 정렬하기

Level 1

SELECT 
    NAME,
    DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC

역순이라는 게... 내림차순인가 봅니다.

📌 오프라인/온라인 판매 데이터 통합하기

Level 4

SELECT DATE_FORMAT(SALES_DATE, "%Y-%m-%d") AS SALES_DATE, 
 PRODUCT_ID, 
 USER_ID, 
 SALES_AMOUNT 
 FROM ONLINE_SALE
 WHERE SALES_DATE LIKE "2022-03%"
UNION ALL
SELECT 
 DATE_FORMAT(SALES_DATE, "%Y-%m-%d") AS SALES_DATE, 
 PRODUCT_ID, 
 NULL AS USER_ID, 
 SALES_AMOUNT 
 FROM OFFLINE_SALE
 WHERE SALES_DATE LIKE "2022-03%"

order by sales_date, product_id, user_id

UNION과 UNION ALL의 차이

  • UNION -> 중복 컬럼 제거
  • UNION ALL -> 중복 컬럼

📌 아픈 동물 찾기

Level 1

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION LIKE "%Sick%"

📌 어린 동물 찾기

Level 1

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION NOT LIKE "%Aged%"

특정 값을 제외하고 불러오기

WHERE 컬럼명 NOT IN (제외할 값 1, 2, 3...)

상위 n개 데이터만 보여주기

ORDER BY 정렬 후 마지막줄에 LIMIT n 걸어주기

SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1
profile
블로그 이사했습니다 ✈ https://jennairlines.tistory.com

0개의 댓글