TigerCow.Door


안녕하세요. 문범우입니다.

이번 포스팅에서는 SUM, AVG, MIN, MAX와 같은 집계함수들에 대해서 알아보면서 GROUP BY절HAVING절에 대해서 다뤄보도록 하겠습니다.


1. 집계함수


집계함수는 값에 대해서 특정 연산을 수행하는 함수들을 이야기합니다.

합계를 구하는 SUM함수나 평균을 구하는 AVG함수, 개수를 세는 COUNT함수 등이 대표적입니다.

그럼 아래와 같이 이전 포스팅에서 사용했던 SampleDB를 사용하여 몇가지 집계함수에 대해서 함께 알아보도록 하겠습니다.




- SUM


SUM함수는 말 그대로 합계를 구하는 함수 입니다.

employee 테이블에서 연봉의 합계를 구하고자 할 때와 같은 경우에 아래와 같이 사용할 수 있습니다.


SELECT SUM(salary) FROM employee;




그럼 이번에는 employee 테이블에서 commission의 합계를 구해볼까요?

하지만 commission에는 NULL값이 포함되어 있습니다. 이전에는 NULL에 대한 연산을 진행할 때 그 결과가 NULL이 나오게 되어서 ISNULL이라는 함수를 이용했습니다.

그럼 집계함수에서는 어떨지 한번 확인해볼까요?


SELECT SUM(commission) FROM employee;



위의 결과에서 볼 수 있듯이 집계함수에서의 NULL은 무시가 됩니다.



- AVG


이어서 AVG함수에 대해서 알아봅시다.

AVG함수는 평균을 구하는 함수입니다. 그럼 월급의 평균은 어떠한지 확인해보도록 하겠습니다.


SELECT AVG(salary) FROM employee;



AVG함수 또한 NULL값이 존재할 때에는 NULL값은 무시하고 평균을 구하게 됩니다.



- MIN, MAX


MIN과 MAX는 최대값과 최소값을 구하는 함수 입니다.

다음과 같이 월급의 최소값과 최대값을 구해보도록 하겠습니다.


SELECT MIN(salary), MAX(salary) FROM employee;




- COUNT


마지막으로 알아볼 COUNT 함수는 개수를 세는 함수입니다.

이때 COUNT 또한 NULL값은 무시하게 됩니다. 즉, 값이 존재하는 데이터에 대한 개수만 세는 것이죠.

따라서 salary의 COUNT값과 commission의 COUNT값은 서로 다릅니다.


SELECT COUNT(salary), COUNT(commission) FROM employee;





2. GROUP BY


그런데 만약, 직급별 월급 평균, 월급 합계 등 특정 그룹별로 집계함수를 사용하고 싶을때는 어떻게 할까요?

테이블에서 특정 그룹을 만들 수 있도록 하는 것이 바로 GROUP BY 절 입니다.


즉, GROUP BY 'A' 라고 한다면 A칼럼에서 같은 것끼리 묶어서 하나의 GROUP를 만드는 것이죠.


그럼 바로 GROUP BY를 활용해보도록 하겠습니다.

위에서 이야기한 바와 같이 직급별 월급 평균은 다음과 같이 구할 수 있습니다.


SELECT job 직급, AVG(salary) 월급평균

FROM employee GROUP BY job;



위와 같이 직급별로 GROUP이 되어 AVG함수의 값이 나오는 것을 볼 수 있습니다.


하지만 우리가 다음과 같이 SELECT 문을 구성한다면 어떻게 될까요?


SELECT empName 이름, job 직급, AVG(salary) 월급평균

FROM employee GROUP BY job;


위의 구문을 실행시키면 아래와 같이 오류가 발생하게 됩니다.



오류메세지를 읽으며 한번 왜 오류가 발생하는지 생각해봅시다.

우리가 출력하고자 하는 empName 값이 집계함수에도 없고, GROUP BY 절에도 없어서 사용할 수 없다고 하네요.

그럼 empName이 집계함수나 GROUP BY 절에 있어야 한다는 의미인데, 왜 그럴까요?


우리가 결과를 출력하는 입장이라고 한번 생각해봅시다.

empName이 없을 때는 이전의 결과와 같이 직급과 월급평균을 잘 출력할 수 있었습니다.

예를 들어 과장의 월급평균은 483이란 결과를 가져왔죠.

그런데 이때 해당 레코드(행)에 empName을 출력해야 한다면, 어떠한 empName을 출력해야 할까요?

즉, 과장 직급의 483의 평균월급이라는 레코드는 '과장'이라는 값으로 여러개의 레코드가 그룹이 되어 있는 레코드 입니다. 즉 해당 레코드에는 여러개의 empName이 존재하는 것이죠.

