Tag: sql
All the articles with the tag "sql".
SELECT CONCAT('/home/grep/src/', b.board_id, '/', f.file_id, f.file_name, f.file_ext) as file_path
FROM used_goods_board AS b
JOIN
used_goods_file AS f
ON b.board_id = f.board_id
WHERE b.views = (SELECT MAX(views) FROM used_goods_board)
ORDER BY f.file_id DESC;
문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.
- 테이블 1회 JOIN 으로 두 테이블을 연결
- WHERE 로 조건에 맞는 행만 남김
- ORDER BY 로 정렬 (내림차순 포함)
- 서브쿼리를 사용
- 사용한 함수: CONCAT(), MAX()
조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기
조회수 최댓값을 서브쿼리로 구해 그 게시글의 첨부파일만 남기고, CONCAT 으로 파일 경로 문자열을 만들어 낸다.
SELECT route,
CONCAT(ROUND(SUM(d_between_dist), 1), 'km') AS total_distance,
CONCAT(ROUND(AVG(d_between_dist), 2), 'km') AS average_distance
FROM subway_distance
GROUP BY route
ORDER BY ROUND(SUM(d_between_dist), 1) DESC;
-- SELECT route,
-- CONCAT(ROUND(SUM(d_between_dist), 1), 'km') AS total_distance,
-- CONCAT(ROUND(AVG(d_between_dist), 2), 'km') AS average_distance
-- FROM subway_distance
-- GROUP BY route
-- ORDER BY total_distance DESC;
문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.
노선별 평균 역 사이 거리 조회하기
노선별로 SUM 과 AVG 를 각각 구해 ROUND 자릿수를 다르게 주고, CONCAT 으로 'km' 를 붙여 문자열로 만든다.
WITH cars_with_fee AS (
SELECT
c.car_id,
c.car_type,
FLOOR(c.daily_fee * 30 * (100 - p.discount_rate) / 100) AS fee
FROM
car_rental_company_car AS c
JOIN
car_rental_company_discount_plan AS p ON c.car_type = p.car_type
WHERE
c.car_type IN ('세단', 'SUV')
AND p.duration_type = '30일 이상'
)
SELECT
car_id,
car_type,
fee
FROM
cars_with_fee
WHERE
car_id NOT IN (
SELECT
car_id
FROM
car_rental_company_rental_history
WHERE
end_date >= '2022-11-01' AND start_date <= '2022-11-30'
)
AND fee >= 500000 AND fee < 2000000
ORDER BY
fee DESC,
car_type ASC,
car_id DESC;특정 기간동안 대여 가능한 자동차들의 대여비용 구하기
CTE 에서 30일 요금제 할인율을 FLOOR 로 적용해 두고, 해당 기간에 대여 기록이 겹치는 차를 NOT IN 으로 걸러 낸다.
SELECT pd.product_code, SUM(os.sales_amount) * pd.price as sales
FROM product as pd
JOIN
offline_sale as os
ON pd.product_id = os.product_id
GROUP BY pd.product_id
ORDER BY sales DESC, pd.product_code ASC
문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.
- 테이블 1회 JOIN 으로 두 테이블을 연결
- GROUP BY 로 묶어서 집계
- ORDER BY 로 정렬 (내림차순 포함)
- 사용한 함수: SUM()
상품 별 오프라인 매출 구하기
상품과 오프라인 판매를 조인해 SUM(수량) × 단가로 매출을 만든다. GROUP BY 는 product_id 로 하고 정렬만 product_code 를 쓴다.
-- 사번, 성명, 평가 등급, 성과금
-- 부서 정보
-- 사원 정보
-- 사원 평가 정보
WITH avg_emp AS (
SELECT he.emp_no, he.emp_name, he.sal,
CASE
WHEN AVG(hg.score) >= 96 THEN 'S'
WHEN AVG(hg.score) >= 90 THEN 'A'
WHEN AVG(hg.score) >= 80 THEN 'B'
ELSE 'C'
END AS grade
FROM hr_employees AS he
LEFT JOIN
hr_grade AS hg
ON he.emp_no = hg.emp_no
GROUP BY he.emp_no
)
SELECT emp_no, emp_name, grade,
CASE
WHEN grade = 'S' THEN sal * 0.2
WHEN grade = 'A' THEN sal * 0.15
WHEN grade = 'B' THEN sal * 0.1
WHEN grade = 'C' THEN 0
ELSE NULL
END AS bonus
FROM avg_emp
ORDER BY emp_no연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기
CTE 에서 사원별 평균 점수를 CASE 로 S·A·B·C 등급으로 바꾸고, 바깥에서 등급별 지급률을 다시 CASE 로 적용해 성과금을 구한다.
WITH quarter AS (
SELECT
CASE
WHEN(QUARTER(differentiation_date)) = 1 THEN '1Q'
WHEN(QUARTER(differentiation_date)) = 2 THEN '2Q'
WHEN(QUARTER(differentiation_date)) = 3 THEN '3Q'
WHEN(QUARTER(differentiation_date)) = 4 THEN '4Q'
ELSE NULL
END AS quarter
FROM ecoli_data
)
SELECT quarter, COUNT(*) AS ecoli_count
FROM quarter
GROUP BY quarter
ORDER BY quarter
문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.
분기별 분화된 대장균의 개체 수 구하기
QUARTER() 로 분화일을 분기 문자열로 바꾸는 CTE 를 만들고, 바깥에서 그 값으로 GROUP BY 해 분기별 개체 수를 센다.
-- 코드를 입력하세요
WITH rm AS (SELECT ri.rest_id,
ri.rest_name,
ri.food_type,
ri.favorites,
ri.address,
ROUND(AVG(review_score), 2) AS score
FROM rest_info AS ri
JOIN
rest_review AS rr
ON ri.rest_id = rr.rest_id
WHERE ri.address LIKE "서울%"
GROUP BY ri.rest_id, RI.REST_NAME, RI.FOOD_TYPE, RI.FAVORITES, RI.ADDRESS)
SELECT *
FROM rm
ORDER BY score DESC, favorites DESC;
문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.
서울에 위치한 식당 목록 출력하기
CTE 안에서 식당과 리뷰를 조인해 평점을 ROUND(AVG(), 2) 로 묶고, 주소가 '서울' 로 시작하는 곳만 남긴 뒤 평점·즐겨찾기 순으로 정렬한다.
WITH rare_item AS (
SELECT it.item_id
FROM item_info AS ii
JOIN
item_tree AS it
ON ii.item_id = it.parent_item_id
WHERE rarity = "RARE"
)
# SELECT *
# FROM rare_item
SELECT ii.item_id, ii.item_name, ii.rarity
FROM rare_item AS ri
JOIN
item_info AS ii
ON ri.item_id = ii.item_id
ORDER BY ii.item_id DESC
문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.
- 테이블 2회 JOIN 으로 두 테이블을 연결
- WHERE 로 조건에 맞는 행만 남김
- ORDER BY 로 정렬 (내림차순 포함)
- 서브쿼리를 사용
업그레이드 된 아이템 구하기
item_tree 에서 부모로 등장하는 아이템 중 rarity 가 RARE 인 것을 CTE 로 모은 뒤, 아이템 정보와 조인한다.
WITH max_fish AS (
SELECT fish_type, MAX(length) AS max_length
FROM fish_info
GROUP BY fish_type
)
SELECT fi.id, fni.fish_name, fi.length
FROM fish_info fi
JOIN
max_fish mf
ON fi.fish_type = mf.fish_type AND fi.length = mf.max_length
JOIN
fish_name_info fni
ON fi.fish_type = fni.fish_type
ORDER BY
fi.id;
문제에서 요구한 결과를 만들기 위해 쿼리에서 실제로 쓴 것들이다.
- 테이블 2회 JOIN 으로 두 테이블을 연결
- GROUP BY 로 묶어서 집계
- ORDER BY 로 정렬
- 서브쿼리를 사용
- 사용한 함수: MAX()
물고기 종류 별 대어 찾기
어종별 MAX(length) 를 CTE 로 만든 뒤 어종과 길이를 둘 다 조건에 걸어 조인해, 종마다 가장 큰 개체만 남긴다.