Tag: sql
All the articles with the tag "sql".
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세대를 찾는다.
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% 구간을 잘라 등급 이름을 붙인다.
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 인) 아이템만 남긴다 — 더 업그레이드할 수 없는 아이템이다.
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 버전도 주석으로 남겨 두었다.
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.
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 로 매칭해 보호소에서 중성화된 동물을 찾는다.
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 로 정렬
있었는데요 없었습니다
입소·퇴소를 조인하고 `입소 시각 > 퇴소 시각` 인 행만 남긴다. 데이터가 뒤집힌 경우를 찾는 문제.
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 을 채워 컬럼 수를 맞춘다.
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) 를 구한 서브쿼리를 원본 테이블과 다시 조인해, 최고가만이 아니라 그 상품의 이름까지 함께 뽑는다.