내일 배움 캠프 사전캠프 TIL
2일 차에 느낀 개인적인 에세이
취업 인턴 준비와 직무교육 사이에서의 줄타기를 하고 있는 나의 모습을 보면 꼭 밧줄에 올라간 곡예사가 아슬아슬한 줄타기를 하고 있는 것처럼 보인다. 앞으로 인생을 살면서 이만한 큰 갈림길을 또 찾을 수 있을지 또한 의문이 든다. 영화 <쇼생크 탈출>에서 등장인물 앤디 듀프레인이 축구장 4개 길이의 파이프를 지나며 도중에 몸을 반대방향으로 돌릴 수도 없어 앞으로만 가야 하는 심정처럼, 일단 나에게 주어진 임무인 SQL 강의를 들으며 실습을 하고 있는 중이다.
하고 싶은 것이 많아서 많은 분야에 발을 걸치고 있는 것인지, 우유부단한 성격 때문에 아직도 내가 어떠한 방향으로 취업을 해야 할지를 고민하고 있는 것인지 나 자신도 모르겠다. 오늘 하루 날씨가 여름에서 가을로 바뀌기 직전인 것처럼 소나기가 내리다가 말다가를 지속하던데, 현재 내 심정을 대변해 주는 것처럼 보였다. 여름도 가을도 아닌, 뜨겁지도 미지근하지도 않은, 윷놀이에서 '걸'이 된 느낌이네.
배운 점은? (SQL)
주말에 하루씩 SQL 한 주차를 다 들어야겠다고 다짐한 나의 생각은 보란 듯이 거품이 되어버렸다. 밀려있던 토익 강의가 8월 31일까지라 남은 15시간의 강의를 모조리 들어야 했기 때문이다. 때문에 평일이 된 오늘, 1주 차 남은 강의와 2주 차 강의를 다 들었다.
컬럼에 관해 추가로 필터링을 하고 싶을 때 유용한 표현으로는 비교연산, between, in, like로 총 4개가 있다.
(1) 비교연산은 같다(=), 같지 않다(<>), 크다(>), 크거나 같다(>=), 작다(<), 작거나 같다(<=)가 있다. 예시로, customers 테이블에서 나이가 40세 이상인 고객을 조회한다면...
이렇게 쓰면 된다.
(2) 영어 문법처럼 between A and B는 A와 B 사이의 모든 값을 불러온다. 며칠 전 토익에서 배운 문법이 데이터 처리 과정에서도 사용되는 것을 보고 반가웠다.
(3) 컬럼 안에 각 항목들이 있으면, 각 항목들 안에 있는 모든 목록을 불러오기 위해서는 in을 써야 한다. in사용할 때는 괄호를 써야 한다는 점을 잊지 말자. 또한 in 뒤에 문자를 쓰거나 숫자를 쓸 수 있는데, 숫자를 쓸 경우 그냥 써도 괜찮지만, 문자를 쓸 경우 작은따옴표를 써야 한다. 개인적으로 in을 쓸 경우 1일 차에서 별명을 붙일 때 as " "로 통일해서 쓰겠다고 말했던 것처럼, in 뒤에 숫자든 문자든 그냥 작은따옴표를 써서 처리하고 있다.
(4) 완전히 똑같지는 않지만, 비슷한 값을 조건으로 줄 때 like를 쓴다. 말로 설명해서는 이해가 잘 안 되므로 fig 4. 를 참고하여 이해하자.
추가로 like를 쓸 때는 문자의 경우 작은따옴표를 쓰는 것을 잊지 말아야 하는데, 이는 in의 조건과 동일하기 때문에 마찬가지로 like 뒤에 숫자든 문자든 그냥 작은따옴표를 써서 처리하고 있다. 또한 like의 경우 특정한 문자로 시작할 때 like + '시작문자%', 특정한 문자를 포함할 때 like + '%포함문자%', 특정한 문자로 끝날 때 like + '%시작문자'로 쓴다.
논리연산을 통해 여러 개의 조건으로 필터링하는 과정도 전혀 무서워할 필요 없다. 여러 개의 조건을 사용하는 연산이 논리연산자이며, and, or, not으로 총 3개가 있다.
(1) 앞의 조건과 뒤의 조건을 모두 만족시키기 위해서는 and를 사용한다. 집합으로 비유한다면 A와 B의 교집합이라 생각하면 편하다.
(2) 하나의 조건만 만족하면 데이터가 조회되는 구문을 사용하고 싶을 때는 or을 사용한다. 집합으로 비유한다면 and와 반대로 A와 B의 합집합이라 생각하면 편하다.
(3) 같지 않다는 조건은 앞서 설명한 것처럼 부등호를 2개 붙여 <>로 표현할 수 있다고 말했는데, 이와 같은 원리로 not을 사용하여 표현할 수도 있다. 실습을 하지는 않았지만 개인적으로는 <>보다 not을 사용하는 것이 더 편리할 것 같다.
SQL 1주 차에 대해 간단한 회독을 진행한 후 바로 SQL 2주 차 강의를 수강했다. 갑자기 1주 차보다 난이도가 확 어려워져 머리에 지진이 날 뻔했다.
엑셀처럼 SQL에서 사칙연산을 사용할 수 있으며, SUM, AVERAGE, COUNT, MIN, MAX로 총 5가지가 있다.
(1) 컬럼에 존재하는 각 항목의 모든 값을 더할 때 SUM을 사용하며, 구문에 SUM을 표현할 때는 +를 쓴다. 응용으로 SQL 1주 차에서 배운 as " "를 통해 보통 합한 값을 나타내는 컬럼에 새로운 별명을 붙이며, 더하기뿐만 아니라 빼기(-), 곱하기(*), 나누기(/)도 + 자리에 넣을 수 있다.
음식 준비 시간과 배달 시간을 합쳐 총 걸리는 시간의 데이터를 구하였다.
(2) 컬럼의 모든 항목을 더하는 SUM이 있다면, 컬럼의 모든 항목의 평균값을 나타내는 AVERAGE도 존재한다. 구문에 AVERAGE를 표현할 때는 AVG로 축약해서 쓴다. 사용 시 AVG 바로 뒤에 괄호를 붙여 괄호 안에 평균을 구하고 싶은 컬럼의 이름을 적으면 된다.
두 번째 줄에서 average를 사용하여 평균 배달 시간을 구하였다.
개수와 관련하여 쓸 수 있는 구문은 COUNT와 DISTINCT가 존재한다.
(1) 테이블 안에 있는 여러 데이터의 개수를 셀 때 COUNT 함수를 사용한다. 따라서 count()의 괄호 안에 컬럼명을 적어도 되지만, 테이블 안에 있는 모든 데이터의 개수를 셀 때는 count(*) 또는 count(1)이라 쓴다.
(2) COUNT처럼 모든 데이터의 개수가 필요한 것이 아닌, 컬럼에 몇 개의 값을 갖고 있는지를 확인하고 싶다면 DISTINCT를 쓴다. 예를 들어 주문 건은 10개인데, 주문한 사람은 5명이면 count(1)의 경우 주문 건인 10개가 다 나오지만, distinct(고객명)을 적으면 몇 명의 고객이 주문을 했는지가 나오므로 5개가 나오게 된다. 사실 예시를 들어도 아직까지 이해가 잘 되지 않는 지식 중 하나다. 관련된 지식을 추가로 찾아야 할 필요가 있다.
Fig 10이 해당 데이터 구문이 앞서 설명한 예시를 뒷받침하는 구문이다.
앞서 설명한 사칙연산뿐만 아니라 최댓값과 최솟값을 나타내는 min과 max를 통해 범위를 구할 수 있다(!!) '가격' 컬럼이 있다는 예시를 들고 설명을 이어가겠다.
(1) 테이블 안에 가격 컬럼 내에서 가격의 최솟값을 알고 싶다면 min(가격)이라 적는다. 나오는 데이터는 가장 낮은 가격을 가진 항목만 나오게 되며, 중복일 경우 여러 개가 나올 수 있다.
(2) 반대로, 테이블 안에 가격 컬럼 내에서 가격의 최댓값을 알고 싶다면 max(가격)이라 적는다. 나오는 데이터는 가장 높은 가격을 가진 항목만 나오게 되며, 중복일 경우 여러 개가 나올 수 있다. 추가로, 가장 최근 날짜를 나타낼 때도 max를 사용해서 나타낸다.
첫 번째 줄의 데이터 구문이 수량의 최댓값을 구한 것이고, 두 번째 줄의 데이터 구문이 수량의 최솟값을 구한 것이다. Fig 11처럼 만약 select 내 최댓값과 최솟값 데이터를 동시에 나타내고 싶다면 쉼표 , 을 사용한 후 다른 범위에 대한 구문을 적도록 하자. 사전에 문제를 푸는 과정에서 쉼표를 적지 않은 후 데이터 처리를 통해 30분 간 해당 오류와 씨름했었다...
추가로 자주 쓰이는 구문은 group by와 order by가 있다. 해당 구문들에 대해서 알아보도록 하자. '음식 가격, 음식 종류' 컬럼이 있다는 예시를 들고 설명을 이어가겠다.
(1) 음식의 종류 별로 가격의 합계 또는 평균값을 구하고 싶을 때 SUM이나 AVERAGE를 쓴다면 음식 가격의 합계 또는 평균값을 구할 수 있다. 음식 가격의 평균값을 구했다고 해서 각 음식 종류의 음식 가격 평균값을 구할 수 있는 것일까? 아니다. 실제로 데이터를 얻으면 모든 음식 종류의 음식 가격 평균값을 한 항목으로 간추린 값을 얻게 된다. SQL에서는 각 음식 종류에 해당하는 평균적인 데이터를 얻고 싶다면 추가로 SQL에 명명을 하는 구문을 넣어줘야 하며, 이때 쓰이는 구문이 group by다. group by에 select 절에 적은 구문을 복사 후 붙여 넣기로 그대로 넣는다면 내가 어떠한 값을 묶어서 명명을 할 것이라는 것을 데이터베이스에 명령할 수 있게 된다. 쉽게 말해서, group by 절에는 위에서 묶고 싶은 범주형 컬럼을 모두 적어주는 것이다.
앞서 언급한 내용을 토대로 group by를 사용하여 관련된 데이터를 얻을 수 있다.
가장 최근 날짜를 나타낼 때 max를 사용하여 조회할 수 있으며, group by를 사용함으로써 각 결제 종류별 최근 날짜를 구할 수 있게 되었다.
(2) 한 컬럼을 기준으로 값을 정렬할 때 order by를 쓴다. group by를 사용하여 음식 종류 별로 가격의 평균값을 구했다면, 한눈에 보기 쉽게 정렬하기 위해 order by avg(값)을 사용하여 오름차순 정렬을 할 수 있다. 반대로 descend의 의미를 갖는, 내림차순 정렬을 하기 위해서는 order by avg(값) desc를 사용한다. 또한 가격 말고도 문자형을 사용했을 때 '가나다라'순으로 정렬이 가능하다.
추가로 order by 뒤에 성별과 이름을 적어 정렬을 한다고 가정하면 적는 순서에 따라서 기준 순위가 달라진다. 만약 order by gender, name을 적는다면 자음 순으로 정렬 후 그 안에서 남성, 여성을 정렬해 주고, 성별을 적는다면 남성의 이름을 먼저 정렬한 후 여성의 이름을 정렬한다.
마치며
여러 select 내 구문을 적는 과정에서는 항상 쉼표 , 을 사용해야 하는 것을 여실히 깨닫게 해주는 하루가 된 것 같으며, 단기간에 빠르게 SQL 관련 교육을 들은 만큼 내일 까먹지 않게 반복적인 회독이 중요할 것 같다는 생각을 하게 되었다.