SUBQUERY(서브쿼리)

대표적으로는 SELECT, FROM, WHERE절에서 사용 가능

이번 포스팅에서는 FROM, WHERE에 대한 서브쿼리를 소개할 예정입니다.

 

 


 

incident_id week date type ...
3001 2 2020-01-05 A  
3002 2 2020-01-05 A  
3003 2 2020-01-06 B  
3004 2 2020-01-07 B  
3005 2 2020-01-07 ...  
3006 2 2020-01-07 ...  

table <crimes>

 

FROM절 서브쿼리

 

FROM절 서브쿼리 작성 예시) 가상의 테이블을 만든다고 생각

 

SELECT daily_stats.week
		,AVG(daily_stats.incidents_daily)
FROM (
	SELECT week
    		,date
	        ,COUNT(incident_id) AS incidents_daily
	FROM crimes
    	GROUP BY week, date
    ) daily_stats
GROUP BY daily_stats.week

AVG() 사용할 때, NULL 카운트가 안 되는 점을 고려해서 SQL문을 작성해야 함

 

 

 

WHERE절 서브쿼리

 

서브쿼리의 결과가 딱 하나일 경우 (주로 MIN, MAX 사용)

SELECT *
FROM crimes
WHERE date = (SELECT MIN(date) FROM crimes)

 

서브쿼리의 결과가 여러 개인 경우

SELECT *
FROM crimes
WHERE date IN (SELECT DISTINCT date
		FROM crimes
                ORDER BY date DESC
                LIMIT 5
                )

 

 

 


 

HACKER RANK

 

Top Earners - https://www.hackerrank.com/challenges/earnings-of-employees/problem?h_r=internal-search

문제 풀이는 더보기 클릭

더보기

문제 ) salary * months 의 결과값 중에 가장 큰 값을 몇 명이 받고 있는지 조회해라

 

1) WHERE절 서브쿼리에서 WHERE = 를 사용한 풀이

-- salary * months = earnings 값이 제일 큰 사람

SELECT months * salary AS earnings
	, count(employee_id)
FROM Employee
WHERE months * salary = (SELECT MAX(months * salary) FROM employee)
GROUP BY earnings

 

2) HAVING절 서브쿼리를 사용한 풀이

SELECT months * salary AS earnings
	,COUNT(*)
FROM Employee
GROUP BY earnings
HAVING earnings = (SELECT MAX(months * salary) FROM Employee)

 

 

LEETCODE

 

184. Department Highest Salary - https://leetcode.com/problems/department-highest-salary/

문제 풀이는 더보기 클릭

더보기
SELECT d.name AS department
    , e.name AS employee
    , e.salary
FROM employee AS e
    INNER JOIN (SELECT departmentid
			, MAX(salary) AS max_salary
                FROM employee
                GROUP BY departmentid
                ) AS dh ON e.departmentid = dh.departmentid
                	AND e.salary = dh.max_salary
    INNER JOIN department AS d ON d.id = e.departmentid

 

해설은 차후 업로드

 

 


 

< 기초 SQL 시리즈 >

 

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 1부

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 2부

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 3부 完

 

< 중급 SQL 시리즈 >

 

2020/07/15 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 1부

2020/07/15 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 2부

2020/07/16 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 3부

2020/07/16 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 4부 完

 

 

 

이 포스팅은 해당 강좌를 수강하며 작성하였습니다.

https://www.inflearn.com/course/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-%EA%B3%A0%EA%B8%89-SQL/dashboard

 

[백문이불여일타] 데이터 분석을 위한 고급 SQL - 인프런

SQL 고급 이론을 배우고, 실습 문제를 함께 풀어봅니다. 중급이상 데이터 분석 데이터베이스 데이터베이스 SQL 데이터 분석 온라인 강의 실무에 필요한 연산을 효율적으로 처리하기 위한 SQL의 고�

www.inflearn.com

 

 

DML (Data Manipulation Language)

 

SELECT / INSERT, UPDATE, DELETE

 

SELECT DB에 들어있는 데이터를 조회, 검색
INSERT DB의 테이블에 데이터 삽입 
UPDATE DB 데이터 수정
DELETE DB의 원치않는 데이터 삭제

 

 

1. SELECT

