🐬 SQL/🏆 MySQL 문제풀이

🔓 02. 집계, CASE, JOIN 문 해커랭크 문제풀이

nyamin9 2023. 10. 10. 00:38

모바일은 화면을 돌려 가로화면으로 보시는 게 읽으시기 편할 수 있습니다. 돌려서 보시는 걸 추천드릴게요!! 

 

 


⛔ Q1. TYPE OF TRIANGLE

 

☑️ 문제

 

☑️ 풀이

- 쿼리 목표 : CASE WHEN 문을 사용하여 정삼각형, 이등변삼각형, 삼각형, 삼각형을 이루지 못하는 조건 생성 

SELECT 
CASE 
WHEN (A + B <= C) OR (A + C <= B) OR (C + B <= A) THEN 'Not A Triangle'
WHEN (A = B) AND (B = C) THEN 'Equilateral'
WHEN (A = B) OR (B = C) OR (A = C) THEN 'Isosceles'
ELSE 'Scalene'
END AS TRIANGLE
FROM TRIANGLES;

 


🔑 Q2. REVISING AGGREGATIONS - THE COUNT FUNCTION

 

☑️ 문제

 

☑️ 풀이

- 쿼리 목표 : 인구 수가 십만명이 넘는 도시의 수 추출 

SELECT COUNT(NAME) FROM CITY WHERE POPULATION > 100000;

 


🔑 Q3. REVISING AGGREGATIONS - THE SUM FUNCTION

 

☑️ 문제

 

☑️ 풀이

- 쿼리 목표 : DISTRICT가 California인 도시의 인구 수 합계 추출

SELECT SUM(POPULATION) FROM CITY WHERE DISTRICT = 'California';

 


🔑 Q4. REVISING AGGREGATIONS - AVERAGES

 

 

☑️ 문제

 

☑️ 풀이

- 쿼리 목표 : DISTRICT가 California인 도시의 인구 수 평균 추출

SELECT AVG(POPULATION) FROM CITY WHERE DISTRICT = 'California';

 


🔑 Q5. AVERAGE POPULATION

☑️ 문제

 

☑️ 풀이

- 쿼리 목표 : 인구 수의 평균 추출 및 내림 연산

SELECT FLOOR(AVG(POPULATION)) FROM CITY;

 


🔑 Q6. JAPAN POPULATION

 

☑️ 문제

 

☑️ 풀이

- 쿼리 목표 : 일본 도시의 인구수 합계 추출

SELECT SUM(POPULATION) FROM CITY WHERE COUNTRYCODE = 'JPN';

 


🔑 Q7. POPULATION DENSITY DIFFERENCE

 

☑️ 문제

 

☑️ 풀이

- 쿼리 목표 : 인구 수의 (최대치 - 최소치) 연산

SELECT MAX(POPULATION) - MIN(POPULATION) FROM CITY;

 


🔑 Q8. THE BLUNDER

 

☑️ 문제

 

☑️ 풀이

- 쿼리 목표 : (정상 급여의 평균 - 비정상 급여의 평균) 연

SELECT CEIL(AVG(SALARY) - AVG(REPLACE(SALARY, '0', ''))) FROM EMPLOYEES;

 


⛔ Q9. TOP EARNERS

 

☑️ 문제

 

☑️ 풀이

- 쿼리 목표 : 최대 임금 및 최대 임금 수령자 수 추출

SELECT (MONTHS * SALARY), COUNT(NAME)
FROM EMPLOYEE
GROUP BY (MONTHS * SALARY)
ORDER BY (MONTHS * SALARY) DESC LIMIT 1;

 


🔑 Q10. WEATHER OBSERVATION STATION 2

 

☑️ 문제

 

☑️ 풀이

- 쿼리 목표 : 위도, 경도 합계 추출

SELECT ROUND(SUM(LAT_N), 2), ROUND(SUM(LONG_W), 2) FROM STATION;

 


🔑 Q11. WEATHER OBSERVATION STATION 13

 

☑️ 문제

 

☑️ 풀이

- 쿼리 목표 : 조건을 만족하는 위도, 경도 합계 추출

SELECT ROUND(SUM(LAT_N), 4) FROM STATION 
WHERE LAT_N BETWEEN 38.7880 AND 137.2345;

 


🔑 Q12. WEATHER OBSERVATION STATION 14

 

☑️ 문제

 

☑️ 풀이

- 쿼리 목표 : 조건을 만족하는 위도, 경도 최대치 추출

SELECT ROUND(MAX(LAT_N), 4) FROM STATION
WHERE LAT_N < 137.2345;

 


🔑 Q13. WEATHER OBSERVATION STATION 15

 

☑️ 문제

 

☑️ 풀이

- 쿼리 목표 : 조건을 만족하는 위도, 경도 추출

SELECT ROUND(LONG_W, 4) FROM STATION
WHERE LAT_N < 137.2345
ORDER BY LAT_N DESC LIMIT 1;

 


🔑 Q14. WEATHER OBSERVATION STATION 16

 

