본문 바로가기
프로젝트 모음/SQL 입문부터 활용까지

[SQL 입문부터 활용까지] 1차 과제

by 하람 Haram 2022. 11. 19.
728x90

[주제] SQL 기본 문법 익히기

SQL은 데이터베이스를 다루고, 데이터베이스로 부터 원하는 데이터를 적절하게 추출하기 위한 기초적인 언어입니다. 신입사원 수준에서는 비교적 잘 정리된 RDB에 적재된 데이터를 주로 다루게 됩니다. 1주차에는 이런 RDB에서 원하는 조건에 맞게 데이터를 가공, 추출하는 방법을 알아봅니다. 그리고 이를 활용해 다양한 예시 문제들을 해결해 봅니다.

 

  1. SQL 기본 문법 익히기
  2. 다양한 SQL 활용 예시 익히기
  3. 데이터 추출 문제를 해결하고 결과 쿼리를 Word로 첨부

 

문제

  1. Country 별로 ContactName이 ‘A’로 시작하는 Customer의 숫자를 세는 쿼리를 작성하세요.
  2. Customer 별로 Order한 Product의 총 Quantity를 세는 쿼리를 작성하세요.
  3. 년월별, Employee별로 Product를 몇 개씩 판매했는지를 표시하는 쿼리를 작성하세요.


 

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

 

SELECT Country ,Count(*) FROM Customers
WHERE ContactName LIKE 'A%'
GROUP BY Country;

어떤 Country 고 해당하는 개수가 몇인지 출력하고

 

LIKE를 이용하여서 문자영 부분일치를 검색

 

( % ) : 모든문자

( _ ) :  한글자(자리 수 지정)

 

EX)

WHERE ContactName LIKE 'A'

=> 'A' 만 출력 (=)  WHERE ContactName = 'A'

 

WHERE ContactName LIKE '%A%'

=> A 앞뒤로 뭐가 오던지 상관없이 출력

 

WHERE ContactName LIKE 'A%'

=> A 로 시작하는 애들만 출력

 

WHERE ContactName LIKE '%A'

=> A 로 끝나는 애들만 출력

 

WHERE ContactName LIKE '_ _A% '

=> A 앞에 두글자 있는 애들만 출력 (EX) : CPABCD

 

WHERE ContactName LIKE '_ _A '

=> A 앞에 두글자 있고 A로 끝나는 세글자 애들만 출력 (EX) : CPA

 

https://lcs1245.tistory.com/entry/SQL-LIKE-%EC%97%B0%EC%82%B0%EC%9E%90-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%B6%80%EB%B6%84%EC%9D%BC%EC%B9%98-%EA%B2%80%EC%83%89

 

<답>

SELECT Country ,Count(*) FROM Customers
WHERE ContactName LIKE 'A%'
GROUP BY Country;


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

Orders 와 OrderDetails를 살펴 봐야겠음

찾고 있던 Quantity가 OrderDetails에 있음

CustomerID랑 Quantity 연결을 위해 OrderID로 Join을 진행기준을 Orders로 잡고 left join을 해보자

 

SELECT CustomerID ,Quantity 
    FROM Orders AS O
    LEFT JOIN
    OrderDetails AS OD
    ON O.OrderID = OD.OrderID
    ORDER BY CustomerID ;

 

Quantity 가 합쳐지지 않음...

 

Group By 추가해봤는데

SELECT CustomerID ,Quantity 
    FROM Orders AS O
    LEFT JOIN
    OrderDetails AS OD
    ON O.OrderID = OD.OrderID
    Group By CustomerID
    ORDER BY CustomerID ;

결과가 이상함 ㅠㅠ

<질문>

GroupBy 결과가 왜 저렇게 누락되었는지

 

<답>

SELECT CustomerID ,sum(Quantity) 
    FROM Orders AS O
    LEFT JOIN
    OrderDetails AS OD
    ON O.OrderID = OD.OrderID
    Group by CustomerID
    ORDER BY CustomerID ;

 

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

 

 

문제를

1968-12

Employee1  23

Employee2  45

Employee3  8

 

1969-01

Employee1  3

Employee2  53

Employee3  2

 

으런식으로 보여 달라는 것으로 해석

년 월 찾았다!!

 

개수가 없으니 OrderID하고 개수 있는 테이블 찾아보면

기본 BASE가 될 TABLE을 JOIN으로 만들어 보면

SELECT * 
    FROM Orders AS O
    LEFT JOIN
    OrderDetails AS OD
    ON O.OrderID = OD.OrderID

ORDER ID가 같은 것이 여러개 생겨 버림

이는 Prouduct 아이디가 달라서 즉, 다른 상품을 주문을 하여서 이런 현상이 생긴걸로 판단하였다

SELECT O.OrderDate, O.EmployeeID, O.OrderID, sum(Quantity) 
    FROM Orders AS O
    INNER JOIN
    OrderDetails AS OD
    ON O.OrderID = OD.OrderID
    GROUP BY O.OrderID

년월일 하고 EmployeeID, 총 Product 개수는 뽑아 냈다

(OrderID는 중복 안되었다는 걸 확인 했으니 빼주고 EmployeeID를 이름으로 바꿔주자)

SELECT O.OrderDate, E.LastName,	E.FirstName, O.EmployeeID ,O.OrderID, sum(Quantity) 
    FROM (Orders AS O
    INNER JOIN
    OrderDetails AS OD
    ON O.OrderID = OD.OrderID) AS TotalOrder
    INNER JOIN
    Employees AS E
    ON TotalOrder.EmployeeID = E.EmployeeID
    GROUP BY O.OrderID

여기에서 Select문을 조금 바꿔보면

 

<답>

SELECT O.OrderDate, E.LastName,	E.FirstName, sum(Quantity) 
    FROM (Orders AS O
    INNER JOIN
    OrderDetails AS OD
    ON O.OrderID = OD.OrderID) AS TotalOrder
    INNER JOIN
    Employees AS E
    ON TotalOrder.EmployeeID = E.EmployeeID
    GROUP BY O.OrderID

<질문>

년-월-일 별로 묶었지만

Steven 같은 경우 7월 4일,11일 모두 주문을 했는데

이것을 년-월 별로 묶어서 Sum하고 싶으면 어떻게 수정을 해야하는지?

 

 

과제 사이트

https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all 

 

SQL Tryit Editor v1.6

WebSQL stores a Database locally, on the user's computer. Each user gets their own Database object. WebSQL is supported in Chrome, Safari, Opera, and Edge(79). If you use another browser you will still be able to use our Try SQL Editor, but a different ver

www.w3schools.com

 

728x90