[프로그래머스] SQL 정리 - WHERE, ORDER BY (2)

유은선·2023년 5월 12일
0

Programmers_SQL

목록 보기
2/6
post-thumbnail

WHERE, ORDER BY(2)

조건문을 만들 때 사용한다.

📚 상위 n개 레코드

LIMIT 구를 이용해 상위 N개 행만 조회한다.

  • limit 0, 1 : 위에서 0부터 1까지의 정보 추출
  • limit 1 : 위에서 1개의 정보 추출
SELECT NAME
FROM ANIMAL_INS 
ORDER BY DATETIME
LIMIT 1;

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

12세 이하, "여자"환자 조건을 WHERE를 이용해 조건을 달아주고, IFNULL을 이용해 NULL을 처리해준다.

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;
  • IFNULL
    해당 Column의 값이 NULL을 반환할 때, 다른 값으로 출력할 수 있도록 하는 함수
SELECT IFNULL(Column명, "Null일 경우 대체 값") FROM 테이블명; 

👨‍👨‍👦 조건에 맞는 회원수 구하기

20세 이상 29세 이하인 조건을 20<=AGE AND AGE<=29으로 작성해야한다. 20<=AGE<=29로 하면 제대로 된 답이 나오지 않으니 주의!

SELECT COUNT(USER_ID) AS USERS
FROM USER_INFO
WHERE DATE_FORMAT(JOINED,"%Y")='2021' AND 20<=AGE AND AGE<=29;

SELECT COUNT(USER_ID) AS USERS
FROM USER_INFO
WHERE YEAR(JOINED)='2021' AND 20<=AGE AND AGE<=29;

👩‍⚕️ 흉부외과 또는 일반외과 의사 목록 출력하기

DATE_FORMATWHERE를 이용해 조건을 달아주면 되는 간단한 문제

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;

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

SELECT ROUND(AVG(DAILY_FEE),0) AS 'AVERAGE_FEE'
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE="SUV";
  • ROUND(숫자,반올림할 자릿수) : 숫자를 반올림할 자릿수 +1 자릿수에서 반올림

🧷 NULL 처리하기

IFNULL을 사용해 NULL을 "No name"으로 대체해주면 된다.

SELECT ANIMAL_TYPE, IFNULL(NAME,"No name") AS NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS;

❔ 중복 제거하기

컬럼 내 같은 데이터가 존재하면, 중복을 제거하기 위해 DISTINCT를 사용
COUNT는 *가 아니면 NULL을 세지 않으므로 WHERE 문을 작성하지 않아도 됩니다.

SELECT COUNT(DISTINCT NAME)
FROM ANIMAL_INS;

🚓 자동차 대여 기록에서 장기/단기 대여 구분하기

조건문 사용하기

  • IF
    IF (조건, 참일 때 ,거짓 일 때)
IF (DATEDIFF(END_DATE,START_DATE)>=29,"장기 대여","단기 대여") 
AS RENT_TYPE 
  • CASE WHEN
    특정 조건에 따라 값을 변경할 수 있는 수식
    CASE
    WHEN 조건1 THEN 조건1이 참일때 값
    WHEN 조건2 THEN 조건2 반환값
    ELSE 아닐때 값
    END
CASE WHEN DATEDIFF(END_DATE,START_DATE)>=29 THEN '장기 대여' 
ELSE '단기 대여' END 
AS RENT_TYPE

DATEDIFF
두 날짜의 차이를 구하는 함수는 DATEDIFF(시작일자,끝일자)

SELECT HISTORY_ID, CAR_ID, 
DATE_FORMAT(START_DATE,"%Y-%m-%d") AS START_DATE, 
DATE_FORMAT(END_DATE,"%Y-%m-%d") AS END_DATE,
CASE WHEN DATEDIFF(END_DATE,START_DATE)>=29 THEN '장기 대여' 
ELSE '단기 대여' END 
AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
WHERE DATE_FORMAT(START_DATE,"%Y-%m")='2022-09'
ORDER BY HISTORY_ID DESC;

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

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

🍉 경기도에 위치한 식품창고 목록 출력하기

IFNULLLIKE를 사용해서 간단하게 풀 수 있는 문제

SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS,
IFNULL(FREEZER_YN,"N") AS FREEZER_YN
FROM FOOD_WAREHOUSE 
WHERE WAREHOUSE_NAME LIKE "%경기%"
ORDER BY WAREHOUSE_ID;

🍖 가격이 제일 비싼 식품의 정보 출력하기

서브쿼리를 이용해 코드를 작성하는 방법을 알아보자!

😠 틀린 코드

해당 쿼리는 가격이 최대인 상품과 최대 가격이 매칭 되지 않는다

SELECT PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, 
CATEGORY, MAX(PRICE) AS PRICE
FROM FOOD_PRODUCT;

😊 정답 코드

  1. 서브 쿼리를 이용해 MAX값인 PRICE를 구해주고 WHERE문에 넣어 행을 출력
SELECT *
FROM FOOD_PRODUCT
WHERE PRICE = (SELECT MAX(PRICE) FROM FOOD_PRODUCT);
  1. ORDER BYLIMIT를 이용해 가격순으로 정렬하고, 제일 위에 있는 행을 출력
SELECT *
FROM FOOD_PRODUCT 
ORDER BY PRICE DESC
LIMIT 1;

🐶 중성화 여부 파악하기

IF문을 사용해 조건과 참이 될때, 거짓이 될때 값을 각각 주면 된다.

SELECT ANIMAL_ID, NAME, 
IF (SEX_UPON_INTAKE LIKE "Neutered%" OR 
    SEX_UPON_INTAKE LIKE "Spayed%" ,'O','X') AS '중성화'
FROM ANIMAL_INS 
ORDER BY ANIMAL_ID;
profile
뭐든지 난 열심히 하지

0개의 댓글