Skip to content
CatBus

Tag: sql

All the articles with the tag "sql".

PROGRAMMERS301650SQL
SELECT e1.id
FROM ecoli_data AS e1
    JOIN ecoli_data AS e2 ON e1.parent_id = e2.id
    JOIN ecoli_data AS e3 ON e2.parent_id = e3.id
WHERE e3.parent_id IS NULL
ORDER BY e1.id ASC

문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.

  • 테이블 2회 JOIN 으로 두 테이블을 연결
  • WHERE 로 조건에 맞는 행만 남김
  • ORDER BY 로 정렬

특정 세대의 대장균 찾기

ecoli_data 를 세 번 조인해 부모의 부모까지 거슬러 올라가고, 그 위가 NULL 인 경우만 남겨 3세대를 찾는다.

2025.05.07·1분·sql
PROGRAMMERS301649SQL
WITH per AS (
    SELECT id, PERCENT_RANK() OVER (ORDER BY size_of_colony DESC) as per_rank
    FROM ECOLI_DATA
)
SELECT id,
CASE
    WHEN per_rank < 0.25 THEN 'CRITICAL'
    WHEN per_rank < 0.5 THEN 'HIGH'
    WHEN per_rank < 0.75 THEN 'MEDIUM'
    ELSE 'LOW'
END AS colony_name
FROM per
ORDER BY id;

문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.

  • ORDER BY 로 정렬 (내림차순 포함)
  • 서브쿼리를 사용
  • CASE WHEN 으로 조건에 따라 값을 분기

대장균의 크기에 따라 분류하기 2

PERCENT_RANK() 윈도 함수로 크기 백분위를 매기고, CASE 로 25%·50%·75% 구간을 잘라 등급 이름을 붙인다.

2025.05.07·1분·sql
PROGRAMMERS273712SQL
WITH null_item as (SELECT t1.item_id
    FROM item_tree as t1
        LEFT JOIN
        item_tree as t2
        ON t1.item_id = t2.parent_item_id
    WHERE t2.item_id IS NULL
)

SELECT ii.item_id, ii.item_name, ii.rarity
FROM null_item as ni
    JOIN
    item_info as ii
    ON ni.item_id = ii.item_id
ORDER BY ii.item_id DESC

문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.

  • 테이블 2회 LEFT JOIN 으로 두 테이블을 연결
  • WHERE 로 조건에 맞는 행만 남김
  • ORDER BY 로 정렬 (내림차순 포함)
  • 서브쿼리를 사용

업그레이드 할 수 없는 아이템 구하기

item_tree 를 자기 자신과 LEFT JOIN 해서 자식이 없는(NULL 인) 아이템만 남긴다 — 더 업그레이드할 수 없는 아이템이다.

2025.05.05·1분·sql
PROGRAMMERS151137SQL
SELECT car_type, COUNT(car_id) as cars
FROM car_rental_company_car
WHERE options REGEXP '통풍시트|열선시트|가죽시트'
GROUP BY car_type
ORDER BY car_type

-- WHERE car.options like '%통풍시트%'
--     OR car.options like '%열선시트%'
--     OR car.options like '%가죽시트%'

문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.

  • WHERE 로 조건에 맞는 행만 남김
  • GROUP BY 로 묶어서 집계
  • ORDER BY 로 정렬
  • 사용한 함수: COUNT()

자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기

LIKE 를 OR 로 세 번 잇는 대신 REGEXP 로 세 옵션을 한 번에 매칭하고 차종별로 COUNT 한다. 원래 쓰던 LIKE 버전도 주석으로 남겨 두었다.

2025.05.05·1분·sql
PROGRAMMERS59044SQL
SELECT ins.name, ins.datetime
FROM animal_ins AS ins
WHERE ins.animal_id NOT IN (
    SELECT animal_id
    FROM animal_outs
)
ORDER BY ins.datetime
LIMIT 3

문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.

  • WHERE 로 조건에 맞는 행만 남김
  • ORDER BY 로 정렬
  • LIMIT 3 으로 상위 3건만 조회
  • 서브쿼리를 사용

오랜 기간 보호한 동물(1)

NOT IN 서브쿼리로 아직 나가지 않은 동물만 남기고, 입소 순으로 정렬해 LIMIT 3.

2025.04.14·1분·sql
PROGRAMMERS59045SQL
SELECT ins.animal_id, ins.animal_type, ins.name
FROM animal_ins AS ins
JOIN
animal_outs AS outs
ON ins.animal_id = outs.animal_id
WHERE ins.sex_upon_intake REGEXP 'Intact' 
    AND outs.sex_upon_outcome REGEXP 'Spayed|Neutered'
ORDER BY ins.animal_id

문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.

  • 테이블 1회 JOIN 으로 두 테이블을 연결
  • WHERE 로 조건에 맞는 행만 남김
  • ORDER BY 로 정렬

보호소에서 중성화한 동물

입소 때 Intact 였다가 퇴소 때 Spayed/Neutered 로 바뀐 행을 REGEXP 로 매칭해 보호소에서 중성화된 동물을 찾는다.

2025.04.14·1분·sql
PROGRAMMERS59043SQL
SELECT a_in.animal_id, a_in.name
FROM animal_ins AS a_in
JOIN 
animal_outs AS a_out
ON a_in.animal_id = a_out.animal_id
where a_in.datetime > a_out.datetime
ORDER BY a_in.datetime

문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.

  • 테이블 1회 JOIN 으로 두 테이블을 연결
  • WHERE 로 조건에 맞는 행만 남김
  • ORDER BY 로 정렬

있었는데요 없었습니다

입소·퇴소를 조인하고 `입소 시각 > 퇴소 시각` 인 행만 남긴다. 데이터가 뒤집힌 경우를 찾는 문제.

2025.04.08·1분·sql
PROGRAMMERS131537SQL
    SELECT DATE_FORMAT(sales_date,"%Y-%m-%d") AS sales_date, product_id, user_id, sales_amount
    FROM online_sale
    WHERE MONTH(sales_date) = 3
UNION
    SELECT DATE_FORMAT(sales_date,"%Y-%m-%d") AS sales_date, product_id, NULL AS user_id, sales_amount
    FROM offline_sale
    WHERE MONTH(sales_date) = 3
ORDER BY sales_date, product_id, user_id

문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.

  • WHERE 로 조건에 맞는 행만 남김
  • ORDER BY 로 정렬
  • 서브쿼리를 사용
  • 사용한 함수: DATE_FORMAT(), MONTH()

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

3월치만 걸러 온라인·오프라인을 UNION 한다. 오프라인에는 user_id 가 없어 NULL 을 채워 컬럼 수를 맞춘다.

2025.04.08·1분·sql
PROGRAMMERS131116SQL
SELECT food_product.category, food_product.price AS max_price, food_product.product_name
FROM food_product, (
    SELECT category, MAX(price) AS max_price
    FROM food_product
    WHERE category IN ('과자', '', '김치', '식용유')
    GROUP BY category
) AS max_price_product
WHERE food_product.category = max_price_product.category AND food_product.price = max_price_product.max_price
ORDER BY price DESC


# SELECT category, MAX(price)
#     FROM food_product
#     WHERE category IN ('과자', '', '김치', '식용유')
#     GROUP BY category

식품분류별 가장 비싼 식품의 정보 조회하기

카테고리별 MAX(price) 를 구한 서브쿼리를 원본 테이블과 다시 조인해, 최고가만이 아니라 그 상품의 이름까지 함께 뽑는다.

2025.04.02·1분·sql