SELECT 조회하고 싶은 컬럼명 FROM 테이블명

 

 

2. INSERT

행(column) 단위 데이터 삽입

INSERT INTO 테이블명 (column 명) VALUES (각 column에 삽입할 value)

테이블 전체에 데이터 삽입

 

  • DESC 테이블명
  • 테이블의 각 column에 대한 데이터 타입을 확인할 수 있는 명령어

사용예시)

INSERT INTO Salary (Id, name, salary, date) VALUES ('1', 'A', '500', '2020-07-10')
INSERT INTO Salary (Id, name, salary, date) VALUES ('2', 'B', '900', '2020-07-11')

 

 

3. UPDATE 

UPDATE 테이블명 SET column = value

 

 

4. DELETE

DELETE FROM 테이블명

 

조건에 맞는 행(row) 삭제

DELETE FROM 테이블명 WHERE 조건식

 

 

 


 

LEEDCODE

문제 풀이는 더보기 클릭

 

627 Swap Salary - https://leetcode.com/problems/swap-salary/submissions/

더보기
UPDATE salary
SET sex = CASE
		WHEN sex = 'f' THEN 'm'
		WHEN sex = 'm' THEN 'f'
		ELSE 'Other'
	END

 

 


 

< 기초 SQL 시리즈 >

 

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 1부

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 2부

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 3부 完

 

< 중급 SQL 시리즈 >

 

2020/07/15 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 1부

2020/07/15 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 2부

2020/07/16 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 3부

2020/07/16 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 4부 完

 

 

 

이 포스팅은 해당 강좌를 수강하며 작성하였습니다.

https://www.inflearn.com/course/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-%EA%B3%A0%EA%B8%89-SQL/dashboard

 

[백문이불여일타] 데이터 분석을 위한 고급 SQL - 인프런

SQL 고급 이론을 배우고, 실습 문제를 함께 풀어봅니다. 중급이상 데이터 분석 데이터베이스 데이터베이스 SQL 데이터 분석 온라인 강의 실무에 필요한 연산을 효율적으로 처리하기 위한 SQL의 고�

www.inflearn.com

 

 

집합연산 UNION / UNION ALL

중복된 값을 제거하는 것이 UNION의 default

만약에 중복되는 값이 없는 테이블 연산이면 UNION ALL을 사용하는 것이 좋다

 

주의할 점 : A UNION B 를 수행할 때 A에는 ORDER BY 사용 못함

 

로그인 아이디 연락처 주소
A 010-1111-1111 광진구 자양동
B 010-2222-2222 송파구 석촌동
로그인 아이디 연락처 주소
C 010-3333-3333 분당구 판교동
B 010-2222-2222 송파구 석촌동

 

UNION  결과 => 중복 제거

로그인 아이디 연락처 주소
A 010-1111-1111 광진구 자양동
B 010-2222-2222 송파구 석촌동
C 010-3333-3333 분당구 판교동

 

UNION ALL 결과 => 중복 허용

로그인 아이디 연락처 주소
A 010-1111-1111 광진구 자양동
B 010-2222-2222 송파구 석촌동
C 010-3333-3333 분당구 판교동
B 010-2222-2222 송파구 석촌동

 

JOIN 연산 사용 예시

-- product 테이블에서 Price가 5이하 또는 200 이상인 상품들만 출력하세요

SELECT *
FROM Products
WHERE price <= 5

UNION

SELECT *
FROM Products
WHERE price >= 200

 

 

FULL OUTER JOIN (MySQL에선 지원 안되지만 LEFT와 RIGHT를 사용해서 구현)

 

고객정보는 있지만 주문 정보는 없을 때

주문 정보는 있지만 고객 정보는 없을 때 를 모두 조회하고 싶다면 LEFT 조인과 RIGHT 조인을 UNION 해준다

SELECT *
FROM Customers
	LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
    
UNION
  
SELECT *
FROM Customers
	RIGHT JOIN Orders ON Customers.CustomerID = Orders.CustomerID

 

 


 

HACKER RANK

 

정답 확인은 더보기 클릭

 

1. Symmetric Pairs - https://www.hackerrank.com/challenges/symmetric-pairs/problem?h_r=internal-search

