본문 바로가기

전체 글

[내일 배움 캠프, 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) = '김'혹시 모를 오류.. 더보기
[내일 배움 카드 4-2] Subquery란? 1. Subquery란 Query 안에 sub로 들어간 구문이다.- Query의 결과문을 한 번더 활용할 때 사용한다.- 복잡한 Query 문의 연산 과정을 분할할 때 사용한다.SELECT order_id, restaurant_name, IF(over_time>=0, over_time, 0) over_timeFROM ( SELECT order_id, restaurant_name, food_preparation_time-25 over_time FROM food_orders) asub query는 main query에서 필요로하는 데이터를 간결하게 정리&가공해 줄 수 있다. main query는 sub query에서 나온 결과문을 활용할 수 있다. 더보기
[내일 배움 캠프 3-7] Data Type 오류 + 3주차 숙제 MySQL은 Data Type이 달라도 연산이 가능하다. 하지만 자동 형 변환(type conversion)이 발생할 수 있어 결과가 예상과 다를 수 있다.위 DB에서 rating 컬럼은 숫자로도 이루어져 있지만, Data Type이 문자형(A-Z)이다.만약, Data Type을 확인하지 않고 숫자와 연산을 하게 되면 다른 SQL 문법에서는 연산이 되지 않을 수 있다.   1. 데이터 타입 변경--숫자로 변경cast(if(rating='Not given', '1', rating) as decimal) --문자로 변경concat(restaurant_name, '-', cast(order_id as char))다음 과정을 통해 Data Type도 일치시키고 그에 따른 데이터 처리도 함께 해주면, 올바른 계산.. 더보기