따라서 SQL에서는 그 여러개 중에서 하나를 출력할 수 없기에 오류가 발생하는 것입니다.

만약 empName이 집계함수를 적용시키면 집계함수에 따른 값이 나오겠죠, 물론 문자열 값이기에 또 다른 오류가 발생하겠지만..

또한 empName을 GROUP BY절에 다시 써주면 아래와 같이 job과 empName이 동일한 레코드끼리 묶여서 나오기 때문에 사실상 현재 데이터에서는 모든 데이터를 출력하는 것과 같게 됩니다.


SELECT empName 이름, job 직급, AVG(salary) 월급평균

FROM employee GROUP BY job, empName;




3. HAVING


이번 포스팅에서 마지막으로 알아볼 것은 HAVING절 입니다.

HAVING은 간단하게 말해서, 우리가 위에서 배운 GROUP BY절을 통해 만들어진 GROUP에 대해서 조건을 거는 것 입니다.


그런데 우리는 이전에 조건을 거는 WHERE절에 대해서 학습하였습니다.


WHERE절과 HAVING절의 차이는 무엇일까요?


기본적으로 WHERE절은 모든 레코드(행)에 대해서 조건을 적용하게 됩니다.

하지만 HAVING절은 GROUP BY절을 통해 만들어진 GROUP 들에만 조건을 적용하는 것이죠.


이를 잘 이해하지 못하면 추후에 HAVING과 WHERE 사용에 있어 헷갈릴 수 있습니다.


그럼 바로 사용해보도록 하겠습니다.

각 직급에 대해 3명 이상인 직급과 그 인원수를 출력해보도록 하겠습니다.


SELECT job 직급, COUNT(job) '직급 수' FROM employee

GROUP BY job HAVING COUNT(job) >= 3;



위와 같이 사용됩니다.


그럼 만약,

"월급이 300만원 이상인 사람들에 대해서 직급별로 2명이상인 직급과 그 직급의 월급 평균을 구해라."

라면 어떻게 해야 할까요?

위와 같은 경우에 바로 WHERE절과 HAVING절이 같이 사용하게 됩니다.


SELECT job 직급, AVG(salary) 월급평균 FROM employee

WHERE salary >= 300

GROUP BY job HAVING COUNT(job) >= 2;



추후에 더 많은 데이터들을 대상으로 복잡한 쿼리문을 다루게 되면 충분히 헷갈릴 수 있는 점들이니 꼭 스스로 쿼리문을 작성해보면서 이해하기를 바랍니다.



이렇게 해서 집계함수와 GROUP BY, HAVING 절에 대해서 알아보았습니다.

궁금하거나 잘못된 점은 언제든 댓글이나 이메일, 카카오톡을 통해서 문의주시면 감사하겠습니다.


블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc


안녕하세요. 문범우입니다.

이번 포스팅에서는 최근 한국에서도 판매를 시작한,

AirPods2에 대해서 솔직한 리뷰를 남기고자 합니다.

이전에 AirPods1을 사용하지 않았던 점을 고려해서 봐주시고

추가적으로 궁금한점이 있으시면 언제든지 댓글 남겨주세요! 

최대한 빠르고 정확하게 안내드리도록 하겠습니다 :)



# 너무 다양했던 루머들

본격적인 제품 언박싱이나 후기보다 처음 AirPods2를 만났을 때 솔직한 감정을 먼저 이야기 해보자면,

정말 너무나 많은 루머들이 있지 않았나 싶습니다.

색상을 비롯해서 추가적인 기능들, 예를 들면 AirPods1에서 제공되지 않은 볼륨 컨트롤등에 대해 이야기가 많았는데 정말 모~두 다 루머였습니다. :-(


그냥 좋고 나쁨을 떠나서 딱 체감되는 차이점으로 AirPods2를 설명하자면,

무선 충전과 시리 호출이 되는 에어팟

정도가 되겠습니다.

(물론 유선충전모델을 사면 시리호출만..)


그럼 본격적으로 제품 언박싱과 솔직 후기를 만나보시죠 :)



# 제품 언박싱



글 작성중인 4월19일 금요일!

몇일전 에어팟2가 판매시작한 것을 확인했지만 배송예상기간이 너무 길어 픽업풀리길 기대하고 있었는데 마침 오늘 당일 픽업 가능으로 제품이 풀려서 즉시 결제하고 퇴근하자마자 후다닥 애플스토어로 달려갔습니다.


입구에서부터 너무나 설레고 행복한 이곳...