더보기
/*
20 20 (2번 나와야함 모두)
UNION
20 21
22 23
*/

-- 20 20 케이스 도출
SELECT x, y
FROM Functions
WHERE x = y
GROUP BY x, y
HAVING count(*) = 2

UNION

SELECT a.x
		, a.y
FROM Functions AS a
		INNER JOIN Functions AS b ON a.x = b.y AND a.y = b.x
WHERE a.x < a.y
ORDER BY x

 


 

< 기초 SQL 시리즈 >

 

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 1부

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 2부

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 3부 完

 

< 중급 SQL 시리즈 >

 

2020/07/15 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 1부

2020/07/15 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 2부

2020/07/16 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 3부

2020/07/16 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 4부 完

 

 

이 포스팅은 해당 강좌를 수강하며 작성하였습니다.

https://www.inflearn.com/course/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-%EC%A4%91%EA%B8%89-SQL

 

[백문이불여일타] 데이터 분석을 위한 중급 SQL - 인프런

SQL 중급 이론을 배우고, 실습 문제를 함께 풀어봅니다. 초급 중급이상 데이터베이스 데이터베이스 데이터 분석 SQL 데이터 분석 온라인 강의 업무에 SQL을 바로 적용할 수 있고 SQL 코딩 테스트도 �

www.inflearn.com

 

JOIN

 

참고 사이트는 더보기 클릭

 

INNER JOIN

카티션 곱의 결과로 조인할 때 사용했던 칼럼이 중복 조회됨

즉, users.id = orders.userid 로 조인을 했다면 결과 값이 users 테이블의 id와 orders 테이블의 userid 두 개가 조회된다.

(Customers와 Orders 테이블을 예시로 들면 무조건 한 번 이상의 주문이 있어야 조회가 된다)

 

/*
Old version

SELECT *
FROM Users, Orders
WHERE Users.Id = Orders.userId
*/

SELECT *
FROM Users
	INNER JOIN Orders ON Users.Id = Orders.userId

-- 결과 값은 똑같지만 INNER JOIN 키워드 사용 권장

 


 

OUTER JOIN (LEFT, RIGHT)

 

< 테이블 예시 Users, Orders >

Id 로그인 아이디  주소
1 A 광진구 자양동
2 B 송파구 석촌동
3 C 분당구 판교동
userId 구매 상품 가격 결제수단
1 샴푸 5000 국민카드
2 식빵 7000 신한카드

 

 

LEFT JOIN

- 한 번도 주문을 하지 않은 회원도 출력하고 싶을 경우에 사용

SELECT * 
FROM Users
	LEFT JOIN Orders ON Users.Id = Orders.userId
Id 로그인 아이디 주소 userId 구매 상품 가격 결제수단
1 A 광진구 자양동 1 샴푸 5000 국민카드
2 B 송파구 석촌동 2 식빵 7000 신한카드
3 C 분당구 판교동 NULL NULL NULL NULL

< left 조인 결과 테이블 >

 

한 번도 주문을 안한 회원을 조회하고 싶을 때

SELECT *
FROM Customers
	LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
WHERE OrderID IS NULL

 

 

RIGHT JOIN

 

대부분 LEFT 조인으로 해결함 (잘 쓰지 않음)

 

 


 

HACKER RANK / LEETCODE

 

해답은 더보기란을 클릭

 

1. Africa Cities - https://www.hackerrank.com/challenges/african-cities/problem?h_r=internal-search

더보기
SELECT City.Name
FROM City
	INNER JOIN Country ON City.Countrycode = Country.code
WHERE Continent = 'Africa'

 

2. Asian Population - https://www.hackerrank.com/challenges/asian-population/problem?h_r=internal-search

더보기
SELECT SUM(city.Population)
FROM Country
	INNER JOIN City ON Country.code = City.countrycode
WHERE Country.continent = 'Asia'

 

3. Average Population of Each Continent - https://www.hackerrank.com/challenges/average-population-of-each-continent/problem?h_r=internal-search

더보기
SELECT country.continent
	, FLOOR(AVG(city.population))
FROM Country
	INNER JOIN City ON Country.Code = City.Countrycode
GROUP BY country.continent

 

 

(LEETCODE) 183. Customers Who Never Order - https://leetcode.com/problems/customers-who-never-order/

