본문 바로가기

MySql

[내일 배움 캠프, SQL 달리기 반] Lv5. 예산이 가장 큰 프로젝트는? 1. 문제    [5-1] 풀이SELECT Name, Department, SalaryFROM employees eWHERE (Department, Salary) in ( SELECT Department, MAX(Salary) Salary FROM employees GROUP BY Department)ORDER BY 2부서에서 가장 높은 월급 :  Group by Department와 집계함수 Max를 사용하였다. (서브쿼리)부서에서 가장 높은 월급을 받는 직원들 : WHERE 절로 서브쿼리의 값에 포함되지 않는 행들은 필터링해준다. (메인쿼리)   [5-1] 헷갈렸던 부분원래는 WHERE 절에 "in 연산자" 대신 "="을 넣었는데, 아래 사진과 .. 더보기
[내일 배움 캠프, 달리기 반] Lv5. 가장 많이 팔린 품목은? 1. 문제    [5-1] 풀이SELECT CustomerName, SUM(Price*Quantity) TotalAmount, count(1) OrderCountFROM( SELECT c.CustomerName, o.Quantity, o.ProductID FROM customers c LEFT JOIN orders o ON c.CustomerID=o.CustomerID) a LEFT JOIN products p ON a.productID=p.ProductIDGROUP BY 1세 개의 테이블에서 데이터를 가져와야 하므로, 2번의 JOIN 연산을 하였다.   [5-1] 헷갈렸던 부분문제 : 위 문제에서 각 테이블은 행의 갯수가 다르다. 그래.. 더보기
[내일 배움 캠프, SQL 달리기 반] Lv4. 가장 높은 월급을 받는 직원은? 1. 문제    [4-1] 풀이SELECT Name, Department, Salary, if(Top_Salary1, 0 ,Name) Top_Earner, if(Top_Salary1, 0 ,Salary) Top_SalaryFROM(SELECT Name, Department, Salary, RANK() OVER(PARTITION BY Department ORDER BY Salary desc) Top_SalaryFROM employeesORDER BY Name) a문제를 푸는 과정에서 Top_Earner와 Top_Salary를 구하려면, Name, Department, Salary 컬럼이랑 같이 구할 수가 없다. 하지만 기대결과에서는.. 더보기
[내일 배움 캠프, SQL 달리기 반] Lv4. 단골 고객님 찾기 1. 문제    2. 풀이[4-1]SELECT CustomerName, count(OrderID) OrderCount, IF(sum(TotalAmount) is null, 0, sum(TotalAmount)) TotalSpentFROM( SELECT c.CustomerName, o.TotalAmount, o.OrderID FROM customers c LEFT JOIN orders o ON c.CustomerID=o.CustomerID) aGROUP BY 1나중에 주문한 적이 없는 고객을 예외처리하기 위해 서브쿼리에서 OrderID를 함께 넘겨주었다. 메인쿼리에서 OrderID를 카운트한다. 만약 OrderID가 null이면, 카운트하지 않는다.   [4-2]select Country, .. 더보기
[내일 배움 캠프, SQL 달리기 반] Lv3. 이용자의 포인트 조회하기 1. 문제    2. 풀이FROM → users u LEFT JOIN point_users p ON u.user_id=p.user_idWHERE → X (필터링 조건이 없으므로)GROUP BY → X (그룹 조건이 없으므로)HAVING → X (그룹이 없으므로)SELECT → u.user_id, u.email, if(p.point IS NULL, 0, p.point)ORDER BY → point DESCSELECT u.user_id, u.email, if(p.point IS NULL, 0, p.point) pointFROM users u LEFT JOIN point_users p ON u.user_id=p.user_idORDER BY point DESC;    3. 정답SELECT .. 더보기
[내일 배움 캠프 4-5] JOIN이란? 필요한 데이터가 꼭 하나의 테이블에 모여있지는 않는다.이럴 때 여러 테이블에서 데이터를 불러오는 방법은 JOIN을 활용하면 된다. 1. JOIN- 서로 다른 테이블에서 동시에 데이터를 뽑아올 때 사용한다.- 각 테이블은 공통으로 갖는 컬럼이 있다.- 공통 컬럼을 기준으로 테이블을 합쳐서, 각각 테이블에서 필요한 데이터를 조회할 수 있도록 만들어 준다.    3. JOIN 구조SELECT 별명1.컬럼명,                .....FROM 테이블명1 AS 별명1 ~~ JOIN 테이블명2 AS 별명2 ON 별명1.공통컬럼1= 별명2.공통컬럼2SELECT f.restaurant_name, f.price, p.pay_typeFROM food_orders f INNER JOIN pa.. 더보기
[내일 배움 카드, 달리기 반] Lv2. 날짜 별 획득 포인트 조회하기 1. 문제    2. 풀이FROM → point_user 테이블WHERE → X (필터링 조건이 없으므로)GROUP BY → SUBSTR(created_at,1,10) created_atHAVING → X (그룹이 없으므로)SELECT → SUBSTR(created_at,1,10) created_at, ROUND(AVG(point)) average_pointsORDER BY → X (정렬 조건이 없으므로)SELECT SUBSTR(created_at,1,10) created_at, ROUND(AVG(point)) average_pointsFROM point_usersGROUP BY 1created_at 컬럼의 data_type인 TIMESTAMP에 대한 지식 부족으로 SUBSTR() 함수로 풀.. 더보기
[내일 배움 캠프, SQL 달리기 반] Lv1. 데이터 속 김서방 찾기 1. 문제   2. 풀이FROM → user 테이블WHERE → name LIKE "김%" ( "김"씨 성을 가져야 한다.)GROUP BY → X (그룹에 대한 조건이 없으므로)HAVING → X (그룹이 없으므로)SELECT → count(1) name_cntORDER BY → X (정렬에 대한 조건이 없으므로)SELECT count(1) name_cntFROM userWHERE name like "김%"일반적으로 user_id는 중복되지 않기 때문에 COUNT(1)을 사용하여, 전체 테이블에서 김씨 성을 갖은 데이터를 카운트하였다.   3. 정답SELECT count(distinct(user_id)) as name_cntFROM userwhere substr(name,1,1) = '김'혹시 모를 오류.. 더보기