항상 사람이 많은 곳이기에 금요일저녁이라 더 많을 줄 알았지만..

시간이 조금 늦은 8시30분경이어서 그런지 심각하지는 않아서 너무 다행이었네요.

픽업할 때 여쭤보니 7시쯤에는 사람이 더 많았다고 해요..


아무튼! 도착 후에 바로 직원분께 픽업을 안내드리니 줄을 서야 된다고 안내해 주시더라구요.

기다리면서 다른분들 이야기 하는 걸 들어보니까 에어팟2 픽업때문에 오신분들이 대다수 였습니다.


에어팟2를 수령하고 집에 얼른와서 후다닥 언박싱..!





제품 박스에서부터 에어팟1과 전혀 다르지 않은 모습..



박스를 여니 등장한 에어팟2 입니다.

여기서 첫번째로 에어팟1과 차이점을 볼 수 있습니다.

에어팟1과 같은 경우는 케이스 후면, 힌지가 있는 부분에 LED가 있지만 에어팟2와 같은 경우는 케이스 전면부에 LED가 있습니다.

이는 아마 무선충전을 할때 해당 LED로 확인할 수 있도록 하기 위함 같습니다.




사실상 제품의 겉모습은 에어팟1과 너무나 동일하기 때문에 많은 사진을 첨부하지 않겠습니다.

굳이 차이점은 위에서 말씀드린 LED위치정도..

케이스없이 에어팟만 봤을 때는 차이를 알기 어려우니 혹시나 추후에 중고를 구입하시려는 분들은 에어팟에 작은 글씨로 적혀있는 모델명을 잘 확인해보셔야 합니다!



# 일단은 너무 좋다.


일단 첫번째로, 이전에 에어팟1을 사용하지 않았던 유저로써.. 너무 좋습니다.

뭐 가격이나 이런거에 대해서는 밑에서 논하도록 하고.. 단순히 에어팟제품과 만족도만 이야기하자면 정말 만족스럽습니다. 물론 돌아다니면서 몇일 더 사용해봐야 확실하겠지만, 현재는 너무나 만족스럽네요.
블루투스 이어폰이다 보니 페어링이 끊기는 현상만 없다면 전혀 불만 없이 사용할 것 같습니다.

현재 맥북과 아이폰과의 호환도 너무나 부드럽고, 아이폰 -> 맥북, 맥북 -> 아이폰으로 넘어가는 과정도 단 몇초면 진행되기 때문에 너무나 편리합니다.


기능적으로 보면 에어팟1과 차이를 보이는 '시리 호출'기능이 생각보다 편리합니다.

시리를 호출하고 반응했는지 기다렸다가 이야기하는 것이 아니라, "시리야 ~~~알려줘" 처럼 그냥 자연스럽게 이야기하면 다 듣고 반응합니다.

개인적으로는 그냥 아이폰에 말하는 것보다 시리 호출이 잘 되는 것 같습니다.

그래서 이어폰 끼고 생각보다 다양한 작업을 할 수 있습니다.


루머중에 하나였던, 볼륨 컨트롤 또한 시리를 호출하면서, "시리야 볼륨 두칸 높여줘" 라고 이야기하면 되서 어느정도 해결된 부분이라고 생각합니다.


무선충전에 대해서는 사바사인 것 같습니다.

저는 예전부터 무선충전 패드를 사용해서 편리하다고 생각하는 편입니다.

이게 유선에 비해 엄청난 차이가 있다기 보다는, 유선 충전도 하면서 자기 전에 가볍게 올려두거나 할 때 무선충전을 이용하는데, 이럴 때는 오히려 선의 걸리적 거림이 없이 기기만 들었다 놨다하면 되기에 편하다고 생각합니다.



# 난 에어팟1이 있다면 ?


하지만 에어팟1이 있는 분들에게는 굳이 에어팟2를 추천드리지 않습니다.

내부 칩도 바뀌고 페어링 속도 등에 대한 차이도 있다고 하지만 그런걸 감안해도, 에어팟1대신 25만원을 지불하면서까지 에어팟2로 넘어올 정도는 아니라고 생각합니다.



# 25만원의 가성비 ?


이건..정말 어려운 질문 같습니다.

개인이 가치를 얼만큼 두느냐의 차이기 때문에..

일단 저는 가성비가 좋다고는 못하지만 크게 부족하다고도 생각하지 않습니다.

일단은 다양한 블루투스 이어폰 중에서 에어팟과 같은 디자인을 선호합니다. 갤럭시의 버즈와 같은 디자인보다는 콩나물 같지만 아래로 길게 빠진 디자인을 선호하기 때문에, 가성비가 정말 좋다는 QCY 녀석들도 잘 쳐다보지 않았습니다.