더보기
 SELECT Customers.name AS "Customers"
 FROM Customers
 	LEFT JOIN Orders ON Customers.id = Orders.CustomerID
WHERE Orders.CustomerID IS NULL

 

 


 

SELF JOIN

 

주의할 점 : AS 즉, 별칭을 무조건 사용해서 같은 테이블을 구분해주어야 함.

자신의 테이블과 JOIN (상사를 찾을 때 씀) 

 

해답은 더보기를 클릭 (LEETCODE)

 

1. https://leetcode.com/problems/employees-earning-more-than-their-managers/

더보기
SELECT Employee.Name "Employee" 
        -- , Employee.Salary "employee_salary"
        -- , Manager.Name "manager_name"
        -- , Manager.Salary "manager_salary"
FROM Employee
    INNER JOIN Employee Manager ON Employee.managerid = Manager.id
WHERE Employee.Salary > Manager.Salary
    

 

2. https://leetcode.com/problems/rising-temperature/

더보기

DATE 계산 방법을 이용해서 RecordDate로 JOIN을 진행  

SELECT today.id
FROM Weather AS today
	INNER JOIN Weather AS yesterday 
    	ON today.recorddate = DATE_ADD(yesterday.recorddate, INTERVAL 1 DAY)
WHERE today.Temperature > yesterday.Temperature

 

+) MySQL 시간 더하기, 빼기

 

DATE_ADD(기준 날짜, INTERVAL)

  • SELECT DATE_ADD(NOW(), INTERVAL 1 SECOND)
  • SELECT DATE_ADD(NOW(), INTERVAL 1 MINUTE)
  • SELECT DATE_ADD(NOW(), INTERVAL 1 HOUR)
  • SELECT DATE_ADD(NOW(), INTERVAL 1 DAY)
  • SELECT DATE_ADD(NOW(), INTERVAL 1 MONTH)
  • SELECT DATE_ADD(NOW(), INTERVAL -1 YEAR)

 

DATE_SUB(기준 날짜, INTERVAL)

  • SELECT DATE_SUB(NOW(), INTERVAL 1 SECOND)

 

 

 


 

< 기초 SQL 시리즈 >

 

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 1부

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 2부

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 3부 完

 

< 중급 SQL 시리즈 >

 

2020/07/15 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 1부

2020/07/15 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 2부

2020/07/16 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 3부

2020/07/16 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 4부 完

 

 

이 포스팅은 해당 강좌를 수강하며 작성하였습니다.

https://www.inflearn.com/course/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-%EC%A4%91%EA%B8%89-SQL

 

[백문이불여일타] 데이터 분석을 위한 중급 SQL - 인프런

SQL 중급 이론을 배우고, 실습 문제를 함께 풀어봅니다. 초급 중급이상 데이터베이스 데이터베이스 데이터 분석 SQL 데이터 분석 온라인 강의 업무에 SQL을 바로 적용할 수 있고 SQL 코딩 테스트도 �

www.inflearn.com

 

 

조건문 CASE

 

 

예시 1) 카테고리 id 값이 1이면 음료, 2면 조미료, 그 외의 카테고리는 기타로 조회

SELECT CASE
		WHEN categoryid = 1 THEN '음료'
        	WHEN categoryid = 2 THEN '조미료'
        	ELSE '기타'
       END
FROM Products

 

 

예시 2) 카테고리 별 평균 가격 조회

SELECT CASE
		WHEN categoryid = 1 THEN '음료'
       		WHEN categoryid = 2 THEN '소스'
            	ELSE '이외'
       END AS "new category"
       , AVG(Price)
FROM Products
GROUP BY "new category"

 

 

 

CASE를 활용한 테이블 피봇

 

예시 1) CategoryId = 1인 상품의 가격에 대해서 평균 값을 알고 싶은 경우

SELECT AVG(CASE WHEN categoryId = 1 THEN price ELSE NULL END) "category1 price"
FROM Products

 

예시 2) 카테고리 별로 평균 가격을 조회

SELECT AVG(CASE WHEN categoryId = 1 THEN price ELSE NULL END) "category1 price" 
	,AVG(CASE WHEN categoryId = 2 THEN price ELSE NULL END) "category2 price" 
        ,AVG(CASE WHEN categoryId = 3 THEN price ELSE NULL END) "category3 price" 
