[SQL Kit] SELECT

SELOG·2024년 2월 26일
0

ALGO-CHALLENGE

목록 보기
10/17
post-thumbnail

Lv2 : 3월에 태어난 여성 회원 목록 출력

My Code

-- 생일이 3월 / 여성 회원 
-- ID, 이름, 성별, 생년월일을 조회
-- 전화번호 NULL 제외
-- ID 기준 ASC

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

Lv1 : 흉부외과 또는 일반외과 의사 목록 출력

My Code

-- 진료과가 흉부외과(CS)이거나 일반외과(GS)인 의사
-- 의사의 이름, 의사ID, 진료과, 고용일자 조회
-- 고용일자 기준 DESC => 이름 기준 ASC
SELECT DR_NAME, DR_ID, MCDP_CD, DATE_FORMAT(HIRE_YMD, '%Y-%m-%d') as HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD IN ('CS', 'GS')
ORDER BY HIRE_YMD DESC, DR_NAME ASC
;

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

My Code

-- 12세 이하 / 여자환자
-- 환자이름, 환자번호, 성별코드, 나이, 전화번호 조회
-- 전화번호가 없는 경우, 'NONE'으로 출력
-- 나이 기준 DESC => 환자이름 기준 ASC
SELECT PT_NAME, PT_NO, GEND_CD, AGE, IF(TLNO IS NULL, 'NONE', TLNO) AS TLNO
FROM PATIENT
WHERE AGE <= '12'
    AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME ASC
;

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

My Code

-- 총주문량이 3,000보다 높다 / 주 성분이 과일
-- 총주문량이 큰 순서대로 조회 (DESC)
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 = 'fruit_based'
ORDER BY TOTAL_ORDER DESC
;

Lv1 : 평균 일일 대여 요금 구하기

My Code

-- 자동차 종류가 'SUV'
-- 평균 일일 대여 요금 출력
-- 소수 첫 번째 자리에서 반올림 / 컬럼명은 'AVERAGE_FEE'
SELECT ROUND(AVG(DAILY_FEE),0) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV'
;

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

My Code

-- 2022년 10월에 작성
-- 게시글 제목, 게시글 ID, 댓글 ID, 댓글 작성자 ID, 댓글 내용, 댓글 작성일 조회
-- 댓글 작성일 기준 ASC => 게시글 제목 기준 ASC
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 B.CREATED_DATE LIKE "2022-10-%"
ORDER BY R.CREATED_DATE ASC, B.TITLE ASC
;

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

My Code

-- 서울에 위치한 식당
-- 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수 조회
-- 평균점수는 소수점 세 번째 자리에서 반올림
-- 평균점수 기준 DESC => 즐겨찾기수 기준 DESC
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_NAME
ORDER BY SCORE DESC, FAVORITES DESC
;

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

My Code

-- 동일한 회원이 동일한 상품을 재구매한 데이터를 구하여,
-- 재구매한 회원 ID, 재구매한 상품 ID 출력
-- 회원 ID 기준 ASC => 상품 ID 기준 DESC
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
;

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

My Code

-- 2022년 3월
-- 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량 출력
-- OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL
-- 판매일 기준 ASC => 상품 ID 기준 ASC => 유저 ID ASC

-- 두 테이블을 합쳐야 돼! JOIN이 아니다!
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 ASC, PRODUCT_ID ASC, USER_ID ASC
;

UNION

  • 두 개 이상의 SELECT 문 결과를 합쳐서 하나의 결과로 반환한다.
  • 중복된 결과를 제거한다.
  • 결과를 반환하기 전에 데이터를 정렬하여 중복을 제거하는 과정이 필요하기 때문에, UNION ALL보다 처리 속도가 느릴 수 있다.

UNION ALL

  • 두 개 이상의 SELECT 문 결과를 그대로 합쳐서 반환한다.
  • 중복된 결과도 모두 포함한다.
  • 중복 제거 과정이 없기 때문에 UNION보다 처리 속도가 빠르다.

Lv1 : 상위 n개 레코드

My Code

-- 동물 보호소에 가장 먼저 들어온 동물
-- 동물 이름 조회
SELECT NAME FROM ANIMAL_INS ORDER BY DATETIME LIMIT 1;

Lv2 : 업그레이드 된 아이템 구하기

My Code

-- 아이템의 희귀도가 'RARE'인 아이템의 모든 다음 업그레이드 아이템
-- 아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME), 아이템의 희귀도(RARITY) 출력
-- 아이템 ID 기준 DSEC

SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO
WHERE ITEM_ID IN (
    SELECT ITEM_ID
    FROM ITEM_TREE 
    WHERE PARENT_ITEM_ID IN (
        SELECT ITEM_ID
        FROM ITEM_INFO
        WHERE RARITY = 'RARE'
    )
)
ORDER BY ITEM_ID DESC
;

Lv2 : 조건에 맞는 개발자 찾기

My Code

-- Python이나 C# 스킬을 가진 개발자의 정보를 조회
-- 개발자 ID, 이메일, 이름, 성 조회
-- 개발자 ID 기준 ASC

SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPERS
WHERE SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'Python') != 0
   OR SKILL_CODE & (SELECT CODE FROM SKILLCODES WHERE NAME = 'C#') != 0
ORDER BY ID ASC
;

# SET @Python = (SELECT CODE FROM SKILLCODES WHERE NAME = 'Python');
# SET @C = (SELECT CODE FROM SKILLCODES WHERE NAME = 'C#');
-- 실패 (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET @C_S = (SELECT CODE FROM SKILLCODES WHERE NAME = 'C#');\n\nSELECT ID, EMAIL, F' at line 6")

Hot Point

  • ★ SKILL_CODE와 특정 스킬의 CODE를 비트 AND 연산한 결과가 0이 아니라면, 해당 스킬 코드가 SKILL_CODE에 포함되어 있다는 것을 의미한다.
  • SET 문을 사용하여 변수를 할당하고 바로 SELECT 쿼리를 실행하려 할 때 발생하는 구문 오류
profile
금융 IT 전문가가 될거야

0개의 댓글