SELECT ROUND(AVG(DAILY_FEE),0) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = "SUV"
국비교육에서 SQL에 대해서 배우기 시작했다.
기존에 SQLD , 정보처리기사 자격증을 취득하면서 SQL에 관련해서 접해본 경험이있었다.
물론, 직접 타이핑을 해본게 아니라 눈으로만 보면서 A4용지에 풀었던 정도였고
그 마저도 시간이 조금 지나서 관련 지식들이 많이 증발한 상태였다.
그래도 이론적으로 공부를 했던걸 떠올리며 작성을 해보니까 1단계 정도는 무난하게
풀 수 있었던 것 같다.
다만, 한 가지 까먹고 있던 내용이 ROUND 함수인데
종특인진 모르겠지만 난 문제의 지문을 이해하는데 시간이 조금 오래 걸리는 편이고
잘 이해를 하지 못한다. 그래서 처음 저 문제를 풀 때 쉽다고 느껴져서
ROUND 부분만 빼고 AVG까지만 작성해놓고 문제 실행을 했었는데 원하는 답이 나오지 않았고
뒤늦게 예시 부분에서 한 자리 숫자를 반올림해서 출력해라는 부분을 확인했다.
ROUND 함수도 SQLD 공부를 할 때 배웠었는데 처음에 떠올리질 못해서
결국, 구글에 소수점 반올림 함수를 검색해서 관련 함수를 찾아내고 떠올렸다.
여담으로 막히는 부분을 이렇게 검색해서 관련 함수를 찾아 풀어도 되는걸까?
SELECT F.FLAVOR
FROM FIRST_HALF ASFINNER JOIN ICECREAM_INFO ASI
ON F.FLAVOR = I.FLAVOR
WHERE F.TOTAL_ORDER > 3000 AND I.INGREDIENT_TYPE = "fruit_based"
ORDER BY F.TOTAL_ORDER DESC;
처음 딱 설명을 읽지 않고 문제를 먼저 봤을 때 어려울게 없을 것 같다고 느껴졌다.
문제를 보면서 풀어보다가 테이블이 두 개 라는걸 인지하고 난 뒤
옛날에 공부를 하면서 봤던 JOIN문을 사용해야겠다. 라고 생각을 했고
작업을 하던 중 문제 부분과 동일히 풀었지만 계속 한 가지 걸리던 점
저 melon 부분이 출력되지 않아서 계속 삽질을 했었고 추후에는 저 부분이 말 그대로
예시였을 뿐 이라는걸 깨닫게 되었다.
이 부분도 질문하기 부분을 보면 꽤 많은 사람들이 나랑 같은 혼동을 느꼈던 것 같은데
내가 난독인진 모르겠지만, 아무튼 문제를 다 풀고 난 뒤 예시 부분을 봐도 이해가 가지 않았다.
또 한가지 문제가 되었던 점은 너무 오랜만에 JOIN문을 접하다 보니까 ON 절 부분을
생각하지 못 했었고 INNER JOIN만 한 뒤 ON 절 조건을 추가하지 않아서 계속 중복되는
데이터 값이 출력되는 걸 해결하지 못했고 결국 이 부분도 검색을 통해서 중복되는 데이터를
해결하게 되었다.
이 문제 역시 1단계로 아주 쉬운 문제 중 하나이고 기존 자격증을 공부할 때 접했었던
SQL들에 비해선 깊이가 좀 많이 낮았던 것 같지만 역시 이 부분도 오랜만에 접했던 것들이라
아직은 익숙하진 않은 것 같다.
다음 문제를 풀어보자.
SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_FORMAT(DATE_OF_BIRTH, '%Y-%m-%d')
FROM MEMBER_PROFILE
WHERE MONTH(DATE_OF_BIRTH) = 3 AND GENDER = "W" AND TLNO IS NOT NULL
ORDER BY MEMBER_ID;
이 번 문제는 2레벨 문제인데, 데이트 포멧 함수를 몰라서 그랬던 것 말고는
기존의 1레벨 문제보다 훨씬 쉬운 문제였다.
이 문제의 기점은 DATE_FORMAT 함수를 알고있냐. 라는 문제인 것 같고
DATE_FORMAT 함수를 알고 있었다면 1분도 채 걸리지 않았을 문제였겠지만,
아쉽게도 자격증 공부를 하면서 저 DATE_FORMAT 함수를 접해본 적이 없었다.
알고리즘 문제도 그렇고 이번 SQL 문제를 풀어보면서 느낀 점은 어떻게 풀어야할진
알겠지만 그걸 표현해낼 수 있는 함수를 모른다면 검색을 해보는게 정답인 것 같다.
오랜 시간 그 문제를 풀려고 혹은 그 문제를 다르게 풀 수 있는지 머리를 굴려보는 것 보다
잘 만들어진 함수 메서드들을 찾아서 그 함수를 배우고 사고력을 기르는게
이 코딩 테스트의 주 목적인 것 같다.
물론, 끈기를 가지고 한 문제를 오래 풀어보는것도 좋은 고민일수도 있는게
많은 문제를 풀어보진 않았지만
그 문제를 풀기에 앞서 많은 고민을 하다보면 여러가지 케이스들이 나오고 그 케이스들을
이용해서 문제를 푸는 순간 그 방식이 오랫동안 기억에 남으면서 내 것이 되는 느낌을
받은 적이 몇 번 있다.
SELECT A.REST_ID, A.REST_NAME, A.FOOD_TYPE, A.FAVORITES, A.ADDRESS, ROUND(AVG(B.REVIEW_SCORE),2) as SCORE
FROM REST_INFO as A INNER JOIN REST_REVIEW as B
ON A.REST_ID = B.REST_ID
WHERE A.ADDRESS LIKE "서울%"
GROUP BY A.REST_ID, A.REST_NAME, A.FOOD_TYPE, A.FAVORITES, A.ADDRESS
ORDER BY SCORE DESC, FAVORITES DESC;
이 문제는 4레벨 문제이다.
결론만 말하면 너무 쉬웠다.
일단 이 전에 ROUND 함수를 이용해서 문제를 풀어봤기에 가장 큰 걸림돌이던
반올림 문제는 쉽게 해결을 했고, 서울을 거르는 조건인 LIKE 연산자
즉, 와일드 카드를, 와일드 카드를 이용하는 방식은 자격증 공부를 하면서
가장 단골 문제의 연산자였기에 익숙했으며,
기본적인 SELECT의
SELECT , FROM , WHERE , GROUP BY, HAVING , ORDER BY 구조는
잊을 수 없을만큼 공부했고, 외웠던 구조라서 더 쉽게 느껴졌을 수 있을 것 같다.
아마, SQL에 대해서 문제를 통해 점점 익숙해졌기에 그런 느낌이 들었던 것 같기도 한데
막상 ANY, ALL 함수나 EXISTS 함수를 사용하여 제한을 걸거나 관계 대수를 사용하는
문제들이 아니기에 직관적으로 문제에서 답을 알려주는 것과 같아서 그대로 따라서 작성하면
되는 문제들이라 이런 문제들이 오히려 쉬운 문제로 보인다.
SELECT DR_NAME, DR_ID, MCDP_CD, DATE_FORMAT(HIRE_YMD, "%Y-%m-%d")
FROM DOCTOR
WHERE MCDP_CD = "CS" OR MCDP_CD = "GS"
ORDER BY HIRE_YMD DESC, DR_NAME
국비교육에서 숙제로 내주신 문제 5문제를 풀어보았다.
점점 익숙해져서 마지막 문제 역시 쉽게 풀었고
확실히 프로그래밍 언어보다는 SQL 언어가 많이 쉬운 느낌을 받았다.
ROLLUP , CUBE , GROUPING SETS 같은 집계 함수나
여러가지 함수들, 그리고 제약 같은 것들이 들어가거나 더 깊게 들어간다면
SQL문법이 프로그래밍 언어 못지 않게, 혹은 그 이상으로 어려웠을 수 있을텐데
적어도 현재로서는 프로그래밍 언어 보다는 받아들이는 부분이 쉽고
코드 또한 직관적으로 읽고 쓸 수 있게끔 만들어져 있어서 확실히 더 편리한 느낌이 들었다.
다만 이렇게 느낀 이유는 DDL , DML , DCL 중 일부분의 기능에 들어가고
또 그 일부분의 기능 중 한 가지를 문제로 내는거라 그렇게 느껴졌을것이다.