SQL 공부 2일차_HackerRank(!=, CASE, JOIN, GROUP BY)
다양성과 방향성

여행으로 재미있게 살고 엑셀로 성장하는 삶

직무강화/SQL

SQL 공부 2일차_HackerRank(!=, CASE, JOIN, GROUP BY)

LATI 라티 2024. 8. 18. 15:59
반응형

 

패스트캠퍼스 강의를 들으며 이용했던 HackerRank Khan이랑 달리 토론하는 곳이 있어 답을 확인할 수 있다.

 

구문이 잘못되었을 때 뭐가 문제인지 찾아보는게 참 어려운데 그래도 힌트를 볼 수 있어 좋다.

Chat gpt에게 정답을 알려달라고 하면 바로 답이 나오기 때문에 생각을 할 수 있는 힘을 기르기 위해선 힌트가 필요했다.

 

그렇게 다시 들어온 HackerRank. 기본적으로 지문이 다 영어로 되어있다보니 이해하는데도 시간이 쫌 걸린다.

그래도 코드를 활용해야 한다면 영어가 기본일테니.... 조금씩 해보자!

 

삼각형 종류를 나누어 출력

 

이 문제는 삼각형에 대한 정의부터 이해해야 풀 수 있다.

기본적으로 CASE 1 > 2 > 3 > 4 로 넘어갈 때 앞에서 충족하면 해당케이스로 고정되기 때문에

더 큰 범위의 조건먼저 부여해서 쿼리를 짜야 했다. 

 

즉, 삼각형이 아닌 것 > 등변 삼각형, 이등변 삼각형, 삼각형 과 같은 순서로 짜야 한다.

쉽게 얘기하면 성적이 90점이상 = A / 80점이상 = B / 70점이상 = C ELSE = F로 해서 쿼리를 짤 때

 

  1안 : 70점 이상인 경우 C라는 조건을 먼저 부여했을 때 70점 이상인 점수들은 모두 C가 나오기 때문에 

  2안 : 90점 이상인 경우 > 80점 이상인 경우 > 70점 이상인 경우로 쿼리를 짜야 한다.

 

  EX) 90 50 80 40 65 70 90 

  1안 : C F C F F C C

  2안 : A F B F F C A

[1. SQL 구문으로 다시 알 수 있었 던 것]
 1.1. 값이 다르다 : !=
 A,B,C가 다를 때 표현 하는 방법  A!=B AND B!=C AND A!=C

 1.2. 값이 같다 : = (각각의 경우를 표기해주어야 함, 축약 X)
 A,B,C가 같을 때 표현 하는 방법 A=B AND B=C AND A=C

 1.3. CASE 구문
 SELECT에서 사용할 수 있으며, END AS TITLE 
 앞의 구문들이 적용된 하나의 열로서 활용 가능 (TITLE 열)

 

 

대륙의 이름과 평균 인구(라운드 다운한 것)를 2개의 테이블에서 뽑아보세요.

 

이 문제는 CITY, COUNTRY 두개의 테이블을 합쳐서 대륙명과 인구의 평균값(라운드 다운)을 표현하는 문제이다.

총 3번의 코드를 작성했는데, 3가지를 몰라서 이번에 깨닫게 되었다.

 

 

1차코드 : ROUND, AVG, 테이블.열 배치 방법

EXCEL을 잘 다루기에 ROUND, AVG 사용법은 알고 있으나 CITY.population을 어떻게 적용시켜야 하는지 몰랐다.

CITY.ROUND(avg(population))  → ROUND(avg(CITY.population)

 

SELECT COUNTRY.continent, CITY.ROUND(avg(population))
FROM COUNTRY
JOIN CITY 
ON COUNTRY.code = CITY.countrycode


 

2차코드 : GROUP BY의 필요성

JOIN으로 테이블을 합친 이후에는 필드값들을 호출해도 그룹핑하지 않으면 노출되지 않는다.

PK, FK인 CODE로 JOIN하여 두 테이블을 엮은 이후 각각의 테이블에서 원하는 값을 노출시키려면

GROUP BY로 기준을 잡아야 한다.

 

추가 조건은 HAVING으로 해결하면 되긴 하는데, 사실 SQL의 세부 기능들은 대략 아는데 기작원리가 머리에 다 들어가있지 않아서 생기는 일들인 것 같다. 계속 연습하여 세부규칙이 머리에 들어오고 테이블 조인들이 그려진다면 쉽게 할 수 있을 것 같다는 생각이 든다.


SELECT COUNTRY.continent, ROUND(avg(CITY.population))
FROM COUNTRY
JOIN CITY 
ON COUNTRY.code = CITY.countrycode

 


 

3차코드 : FLOOR

뜻은 알고 있지만 활용은 처음 해본다. 값의 특정부분을 버리는 함수인데,

ROUND DOWN 하여 INTEGER로 추출하라고 할 때 사용하면 되는 걸 알 수 있었다.

 

SELECT COUNTRY.continent, FLOOR(avg(CITY.population))
FROM COUNTRY
JOIN CITY 
ON COUNTRY.code = CITY.countrycode
GROUP BY COUNTRY.continent

 

 

 

반응형