FROM Products

이렇게 평균값을 조회할 수 있는데, 결과값이 가로로 펼쳐져 있는 것을 pivoting 이라 한다.

 

예시 이미지는 더보기에 링크 참고

 

 

 


 

 

HACKER RANK

 

 

1. Type of Triangle

 

 

풀이과정은 아래 더보기 클릭

더보기

제일 쉬운 정사각형을 잡아내는 것 부터 시작하면 수월함

 

SELECT CASE
			WHEN a = b AND b = c THEN 'Equilateral'
			ELSE 'Other'
			END, a, b, c
FROM Triangles

 

이 질의문으로 먼저 정사각형이 잘 조회되고 있는지 3 변의 길이와 비교하며 확인

 

 

 

이등변 삼각형은 정삼각형과 겹치는 조건이 있기 때문에 Not A Triangle을 먼저 작성해주는 것이 좋음

즉, a = b AND b = c THEN 'Equilateral' 이라고 했을 때, a = b OR b = c OR a = c THEN 'Isosceles' 를 이등변 삼각형의 조건으로 넘겨주면 이등변 삼각형도 정삼각형에 포함된다.

 

그걸 방지하기 위해서 순서를 Equilateral을 먼저 조회로 필터링을 마치고, 그 다음에 Isosceles를 조회해주어야 한다.

CASE 절의 순서도 매우 중요!!

 

SELECT CASE
		WHEN a = b AND b = c THEN 'Equilateral'
            	WHEN a = b OR b = c OR a = c THEN 'Isosceles'
                ELSE 'Other'
       END, a, b, c
FROM Triangles

 

결과 값을 확인해보니 테이블에 20 20 40 이 이등변 삼각형에 포함된 것을 확인할 수 있다.

수식에 의하면 20 + 20 > 40 이 성립하지 않기 때문에 Not A Triangle에 포함되어야 하는 삼각형임을 알 수 있다.

 

이런 현상을 방지하기 위해서는 위에서 언급했듯이 CASE 문의 순서를 조절하여 삼각형이 아닌 것 부터 걸러주어야 한다.

 

<답>

 

SELECT CASE	
	        WHEN a = b AND b = c THEN 'Equilateral'
	        WHEN a + b <= c OR b + c <= a OR a + c <= b THEN 'Not A Triangle'
        	WHEN a = b OR b = c OR a = c THEN 'Isosceles'
        	ELSE 'Scalene'
       END
FROM Triangles

 

 

 

 

 

LEETCODE

 

1179. Reformat Department Table

 

문제 주소 - https://leetcode.com/problems/reformat-department-table/

 

Reformat Department Table - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

풀이는 더보기 클릭

더보기

1179. Reformat Department Table 는 CASE 문제로 각 부서의 월 수익을 pivoting하여 조회하는 것

 

이 문제에서 중요한 포인트는 단순히 수익을 합산하여 나타내는 것도 있겠지만, GROUP BY로 각 부서를 집단화 시키는 것이다.

즉, 부서의 id로 묶어서 집계함수 SUM을 사용하여 월 수익을 조회하면 된다.

 

<답>

 

SELECT  id
        , SUM(CASE WHEN month = 'Jan' THEN revenue ELSE NULL END) Jan_Revenue
        , SUM(CASE WHEN month = 'Feb' THEN revenue ELSE NULL END) Feb_Revenue
        , SUM(CASE WHEN month = 'Mar' THEN revenue ELSE NULL END) Mar_Revenue
        , SUM(CASE WHEN month = 'Apr' THEN revenue ELSE NULL END) Apr_Revenue
        , SUM(CASE WHEN month = 'May' THEN revenue ELSE NULL END) May_Revenue
        , SUM(CASE WHEN month = 'Jun' THEN revenue ELSE NULL END) Jun_Revenue
        , SUM(CASE WHEN month = 'Jul' THEN revenue ELSE NULL END) Jul_Revenue
        , SUM(CASE WHEN month = 'Aug' THEN revenue ELSE NULL END) Aug_Revenue
        , SUM(CASE WHEN month = 'Sep' THEN revenue ELSE NULL END) Sep_Revenue
        , SUM(CASE WHEN month = 'Oct' THEN revenue ELSE NULL END) Oct_Revenue
        , SUM(CASE WHEN month = 'Nov' THEN revenue ELSE NULL END) Nov_Revenue
        , SUM(CASE WHEN month = 'Dec' THEN revenue ELSE NULL END) Dec_Revenue