☑️ 문제

 

☑️ 풀이

- 쿼리 목표 : 조건을 만족하는 위도, 경도 추출

SELECT ROUND(MIN(LAT_N), 4) FROM STATION WHERE LAT_N > 38.7780;

 


🔑 Q15. WEATHER OBSERVATION STATION 17

 

☑️ 문제

 

☑️ 풀이

- 쿼리 목표 : 조건을 만족하는 위도, 경도 최대치 추출

SELECT ROUND(LONG_W, 4)
FROM STATION
WHERE LAT_N > 38.7780
ORDER BY LAT_N LIMIT 1;

 


🔑 Q16. WEATHER OBSERVATION STATION 18

 

☑️ 문제

 

☑️ 풀이

- 쿼리 목표 : 위도, 경도의 맨해튼 거리 연산

SELECT ROUND(ABS(MIN(LAT_N) - MAX(LAT_N)) + ABS(MIN(LONG_W) - MAX(LONG_W)), 4)
FROM STATION;

 


🔑 Q17. WEATHER OBSERVATION STATION 19

 

☑️ 문제

 

☑️ 풀이

- 쿼리 목표 : 위도, 경도의 유클리드 거리 연산

SELECT ROUND(SQRT(POWER((MIN(LAT_N) - MAX(LAT_N)), 2) 
                  + POWER((MIN(LONG_W) - MAX(LONG_W)), 2)), 4)
FROM STATION;

 


🔑 Q18. POPULATION CENSUS

 

☑️ 문제

 

☑️ 풀이

- 쿼리 목표 : 조인을 통한 아시아 대륙 도시의 인구 수 합계 연산 

SELECT SUM(CITY.POPULATION)
FROM CITY
INNER JOIN COUNTRY ON CITY.COUNTRYCODE = COUNTRY.CODE
WHERE CONTINENT = 'Asia';

 


🔑 Q19. AFRICAN CITIES

 

☑️ 문제

 

☑️ 풀이

- 쿼리 목표 : 조인을 통한 아프리카 대륙 도시의 이름 추출

SELECT CITY.NAME
FROM CITY
INNER JOIN COUNTRY ON CITY.COUNTRYCODE = COUNTRY.CODE
WHERE CONTINENT = 'Africa';

 


🔑 Q20. AVERAGE POPULATION OF EACH CONTINENT

 

☑️ 문제

 

☑️ 풀이

- 쿼리 목표 : 조인을 통한 대륙 별 도시의 인구 수 평균 연산 

SELECT CONTINENT, FLOOR(AVG(CITY.POPULATION))
FROM CITY
INNER JOIN COUNTRY ON CITY.COUNTRYCODE = COUNTRY.CODE
GROUP BY CONTINENT;

 


⛔ Q21. SYMMETRIC PAIRS

 

☑️ 문제

 

☑️ 풀이

- 쿼리 목표 : 데이터 중에서 서로 SYMMETRIC한 행 추출

/* 풀이 1

데이터에서 X와 Y가 같지 않거나, 중복된 행이 있는 경우만 SYMMETRIC을 만족할 가능성이 있음
따라서 이를 제외한 경우를 필터링한 임시 데이터 TEMP 생성
그 뒤 SYMMETRIC의 조건을 WHERE 절에 사용하여 원하는 행만 출력
*/

WITH TEMP AS
(
SELECT X,Y
FROM FUNCTIONS
GROUP BY X,Y
HAVING COUNT(*) > 1 OR X != Y
)

SELECT T1.X, T1.Y
FROM TEMP AS T1
INNER JOIN TEMP AS T2 ON T1.X = T2.Y AND T1.Y = T2.X
WHERE T1.X < T1.Y OR T1.X = T1.Y
ORDER BY T1.X;
/* 풀이 2

같은 X,Y를 가지고 있는 두 행으로 이뤄진 SYMMETRIC과
다른 X,Y를 가지고 있는 두 행으로 이뤄진 SYMMETRIC을 각각 찾아
UNION
*/

-- 1. Find SYMMETRIC in two rows with the same X and Y: 13 13
SELECT X,Y
FROM FUNCTIONS
GROUP BY X,Y
HAVING COUNT(*) = 2

UNION 

-- 2. Find SYMMETRIC in two rows with the each other X and Y: 20 21 / 21 20
SELECT F1.X, F1.Y
FROM FUNCTIONS AS F1
INNER JOIN FUNCTIONS AS F2 ON F1.X = F2.Y AND F1.Y = F2.X
WHERE F1.X < F1.Y

ORDER BY X;

 


📌 피드백

- 중복 열이 있는 데이터 간의 INNER JOIN : 어떤 테이블의 열인지 명시해서 쿼리할 것 (CITY.NAME)

- ROUND IT UP : 올림 (CEIL)

- 중복 데이터 쿼리문

SELECT column, COUNT(column)
FROM table
GROUP BY column
HAVING COUNT(column) > 1;

 

📣 SQL 배지 4 STAR 달성