nan + nan = 2nan

[SQL] 코멘토 SQL 기초 문법1_review 본문

Database/SQL

[SQL] 코멘토 SQL 기초 문법1_review

2nan 2022. 3. 15. 10:23
728x90

1. Country 별로 ContactName이 ‘A’로 시작하는 Customer의 숫자를 세는 쿼리를 작성하세요.

 

기존 답안

SELECT country,
COUNT(ContactName) FROM Customers
WHERE ContactName LIKE 'A%'
GROUP BY country; 

 

멘토님 Review

Count 안에 컬럼명을 넣으면 그 컬럼 값에 null이 있을 때는 카운트를 하지 않고, 컬럼명이 없으면 null이 있어도 카운트를 합니다.

 

컬럼명이 없을 때는 그냥 row 수를 세는 것

보통 전체적인 row 수를 파악하는 것이 더 중요한 경우가 많아 count(1) 혹은 count(*)를 주로 사용. 두 가지는 서로 차이가 없다고 해도 무방하다.

 

Feedback 적용 답안

select Country, count(1) cnt
from Customers
where ContactName like 'A%'
group by Country;

 

2. Customer 별로 Order한 Product의 총 Quantity를 세는 쿼리를 작성하세요.

 

기존 답안

SELECT O.CustomerID, COUNT(OD.Quantity)
FROM OrderDetails AS OD, Orders AS O
WHERE OD.OrderID = O.OrderID
GROUP BY CustomerID;

 

멘토님 Review

콤마(,)를 통해서 조인을 해주면 inner join이 된다. 보통, 제일 기준이 되는 테이블을 맨 왼쪽에 두고 left join을 제일 많이 쓰고, inner join은 말 그대로 교집합을 검사하고 싶은 경우나 중복을 제거하기 위한 기술적인 목적으로 가끔 사용.

 

이 경우에는 inner join이나 left join 둘 다 사용해도 크게 무방
총 Quantitiy를 계산하기 위해 이 경우에는 count()보다 sum()이 더 적절하다.

 

Feedback 적용 답안

select a.CustomerID, sum(b.Quantity)
from Orders a
	left join OrderDetails b on a.Orderid = b.Orderid
group by a.CustomerID;

 

3. 년월별, Employee별로 Product를 몇 개씩 판매했는지를 표시하는 쿼리를 작성하세요.

 

기존 답안

SELECT O.OrderDate,
	COUNT(OD.Quantity)
FROM Orders AS O, Employees AS E, OrderDetails AS OD
WHERE O.EmployeeID = E.EmployeeID
GROUP BY OrderDate;

 

멘토님 Review

우선 문제의 핵심은, 연/월/일 형태로 되어 있는 OrderDate을 어떻게 연/월 형태로 바꿀지를 고민하는 문제.

 

MySQL에서는 date_format() 등의 함수를 많이 쓰는데, 해당 실습 환경에선 날짜를 문자로 보고 substr() 함수를 사용 가능
두 기준으로 동시에 group by를 하기 위해서는 두 기준을 group by 절에 모두 명시

 

Feedback 적용 답안

select substr(a.OrderDate, 1, 7) ym, a.EmployeeID, sum(b.Quantity) SumOfQuantity
from Orders a
	left join OrderDetails b on a.OrderID = b.OrderID
group by substr(a.OrderDate, 1, 7), a.EmployeeID;

 

What did I learn?


1) Count 안에 컬럼명을 넣을 때 null 값이 존재하면 카운트를 하지 않고, 컬럼명이 없으면 null 값이 있어도 카운트를 한다.

2) substr(문자열, 시작 위치, 나타낼 개수) slice를 해주는 함수

3) AS를 사용하지 않고 뒤에 공백 후 붙여주기만 해도 별칭이 형성

4) 콤마(,)를 통해서 조인을 해주면 inner join. 이는 교집합 검사 혹은 중복 제거를 위한 기술적인 목적으로 가끔 사용. 대부분은 left join을 많이 사용

Comments