FROM Department
GROUP BY id

 

 


 

< 기초 SQL 시리즈 >

 

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 1부

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 2부

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 3부 完

 

< 중급 SQL 시리즈 >

 

2020/07/15 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 1부

2020/07/15 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 2부

2020/07/16 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 3부

2020/07/16 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 4부 完

 

 

이 포스팅은 해당 강좌를 수강하며 작성하였습니다.

https://www.inflearn.com/course/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-%EC%A4%91%EA%B8%89-SQL

 

[백문이불여일타] 데이터 분석을 위한 중급 SQL - 인프런

SQL 중급 이론을 배우고, 실습 문제를 함께 풀어봅니다. 초급 중급이상 데이터베이스 데이터베이스 데이터 분석 SQL 데이터 분석 온라인 강의 업무에 SQL을 바로 적용할 수 있고 SQL 코딩 테스트도 �

www.inflearn.com

 

 

강의를 듣기 전 준비해야 할 링크

LeetCode - https://leetcode.com/contest/

 

 


 

 

 

COUNT / SUM / AVG / MIN, MAX

 

 

COUNT, AVG에서 NULL은 집계되지 않는다.

Id Name Visits
1 A 1
2 A 2
3 B 3
4 C 5
5 NULL NULL

 

SELECT COUNT(*)
FROM sample		//5

SELECT COUNT(Name)
FROM sample		//4

SELECT COUNT(DISTINCT Name)
FROM sample		//3

 

Products 테이블에서 모든 제품 가격의 합 구하기

 

SELECT SUM(Price)
FROM Products

SUM()

 

Products 테이블에서 제품 가격의 평균 구하기

 

SELECT ROUNT(AVG(Price))
FROM Products

AVG()

 

 

+) 평균을 구할 때 NULL을 0으로 변환하여 계산하는 방법

SELECT SUM(Visits) / COUNT(*)
FROM sample

 

 

Products 테이블에서 최저 가격과 최고 가격 조회

 

SELECT MIN(Price) 최저가격
	, MAX(Price) 최고가격
FROM Products

MIN(), MAX()

 

 


 

 

GROUP BY & HAVING

 

 

어떤 공급자가 보통 얼마의 상품을 판매하는지 TOP3 조회하기

SELECT SupplierID 공급자
	, ROUND(AVG(Price)) "평균 가격"
FROM Products
GROUP BY SupplierID
ORDER BY "평균 가격"
LIMIT 3

 

 

GROUP BY에서  WHERE와 HAVING의 차이

 

예를 들어서  WHERE 절로 가격이 100불 이상인 것을 조회한다고 했을 때, 명령어 진행 순서상

 

  1. 가격이 100불 이상인 것 조회
  2. GROUP BY 명령어 실행
SELECT SupplierID
	, CategoryID
	, AVG(Price)
FROM Products
WHERE Price >= 100
GROUP BY SupplierID, CategoryId

 

 

HAVING 절을 사용한다면

 

  1. GROUP BY 명령어 실행 (그룹화)
  2. 그룹화 된 결과에서 가격이 100불 이상인 것 조회
SELECT SupplierId
	, CategoryId
	, AVG(Price)
FROM Products
GROUP BY SupplierId, CategoryId
HAVING Price >= 100

 

 


 

 

HACKER RANK

 

1.Revising Aggregations - Averages

SELECT AVG(Population)
FROM City
GROUP BY District
HAVING District = "California"

 

 

2. Revising Aggregations - The Sum Function

SELECT SUM(Population)
FROM City
WHERE District = "California"

 

 

3. Revising Aggregations - The Count Function

SELECT COUNT(District)
FROM City
WHERE Population > 100000

 

 

 

4. Average Population

SELECT ROUND(AVG(Population))
FROM City

 

 

 

5. Population Density Difference

SELECT (MAX(Population)-MIN(Population))
FROM City

 

 

 

 

