[MySQL] SQL HackerRank 문제 풀이 2주차

Eunsuh Kim·2023년 3월 24일
0

SQL

목록 보기
3/3

Basic Select

Weather Observation Station 6

문제 원문

SELECT DISTINCT CITY 
FROM STATION
WHERE CITY REGEXP '^[aeiou]';

Weather Observation Station 7

문제 원문

SELECT DISTINCT CITY 
FROM STATION
WHERE CITY REGEXP '[aeiou]$';
  • "Your result cannot contain duplicates" -> DISTINCT 활용

REGEXP

  • LIKE와 같은 패턴 매칭 연산자 (정규표현식). 추가적인 정리는 여기

Weather Observation Station 8

문제 원문

SELECT DISTINCT CITY
FROM STATION
WHERE CITY REGEXP '^[aeiou]' AND CITY REGEXP '[aeiou]$';
  • AND 쓸 때는 조건절(CITY REGEXP) 처음부터 다시 써줘야 함.

Advanced Select

  • (추가 예정)

Aggregation

Weather Observation Station 18

문제 원문

SELECT ROUND(MAX(LAT_N)-MIN(LAT_N) + MAX(LONG_W)-MIN(LONG_W), 4)
FROM STATION;
  • Manhattan Distance
    p1(x1, y1)과 p2(x2, y2) 간 거리 구하고자 할 경우

    d(p1,p2)=x1x2+y1y2\displaystyle d(p1, p2)=|x1 - x2| + |y1 - y2|
  • ROUND

SELECT ROUND(숫자, 자릿수 n) -- 숫자를 소수점 이하 n번째 자리로 반올림
  • 숫자 함수에 대한 추가적인 정리는 여기

Weather Observation Station 19

문제 원문

  • format your answer to display decimal digits -> ROUND, TRUNCATE 다 되는 것 같음

SELECT TRUNCATE(SQRT(POW(MAX(LAT_N)-MIN(LAT_N),2)+POW(MAX(LONG_W)-MIN(LONG_W),2)), 4)
FROM STATION;
  • Euclidean Distance
    d(p,q)=(q1p1)2+(q2p2)2.{\displaystyle d(p,q)={\sqrt {(q_{1}-p_{1})^{2}+(q_{2}-p_{2})^{2}}}.}
  • POW -> SQRT -> TRUNCATE 순으로

POW

  • n제곱
SELECT POW(x, y); --- x의 y제곱 값을 반환

SQRT

  • 제곱근
SELECT SQRT(x); --- 양수 x의 제곱근 반환

TRUNCATE

  • 소수점 이하 n번째 자리로 버림
SELECT TRUNCATE(10.49, 1); --- 10.4

Basic Join

Average Population of Each Continent

문제 원문

SELECT COUNTRY.Continent, FLOOR(AVG(CITY.Population))
FROM CITY JOIN COUNTRY ON CITY.CountryCode = COUNTRY.Code
GROUP BY COUNTRY.Continent;

FLOOR

  • 정수로 버림
SELECT FLOOR(3.24); --- 3
  • 대륙별 도시들의 '평균' 인구를 구하려면 AVG를 한 후 GROUP BY를 해줘야 함.

  • 안 그러면 에러 남.

  • GROUP BY를 사용하는 경우, SELECT할 수 있는 컬럼은 GROUP BY에 나열된 컬럼과 SUM(), COUNT() 같은 집계 함수(Aggregation Function)으로 한정. 따라서 SQL 표준 문법은 GROUP BY 사용시 SELECT의 컬럼 중 집계함수에 쓰이는 것을 제외한 모든 칼럼을 기입해야 한다.

The Report

문제 원문

SELECT IF(GRADES.Grade<8, NULL, STUDENTS.Name), GRADES.Grade, STUDENTS.Marks
FROM STUDENTS JOIN GRADES 
ON STUDENTS.Marks BETWEEN GRADES.Min_Mark AND GRADES.Max_Mark
ORDER BY GRADES.Grade DESC, STUDENTS.Name, STUDENTS.Marks;

Non-EQUI JOIN (비등기 조인)

  • 꼭 두 테이블의 컬럼이 같은 값을 가질 때만 JOIN을 사용할 수 있는 것은 아님
  • 이 경우에는 = 연산자가 아닌, BETWEEN, >, >= 와 같은 연산자를 이용하여 JOIN을 정의
SELECT 테이블1.컬럼명, 테이블2.컬럼명
FROM 테이블1, 테이블2
WHERE 테이블1.컬럼명1 BETWEEN 테이블2.컬럼명1 AND 테이블2.컬럼명2;

출처: https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=pjok1122&logNo=221542110221

여러 개의 ORDER BY 사용

  • 여러 개의 ORDER BY 사용 가능
  • 왼쪽부터 순차적으로 진행되기 때문에 순서 고려 필요

AS (별칭) 사용하기

  • 위의 쿼리에서
FROM STUDENTS AS S
JOIN GRADES AS G

와 같이 별칭을 지정해주면 더 간단한 쿼리를 작성할 수 있다.

IF-ELSE문

  • 작성 방법은 엑셀의 =IF()와 같음
SELECT IF(조건문, 참일 때 값, 거짓일 때 값)
profile
안녕하세요!

0개의 댓글