카테고리: programmers
"programmers" 로 분류된 글.
SELECT MIN(datetime) AS 시간
FROM animal_ins
문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.
- 사용한 함수: MIN()
최솟값 구하기
animal_ins 에서 MIN(datetime) 하나만 뽑는다. 가장 먼저 들어온 동물의 보호 시작 시각.
SELECT ecoli1.id AS ID, COUNT(ecoli2.id) as CHILD_COUNT
FROM ecoli_data AS ecoli1
LEFT JOIN
ecoli_data AS ecoli2
ON ecoli1.id = ecoli2.parent_id
GROUP BY ecoli1.id;
문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.
- 테이블 1회 LEFT JOIN 으로 두 테이블을 연결
- GROUP BY 로 묶어서 집계
- 사용한 함수: COUNT()
대장균들의 자식의 수 구하기
ecoli_data 를 자기 자신과 LEFT JOIN 해 부모-자식을 이어 붙이고, 자식 쪽을 COUNT 해 개체마다 자식 수를 센다.
SELECT outs.animal_id, outs.name
FROM animal_ins AS ins
RIGHT JOIN
animal_outs AS outs
ON ins.animal_id = outs.animal_id
WHERE ins.animal_id IS NULL
문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.
- 테이블 1회 JOIN 으로 두 테이블을 연결
- WHERE 로 조건에 맞는 행만 남김
없어진 기록 찾기
animal_outs 기준 RIGHT JOIN 후 입양 기록 쪽 키가 NULL 인 행만 남긴다 — 들어온 기록 없이 나간 동물.
- 테이블 2회 JOIN 으로 두 테이블을 연결
- WHERE 로 조건에 맞는 행만 남김
- ORDER BY 로 정렬 (내림차순 포함)
- 서브쿼리를 사용
- CASE WHEN 으로 조건에 따라 값을 분기
- 사용한 함수: IFNULL(), ROUND()
자동차 대여 기록 별 대여 금액 구하기
DATEDIFF+1 로 대여 일수를 구하고 CASE 로 90일·30일·7일 구간을 나눠 요금제와 조인한다. 할인율을 적용해 대여 금액을 계산하는 문제.
SELECT year(differentiation_date) AS YEAR,
(
SELECT MAX(size_of_colony) FROM ecoli_data
WHERE year(differentiation_date) = year
) - size_of_colony AS YEAR_DEV,
ID
FROM ECOLI_DATA
ORDER BY YEAR, YEAR_DEV
문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.
- WHERE 로 조건에 맞는 행만 남김
- ORDER BY 로 정렬
- 서브쿼리를 사용
- 사용한 함수: MAX(), YEAR()
연도별 대장균 크기의 편차 구하기
상관 서브쿼리로 같은 연도의 MAX(size_of_colony) 를 가져와 각 개체 크기와의 차를 구한다.
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE (FOOD_TYPE, FAVORITES)
IN
(SELECT FOOD_TYPE, MAX(FAVORITES)
FROM REST_INFO
GROUP BY FOOD_TYPE ) -- 음식 종류, 즐찾 최대 개수
ORDER BY FOOD_TYPE DESC
문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.
- WHERE 로 조건에 맞는 행만 남김
- GROUP BY 로 묶어서 집계
- ORDER BY 로 정렬 (내림차순 포함)
- 서브쿼리를 사용
- 사용한 함수: MAX()
즐겨찾기가 가장 많은 식당 정보 출력하기
(FOOD_TYPE, FAVORITES) 를 튜플째로 GROUP BY 결과와 IN 비교해, 음식 종류마다 즐겨찾기가 가장 많은 행을 고른다.
SELECT DISTINCT DEVELOPERS.ID, DEVELOPERS.EMAIL, DEVELOPERS.FIRST_NAME, DEVELOPERS.LAST_NAME
FROM DEVELOPERS, (SELECT CODE
FROM SKILLCODES
WHERE CATEGORY = 'Front End') as FRONTEND
WHERE DEVELOPERS.SKILL_CODE | FRONTEND.CODE = DEVELOPERS.SKILL_CODE
ORDER BY DEVELOPERS.ID
# SELECT DEVELOPERS.SKILL_CODE, FRONTEND.CODE, DEVELOPERS.SKILL_CODE | FRONTEND.CODE
# FROM DEVELOPERS, (SELECT CODE
# FROM SKILLCODES
# WHERE CATEGORY = 'Front End') as FRONTENDFrontEnd 개발자 찾기
스킬코드를 비트마스크로 다룬다. `SKILL_CODE | CODE = SKILL_CODE` 로 프론트엔드 비트가 켜져 있는 개발자만 고른다.
SELECT J.FLAVOR
FROM FIRST_HALF F
INNER JOIN (SELECT FLAVOR, SUM(TOTAL_ORDER) AS JULY_TOTAL_ORDER
FROM JULY
GROUP BY FLAVOR) J
ON F.FLAVOR = J.FLAVOR
ORDER BY TOTAL_ORDER + JULY_TOTAL_ORDER DESC
LIMIT 3;
문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.
- 테이블 1회 JOIN 으로 두 테이블을 연결
- GROUP BY 로 묶어서 집계
- ORDER BY 로 정렬 (내림차순 포함)
- LIMIT 3 으로 상위 3건만 조회
- 서브쿼리를 사용
- 사용한 함수: SUM()
주문량이 많은 아이스크림들 조회하기
7월 주문을 맛별로 SUM 한 서브쿼리를 상반기 테이블과 조인하고, 두 합을 더한 값으로 정렬해 상위 3개만 남긴다.
SELECT A.ID, A.GENOTYPE, B.GENOTYPE AS PARENT_GENOTYPE
FROM ECOLI_DATA A, ECOLI_DATA B
WHERE A.PARENT_ID = B.ID AND A.GENOTYPE & B.GENOTYPE = B.GENOTYPE
ORDER BY ID
문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.
- WHERE 로 조건에 맞는 행만 남김
- ORDER BY 로 정렬
부모의 형질을 모두 가지는 대장균 찾기
자기 조인으로 부모 행을 붙이고 `A.GENOTYPE & B.GENOTYPE = B.GENOTYPE` 비트 연산으로 부모 형질을 모두 포함하는지 판정한다.