728x90
◎ SQL_Order by
-- ORDER BY를 활용한 관측치 정렬
SELECT *
FROM world.country
ORDER BY SurfaceArea;
-- ORDER BY 뒤에 기준이 될 변수를 입력
-- 오름차순이 기본값
SELECT *
FROM world.country
ORDER BY Continent, Population DESC;
-- 입력한 변수 순서대로 정렬. DESC는 각각의 변수에만 영향을 미침
-- 내림차순으로 정렬시에는 변수이름 뒤에 DESC를 추가로 입력
--Q1. sales.payments 테이블에서 2004년 1월 1일 이후 결제건으로
--연도/월, customerNumber별 결제 건수 및 amount의 합계 계산 후
--연도/월(오름차순), amount 합의 내림차순으로 정렬
select
customerNumber
, count(1) CNT
,sum(amount) AMT
, DATE_FORMAT(paymentDate, '%Y-%m') DT
from sales.payments
where paymentDate>='2004-01-01'
group by DT, customerNumber
order by DT , sum(amount) DESC;
-- SELECT + FROM + WHERE + GROUP BY + ORDER BY + HAVING (기본 순서)
-- Having
-- 요약값을 기준으로 일부 결과만 출력
--Q2. sales.orderdetails 테이블에서 productCode별
-- 관측치수(주문건수)와 quantityOrdered의 합계(주문수량합계),
-- quantityOrdered*priceEach의 합계(주문금액합계) 계산한 것 중에서
-- 주문건수가 25건 이상인 productCode 건만 출력
SELECT productCode,
COUNT(1) CNT
, SUM(quantityOrdered) AMT
, SUM(quantityOrdered*priceEach) TOTAL
FROM sales.orderdetails
group by productCode
HAVING CNT>=25;
◎ SQL_Join
-- 두 테이블 병합에는 여러가지 종류가 있다.
-- from절만 사용시 모든 가능한 조합을 만듦
SELECT T1.*, T2.*
FROM world.city T1, world.country T2;
SELECT T1.*, T2.*
FROM world.city T1, world.country T2
WHERE T1.CountryCode = T2.Code;
-- 모든 가능한 조합 중 T1의 CountryCode와 T2의 Code가 일치하는 것만 출력
-- INNER JOIN 키워드를 활용한 테이블 결합
SELECT D1.*, D2.*
FROM sakila.actor D1
INNER JOIN
sakila.customer D2
ON D1.first_name = D2.first_name;
-- first_name이 똑같으면 무조건 붙이기
-- FROM TABLE1 [INNER|LEFT|RIGHT|FULL] JOIN TABLE2 ON TABLE1.KEY1 = TABLE2.KEY2
-- left, right, full join 모두 동일한 구조
-- 3개 이상 테이블의 결합
SELECT D1.*, D2.*, D3.*
FROM sakila.rental D1
INNER JOIN
sakila.customer D2
ON D1.customer_id = D2.customer_id
INNER JOIN
sakila.payment D3
ON D1.rental_id = D3.rental_id;
-- Q3. customers 테이블의 country, orderdetails 테이블의 productCode별
--주문건수 및 quantitiyOrdered*priceEach의 합계(주문금액합계) 계산 후
--주문금액합계의 내림차순으로 정렬
SELECT b.country, c.productCode,
count(distinct a.orderNumber) CNT,
SUM(c.quantityOrdered * c.priceEach) AMT
FROM sales.orders a
INNER JOIN sales.customers b
ON a.customerNumber = b.customerNumber
INNER JOIN sales.orderdetails c
ON a.orderNumber = c.orderNumber
GROUP BY b.country, c.productCode
ORDER BY AMT DESC;
◎ SQL_Case
SELECT Name, Population,
CASE WHEN Population < 100000 THEN 'POP_GRP_1'
WHEN Population < 1000000 THEN 'POP_GRP_2'
WHEN Population < 5000000 THEN 'POP_GRP_3'
WHEN Population <10000000 THEN 'POP_GRP_4'
WHEN Population>=10000000 THEN 'POP_GRP_5'
ELSE 'ETC' END AS POP_GRP
FROM world.city
ORDER BY Population DESC;
-- 모든 조건과 일치하지 않으면 NULL(결측)처리
-- ELSE를 활용하여 나머지는 관측치에 대한 값 지정
-- 다양한 변수와 조건문으로 변수 생성 가능
728x90
'Data scientist > SQL' 카테고리의 다른 글
SQL_important (0) | 2021.11.07 |
---|---|
SQL_Practice_기온 데이터 분석 (0) | 2021.08.08 |
SQL_함수 (0) | 2021.08.06 |
SQL_TABLE (0) | 2021.08.05 |
SQL_기본 (0) | 2021.08.04 |