스타트업 제품들 중에서는 에어팟과 비슷한 디자인을 몇번 봤는데 어느정도 괜찮다고 생각한 제품들의 가격대가 대략15만원 가량 되었습니다.

이러한 가격대를 보았을 때, 애플 제품군 끼리의 호환, 페어링 속도와 빼놓을 수 없는 애플 감성..을 생각하면 그래도 요새 너무나 비싸지고 있는 다른 애플 제품들에 비하면 아직 에어팟2는 나쁘지 않다고 생각합니다.. :)



# 장단점 정리


장점은 편리함, 빠른 페어링, 터치기능, 시리호출, 디자인으로 생각할 수 있습니다.

추가적으로 애플제품을 다양하게 사용하시는 분들은 제품간 느낄 수 있는 좋은 호환성정도..!


단점으로는 25만원의 가격과 개인적으로는 커널형이 아닌 오픈형 이어폰인 점..

일단 가격대가 비싼편이긴 하기에 그 점이 제일 큰 단점이고 제일 중요하게 고민해보셔야 합니다.

스스로의 지갑상태를 고려하고, 주변에 사용하시는 분들의 다양한 의견도 들어보심을 적극 추천합니다.

개인적으로 생각한 추가적인 단점은 오픈형이어폰인 점인데, 사실 제가 걱정했던 것보다는 오픈형 이어폰임에도 불구하고 귀에서 잘 빠지지 않고 소리가 잘 들리는 것 같습니다. 커널형만 고집하다 보니 굳이 단점으로 넣었지만, 오픈형 이어폰임을 두고 본다면 오히려 장점으로도 볼 수 있습니다.



사실 에어팟1과 너무나 큰 차이가 없기 때문에, 기능적으로 크게 이야기하지는 않았습니다.

개인적으로 느끼고 생각한 점들을 위주로 적었는데 이 외에도 궁금하신 점들이 있다면 얼마든지 댓글을 남겨주세요!

최대한 빠르게 답변드리도록 하겠습니다 :)


블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc


안녕하세요. 문범우입니다.

이번 포스팅에서도 SELECT 문을 기반으로 한 심화적인 내용에 대해서 알아보겠습니다.

LIKE 연산자와 ORDER BY, TOP(n) 등에 대해서 함께 알아보도록 하겠습니다.



1. LIKE


만약, 다음과 같은 조건에 대한 데이터를 조회하려면 어떻게 해야 할까요?


"이씨 성인 사람의 데이터를 조회하라."

"이름에 '범'이 들어가는 사람의 데이터를 조회하라"


우리가 이전에 배운 내용들로 쉽게 할 수 있을까요?

위와 같이 정확하게 어떤 값인지 모르지만 검색이 필요한 경우가 있을 것입니다.

우리는 이럴때 검색을 용이하게 하기 위해서 와일드카드를 사용합니다.

와일드카드로는 '%'와 '_' 두 개의 특수 문자가 존재하는데 각각의 의미하는 바는 다음과 같습니다.


% : 문자가 없거나, 한개이상의 어떠한 문자도 대치함. 즉 0~무한대의 글자가 될 수 있음.

_ : 어떠한 문자가 와도 되지만 단 한글자를 의미함.


설명이 대략적으로 이해가 가시나요?

아래 예제 쿼리들을 통해 확인해보도록 합시다.


먼저, 이름의 성이 '이'씨인 사람들을 찾아보도록 합니다.


SELECT * FROM employee

WHERE empName LIKE '이%';



위와 같이 이름의 첫글자가 '이'로 시작되는 데이터들이 조회되었습니다.

그럼 이번엔 이름에 '범'이 들어가는 데이터를 조회해보도록 합시다.


SELECT * FROM employee

WHERE empName LIKE '%범%';



위와 같이 이름에 '범'이 들어가는 모든 데이터가 조회되었습니다.

그런데 이름의 가운데 글자가 '범'인 사람의 데이터를 조회하고 싶을 때는 어떻게 할까요?

위에서 사용된 '%' 말고, '_'를 사용하면 됩니다.


SELECT * FROM employee

WHERE empName LIKE '_범_';



이렇게 언더바(_) 와일드카드는 무조건 그 자리에 한글자의 문자가 존재해야 합니다.

하지만 퍼센트(%) 와일드카드는 0 ~ 무한대 글자를 포함하기 때문에 와일드카드 위치에 문자가 없어도 되고, 여러 문자가 있어도 되는 것이죠.