6. Weather Observation Station 4

SELECT (COUNT(*) - COUNT(DISTINCT City))
FROM Station

 

 

 

7. Top Earners

 

 

SELECT (salary * months)
	, COUNT(*)
FROM Employee
GROUP BY (salary * months)
ORDER BY (salary * months) DESC
LIMIT 1

 

 


 

< 기초 SQL 시리즈 >

 

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 1부

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 2부

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 3부 完

 

< 중급 SQL 시리즈 >

 

2020/07/15 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 1부

2020/07/15 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 2부

2020/07/16 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 3부

2020/07/16 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 4부 完

 

 

이 포스팅은 해당 강좌를 수강하며 작성하였습니다.

https://www.inflearn.com/course/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-%EC%A4%91%EA%B8%89-SQL

 

[백문이불여일타] 데이터 분석을 위한 중급 SQL - 인프런

SQL 중급 이론을 배우고, 실습 문제를 함께 풀어봅니다. 초급 중급이상 데이터베이스 데이터베이스 데이터 분석 SQL 데이터 분석 온라인 강의 업무에 SQL을 바로 적용할 수 있고 SQL 코딩 테스트도 �

www.inflearn.com

 

데이터 순서 정렬하기

 

ORDER BY

 

ORDER BY의 사용 순서는 SELECT -> FROM -> WHERE -> ORDER BY으로 제일 마지막에 위치

 

mysql은 기본적으로 오름차순

SELECT *
FROM customers
ORDER BY customerid

 

ORDER BY 정렬 결과 스크린샷

 

customerid 내림차순(큰 것 부터)

SELECT *
FROM customers
ORDER BY customerid DESC

 

내림차순 결과 스크린샷

 


 

정렬하기 응용

 

가격이 20$ 이상이고, 가격이 높은 순으로 물건을 조회해라 (10개)

SELECT *
FROM products
WHERE price >= 20
ORDER BY price DESC
LIMIT 10

결과 스크린샷

 


 

+) MySQL 소수점 처리

 

CEIL() - 올림

SELECT CEIL(5.5) => 6

 

FLOOR() - 내림

SELECT FLOOR(5.5) => 5

 

ROUND() - 반올림

ROUND(5.556901, 4) => 5.5569

 

 

+) MySQL 문자열 자르기

 

LEFT(컬럼명, 문자열 길이)

SELECT LEFT("20140323", 4) => 2014

 

RIGHT(컬럼명, 문자열 길이)

SELECT RIGHT("20140323", 4) => 0323

 

SUBSTRING(컬럼명, 시작 위치, 길이) = SUBSTR()

SUBSTR("20140323", 1, 4) => 2014

SUBSTR("20140323", 5) => 0323


 

HACKER RANK

 

 

1. Employee Names

SELECT name
FROM employee
ORDER BY name

 

결과 스크린샷

 

 

 

2. Employee Salaries

SELECT name
FROM employee
WHERE salary >= 2000 AND months < 10
ORDER BY employee_id

 

 

 

3. Higher Than 75 Marks

SELECT name
FROM students
WHERE marks > 75
ORDER BY SUBSTR(name, -3), id

 

결과 스크린샷

 

 

4. Weather Observation Station 15 

SELECT ROUND(long_w, 4)
FROM station
WHERE lat_n < 137.2345
ORDER BY lat_n DESC
LIMIT 1

 

결과화면

 


< 기초 SQL 시리즈 >

 

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 1부

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 2부

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 3부 完

 

 

 

이 포스팅은 해당 강좌를 수강하며 작성하였습니다.

https://www.inflearn.com/course/%EB%B0%B1%EB%AC%B8%EC%9D%B4%EB%B6%88%EC%97%AC%EC%9D%BC%ED%83%80-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-%EA%B8%B0%EC%B4%88-SQL

 

[백문이불여일타] 데이터 분석을 위한 기초 SQL - 인프런

SQL 기초 이론을 배우고, 해커랭크 문제 10개를 함께 풀어봅니다. 입문 데이터베이스 데이터베이스 데이터 분석 SQL 데이터 분석 온라인 강의 생초보도 따라할 수 있는 SQL 기초강의 듣고 코딩 테스

www.inflearn.com

 

+ Recent posts