1일차 2024.10.18 (SQL 입문)

칙촉·2024년 10월 18일

🎯시작 전 목표

  1. SQL 입문 강의 1주차 수강
  2. SQL 문법 연습문제 1번 풀기

💻Today I learned

SQL 입문 강의 1주차 수강

1주차 강의를 모두 듣고서 느낀 감상은, 그야말로 입문용이라는 제목에 걸맞게 기초적인 문법에 대한 강의였다.
강의를 듣고서 배운 문법에 대해 정리해보자면 다음과 같다.

  • SELECT
    테이블로부터 데이터를 가져온다.
  • FROM
    데이터베이스로부터 테이블을 가져온다.
  • WHERE
    데이터를 가져오는 조건을 제시한다.

위 세가지가 가장 기본적인 문법으로써 사용 예시는 다음과 같다.

 select _nickname, _id, _level from userdata where _level >= 100
 //100이상의 레벨을 지닌 모든 유저의 닉네임, 식별번호, 레벨을 가져와 출력

이후 문법은 자연스럽게 다양한 조건을 지정할 수 있는 문법으로 다음과 같다.

  • BETWEEN A AND B (물론 A,B는 변수이며 AND는 연산자이다)
    A와 B 사이에 해당하는 데이터를 지정한다.
  • IN(A,B)
    A와 B에 해당하는 데이터를 지정한다.
  • LIKE '%char%' (%의 위치에 따라 'char'로 시작하는 혹은 끝나는 데이터로 제한할 수 있다)
    특정 문자열을 포함하는 데이터를 지정한다.

위 문법을 모두 습득하는 것이 강의의 목표이자 기본조건이었으며 강의의 마지막으로 가벼운 테스트가 있었다.


저게 문제의 전부라면 폰 노이만이 와도 못 풀겠지만 당연히 강의때 제공된 데이터베이스를 사용한 것이기에 푸는데 큰 문제는 없었다.
별로 안궁금하겠지만 내가 제출한 답은 다음과 같다.

SELECT restaurant_name "식당명",customer_id "고객번호" FROM food_orders WHERE food_preparation_time BETWEEN 20 and 30 and cuisine_type ='Korean'

SQL 문법 연습 문제 1번..?

1주차 강의도 수강했겠다 바로 다음 목표인 SQL 문법 연습 문제를 풀기로 했다.


첫번째 문제부터 고난이 찾아왔다.
1,3,4 번은 풀 수 있다는 걸 보면 알 수 있지만 2번은 도무지 풀 방법이 보이지 않았다.
물론 위에 있는 테이블이 전부라면 그냥 position만을 조회해 모두 가져오면 되지만 그럴거면 문제의 의미가 없으므로 당연 저 테이블이 극히 일부만을 보여준다는 가정을 하고 푸는 게 모두에게 이롭다.

SQL 입문 강의 2주차 수강

결국 예정에는 없던 2주차 강의까지 듣는 수밖에 없었다.
아무리 계획적인 사람과는 거리가 멀다 해도 하루짜리 계획을 바꾸는 건 아니다.
그리하여 듣게된 2주차 강의의 내용은 요약하자면 기초적인 문법의 가벼운 응용과 그 응용을 위한 메서드, 문법의 이해였다.

2주차 강의에서 익힌 문법은 다음과 같다.

  • DISTINCT
    컬럼 내 중복되는 데이터를 종류별로 조회한다.
  • SUM, AVG, COUNT, MIN, MAX

너무 이름 그대로라 한 번에 묶었지만 예의상 적어보는 예시는 다음과 같다.

Select SUM(_price) from _boardgames where _geekRating >= 8 
//긱 레이팅이 8점 이상인 보드게임들의 가격의 합을 구한다.
Select AVG(_geekRating) from _boardgames where _votes >= 30000
//추천수가 30000 이상인 보드게임들의 평균 긱 레이팅을 구한다.
Select Count(1) from _boardgames where _geekRating >= 9
//긱 레이팅이 9점 이상인 보드게임의 수를 구한다.
Select Max(_price),Min(_price) from _boardgames
//보드게임들의 최대가격과 최소가격을 각각 구한다.
  • GROUP BY
    특정 컬럼을 기준으로 컬럼 내의 중복되는 데이터들을 그룹화한다.
  • ORDER BY
    조회한 데이터들을 정렬한다.(기본값은 오름차순 정렬이다.)

위를 모두 응용한 예시는 다음과 같다

Select _genre, count(_genre), avg(_geekrating), sum(_votes), max(_price), min(price)
From _boardgames where _votes>10000 Group by _genre Order by avg(_geekRating) desc
// 보드게임을 장르별로 그룹화 한 뒤,각각 해당 장르의 보드게임 수, 평균 긱 레이팅, 총 추천수,
// 최고가품, 최저가품을 조회해 평균 긱 레이팅을 기준으로 내림차순 정렬한다

사실 알맞은 데이터베이스가 있어도 오류가 안 나는지는 못 돌려봐서 모르겠지만 아마 될 것이다.
아님말고

아무튼간에 2강도 1강과 마찬가지로 간단한 테스트가 하나 있었다.


위의 예시를 위해 끄적인 코드를 완벽히 이해한 사람이라면 눈 감고 공중제비를 돌면서 풀어도 풀 수 있는 난이도의 문제이다.
내 답은 다음과 같다.

SELECT cuisine_type,MIN(price),MAX(price) FROM food_orders group by cuisine_type order by MIN(price) DESC  

SQL 문법 연습 문제 1번

드디어 다시 여기까지 오게 되었다.
다시 한 번 문제를 보면,

날 2강에 이끌어 낸 문제의 화근인 2번도 앞서 배운 DISTINCT 혹은 GROUP BY를 이용하면 손쉽게 해결할 수 있다.
비록 오늘 SQL이란 친구를 처음 만나서 아무런 원리도 모르지만, 단지 직급을 분류하기 위해 GROUP BY를 사용하는 것은 암만 생각해도 컴퓨터의 자원낭비가 너무 심할 것 같다는 생각이 들었다.
단지 컴퓨터의 자원낭비 뿐만아닌 전력낭비로 인한 지구 온난화의 가속화로 인한 지구의 멸망을 촉진시킬 수 있기 때문에 DISTINCT를 사용하기로 했다.

문제의 답은 다음과 같다.

Select name, position from sparta_employees
Select Distinct position from sparta_employees
Select * from sparta_employes where salary between 40000 and 60000
Select * from sparta_employees where hire_date<20230101 //timetable형인 경우(아닌 경우는 파싱하는 법을 몰라서 모름)

#마치며

어제가 내일배움캠프 사전캠프에 처음 들어가고 적응을 위한 날이었다면, 오늘부터는 본격적으로 공부를 하기 시작했다고 할 수 있다. 덤으로 지금 쓰고있는 TIL에 대해서도 생각을 해봤는데, 솔직히 글을 잘 쓰는 편은 아니라 생각해서 그냥 마음대로 적기로 했다.
오늘 배운 내용을 다시 되새김질하고, 기록한다는 자체로써의 의미를 지키며 목적성만 잃지 않는다면, 그 형식쯤이야 이런들 어떠하고 저런들 또 어떠하냐는 말이다.
라는 생각을 하는데에 너무 오랜 시간이 걸려서 공부하는 시간보다 TIL쓰는 시간이 더 길어지는 일이 발생했지만 처음이니 그런것이고 내일은 더 나아질 것이라는 생각과 함께 여기서 마친다.

profile
강세민

0개의 댓글