언더바와 퍼센트 와일드 카드의 차이점을 한번 더 확인해보도록 하죠.


SELECT * FROM employee

WHERE empName LIKE '장%';



SELECT * FROM employee

WHERE empName LIKE '장_';



언더바와 퍼센트의 차이를 아시겠나요?


또한 LIKE 연산자는 NOT을 붙여서 반대의 의미로도 사용할 수 있습니다.


예를 들어, 이름에 '우'가 들어가지 않는 사람들의 데이터를 조회하고자 한다면 다음과 같이 할 수 있습니다.


SELECT * FROM employee

WHERE empName NOT LIKE '%우%';





2. IS NULL / IS NOT NULL


이번에는 NULL 체크시에 자주 사용되는 IS NULL / IS NOT NULL에 대해서 알아보겠습니다.

IS NULL / IS NOT NULL 은 간단하니 바로 예제 쿼리를 보고 확인해보도록 하겠습니다.


SELECT * FROM employee

WHERE manager IS NULL;



위와 같이 사용됩니다.

또한 주로는 아래와 같이 특정 칼럼값이 NULL이 아닌 데이터들만 조회하는데 주로 사용됩니다.


SELECT * FROM employee

WHERE commission IS NOT NULL;





3. ORDER BY


이번에 배워볼 구문은 ORDER BY 로써, 정렬을 하는데 사용하는 것 입니다.

만약 salary 값의 오름차순으로 데이터를 정렬해서 보여달라고 할 땐 어떻게 할까요?

아래 쿼리와 같이 ORDER BY 를 사용하고 어떤 컬럼을 기준으로 할지 함께 적어주면 됩니다.


SELECT * FROM employee

ORDER BY salary ASC;



이때 ASC는 오름차순을 뜻하며, 내림차순은 DESC 입니다.

만약 둘 중 아무것도 적어주지 않으면  기본적으로 오름차순 정렬이 됩니다.


그런데 결과를 보시면 첫번째와 두번째행의 salary가 250으로 같습니다.

추가적으로 이럴경우에는 empNo의 내림차순으로 정렬하고 싶어한다면 어떻게 할까요?

다음과 같이 이전의 쿼리에서 ORDER BY 뒤에 두번째로 정렬할 기준은 무엇인지 함께 적어주면 됩니다.


SELECT * FROM employee

ORDER BY salary ASC, empNo DESC;





4. TOP(n)


이번 포스팅에서 마지막으로 알아볼 것은 TOP(n) 입니다. 

TOP(n)은 결과 데이터의 상위 n개만 보여주라는 명령어입니다.

이는 MS SQL Server에서의 특징인데, 다른 데이터베이스에서는 LIMIT등으로 표현되고는 합니다.

TOP은 이전과 다르게 FROM 이후에 적어주는 것이 아니라 다음 쿼리와 같이 SELECT 뒤에 적어줍니다.


SELECT TOP 4 * FROM employee

ORDER BY salary;



위와 같이 TOP 뒤에 오는 숫자는 괄호로 묶지 않아도 괜찮습니다.


그런데 기존의 데이터를 보면 salary가 300인 사람은 2명입니다.

위의 쿼리와 같이 결과를 확인하면 salary가 300으로 동점인 2명 중 한명만 출력되고 있는 것인데, 만약 위와 같이 동점이 존재할 때, 모든 동점자를 함께 출력하려면 TOP n 뒤에 WITH TIES 옵션을 같이 붙여주면 됩니다.


SELECT TOP 4 WITH TIES * FROM employee

ORDER BY salary;



위와 같이 salary가 300으로 동점인 2명이 함께 출력되는 것을 확인하실 수 있습니다.

또한 TOP 구문에서는 단순히 정수를 사용하는 것이 아니라 전체 데이터의 퍼센트만큼 출력할 행의 수를 지정할 수 있습니다. 

예를 들어 전체 데이터의 10퍼센트에 해당하는 개수의 데이터만 조회하고 싶다면 다음과 같이 TOP n 뒤에 PERCENT 옵션을 붙여주면 됩니다.


SELECT TOP 10 PERCENT * FROM employee

ORDER BY empNo;




이렇게 해서 LIKE연산자를 비롯해 ORDER BY, TOP n 등에 대해서 알아보았습니다.

다음 포스팅에서는 집계함수(sum, max, min, avg 등)에 대해서 알아보며 동시에 GROUP BY, HAVING 절에 대해서도 함께 알아보도록 하겠습니다.

블로그 이미지

Tigercow.Door

Web Programming / Back-end / Database / AI / Algorithm / DeepLearning / etc