본문 바로가기

verdantjuly/Today I Learned

TIL 20241022

728x90

이번 주 목표  Weekly Plan

짧은 산책 프로젝트 기획 초안 작성

수업 집중

오늘 목표  Daily Plan

짧은 산책 프로젝트 기획 초안 작성

수업 집중

오늘 한 것  Done Today

짧은 산책 프로젝트 기획 초안 작성

수업 집중

1. count

SELECT 
count(*),
count(cust_id),
count(city),
count(region),
count(1) -- count(*) 와 같음 : 속도가 미세하게 빨라질 수 있을 것 같다 -선생님
FROM customer
WHERE city = "서울";

 

2. 집계 함수

-- 집계 함수
SELECT 
sum(mileage),
avg(mileage),
min(mileage),
max(mileage)
FROM customer
WHERE city IN ("서울", "부산");

 

3. GROUP BY

SELECT
city,
count(*) as "고객수",
avg(mileage) as "평균마일리지"
FROM customer
GROUP BY city;

 

4. GROUP BY 문제 

-- [문제 1] 고객 테이블에서 직급별, 도시별로 회원 명수 및 평균 마일리지와 총 마일리지를 구해라 

SELECT 
contact_position, 
city, 
count(*) AS "회원 명수", 
avg(mileage) AS "평균 마일리지", 
sum(mileage) AS "총 마일리지"
FROM customer
GROUP BY contact_position, city

 

5. HAVING

-- HAVING
SELECT
city,
count(1) AS "고객수",
avg(mileage) AS "평균 마일리지"
FROM customer
GROUP BY city
HAVING count(1) > 1;

 

6. HAVING 문제

-- [문제 2] 고객 테이블에서 도시별 총 마일리지를 구해 주세요
-- [문제 3] 총 마일리지가 500 이상인 도시만 출력해 보세요
SELECT city, sum(mileage) AS "총 마일리지"
FROM customer
WHERE 1 = 1
GROUP BY city
HAVING sum(mileage) >= 500;

 

7. HAVING 심화

SELECT 
city,
count(1) AS "고객수"
FROM customer
WHERE 1=1
AND contact_position = "대표"
GROUP BY city;

 

8. group_concat 

한 줄로 붙이기

SELECT group_concat(name, ", ") as names from employee;

 

9. subquery

SELECT group_concat(city, ", ") AS cities from (
    select DISTINCT city 
    from customer 
);

 

10. 종합 문제

-- [문제 4] 도시별로 회사이름을 콤마로 출력해보세요
-- 결과 예시
-- 서울 : ABC상사, DEF상사, IHK상사 ...ABORT
-- 부산 : DEF상사 ...
-- 대전 : EEE상사 ...

SELECT city, group_concat(company_name, ", ") AS companies from (
    select DISTINCT company_name, city
    from customer )
GROUP BY city;

 

 

11. count 함수 안에 DISTINCT 가능

SELECT count(city) as cities,
count(DISTINCT city) as unique_cities
FROM customer;

 

 

12. count와 strftime을 이용한 GROUP BY

SELECT
strftime("%Y", order_date) as order_year,
count(*) AS order_cnt
FROM orders
GROUP BY order_year;

 

 

13. GROUP BY 와 strftime 를 이용한 분류

-- [문제 6] 연도별, 월별, 주문 개수를 출력해 주세요.
-- 2024 01 99
-- 2024 02 1
-- 2024 03 12
SELECT
strftime("%Y",order_date) as order_year,
strftime("%m",order_date) as order_month,
count(*) AS order_cnt
FROM orders
GROUP BY order_year, order_month;

 

 

14. 분기  계산, 반기 계산

분기는 3으로 나누고

-- 연도별, 분기별, 주문 갯수 
SELECT
strftime("%Y",order_date) as order_year,
(strftime("%m",order_date) -1)/ 3 + 1 as quater, -- 분기
count(*) AS order_cnt
FROM orders
GROUP BY order_year, quater;

 

반기는 6로 나누면 됨

-- 연도별, 반기별, 주문 갯수 
SELECT
strftime("%Y",order_date) as order_year,
(strftime("%m",order_date) -1)/ 6 + 1 as half, -- 반기
count(*) AS order_cnt
FROM orders
GROUP BY order_year, half;

 

 

 

15. 문제

-- [문제 7] 고객 테이블에서 마일리지가 300 이상인 사람은 VVIP, 
-- 200 이상인 사람은 VIP
-- 100 이상이면 일반고객
-- 100 미만이면 고객 -- customer_type
-- 고객 별로 평균 마일리지와 고객수를 구해 보세요
select 
CASE 
WHEN mileage >= 300 THEN "VVIP"
WHEN mileage >= 200 THEN "VIP"
WHEN mileage >= 100 THEN "일반고객"
WHEN mileage < 100 THEN "고객"
END AS 고객분류,
count(*) AS total_cnt,
sum(mileage) AS total_mileage
from customer
GROUP BY 고객분류;

 

 

16. JOIN

SELECT d.dept_id, d.dept_name, e.name, e.position 
FROM department d
JOIN employee e 
ON d.dept_id = e.dept_id
WHERE e.name = "홍길동";

 

 

17. INNER JOIN 시 JOIN 키워드 생략

SELECT d.dept_id, d.dept_name, e.name, e.position 
FROM department d, employee e 
WHERE 1=1
AND d.dept_id = e.dept_id
AND e.name = "홍길동";

 

18. JOIN 문제

-- [문제 8] order_table, customer_table join
-- 고객사명, 담당자명, 주문번호, 주문일자를 출력해 보세요 

SELECT 
c.company_name, c.contact_name, o.order_no, o.order_date
FROM orders o, customer c
WHERE o.cust_id = c.cust_id;

 

 

19. JOIN 심화

select 
c.cust_id,
c.contact_name,
c.company_name,
count(o.order_id) as order_cnt
from customer c join orders o  on c.cust_id = o.cust_id
GROUP BY c.cust_id, c.contact_name, c.company_name;

 

 

20. JOIN GROUP BY

-- 부서별로 사원 수를 세어 보세요.
select d.dept_name,
count(*)
from department d, employee e
where 1=1
and d.dept_id = e.dept_id
GROUP BY d.dept_name

 

21. JOIN 테이블 3개 

-- 고객 테이블과 주문 테이블 그리고 주문 상세 테이블을 조인하여 
-- 고객 아이디, 담당자명, 회사명, 주문 총액을 출력하는데
-- 주문 총액이 많은 순으로 정렬해 보겠습니다

SELECT
c.cust_id, 
c.contact_name, 
c.company_name,
sum(od.unit_price * od.quantity) as total_order_amount
FROM customer c 
JOIN orders o ON c.cust_id = o.cust_id
JOIN order_details od ON o.order_id = od.order_id
GROUP BY c.cust_id,
c.contact_name,
c.company_name
ORDER BY total_order_amount DESC;

 

22. LEFT JOIN

SELECT 
e.emp_id, e.name, e.position, d.dept_name 
FROM employee e
LEFT JOIN department d ON e.dept_id = d.dept_id;

 

23. 같은 테이블 LEFT JOIN

-- emp_id, name, position, manager_name, manager_position 
SELECT e.emp_id, e.name, e.position,
m.name as manager_name , m.position as manager_position
FROM employee e left join employee m on e.manager_no = m.emp_id;

 

24. select subquery

-- 문제
-- 사원 테이블에서 사원 번호, 사원명, 매니저 번호, 매니저 이름을 가져오는데 
-- subquery를 이용해서 가져올 수 있도록 하시오

SELECT e.emp_id, e.name, (
    SELECT m.emp_no from employee as m
    where e.manager_no = m.emp_id
), (
    SELECT m.name from employee as m
    where e.manager_no = m.emp_id
) from employee e

 

25. insert

insert into department(dept_no, dept_name) VALUES ("A6", "운영부");

 

26. update

update employee set name = "홍영미",eng_name = "hong youngmi", position = "이사" where emp_id = 28;

27. delete

delete from product where product_id = 92;

 

28. create table

create table customer_order_summary (
    cust_id INTEGER PRIMARY KEY,
    company_name varchar(50),
    order_count INTEGER,
    last_order_date date 
);

29. Table에 통째로 넣기

INSERT INTO customer_order_summary  (cust_id, company_name, order_count, last_order_date)
select 
c.cust_id, 
c.company_name, 
count(*),
max(o.order_date)
from customer c join orders o on c.cust_id = o.cust_id
GROUP BY c.cust_id, c.company_name;

 

create table customer_order_summary2 AS
select 
c.cust_id, 
c.company_name, 
count(*),
max(o.order_date)
from customer c join orders o on c.cust_id = o.cust_id
GROUP BY c.cust_id, c.company_name;

30. View Table

-- 제품별로 주문 수량을 먼저 알고 싶어요 
CREATE view view_product_order_summary as
SELECT
p.product_id, p.product_name,
sum(od.quantity) as total_quantity,
sum(od.quantity * od.unit_price) as total_price
FROM product p join order_details od on p.product_id = od.product_id
GROUP BY p.product_id, p.product_name
ORDER BY total_quantity desc;

select * from view_product_order_summary;

 

 

 


정리  Memo

분기는 3으로 나누고

-- 연도별, 분기별, 주문 갯수 
SELECT
strftime("%Y",order_date) as order_year,
(strftime("%m",order_date) -1)/ 3 + 1 as quater, -- 분기
count(*) AS order_cnt
FROM orders
GROUP BY order_year, quater;

 

반기는 6로 나누면 됨

-- 연도별, 반기별, 주문 갯수 
SELECT
strftime("%Y",order_date) as order_year,
(strftime("%m",order_date) -1)/ 6 + 1 as half, -- 반기
count(*) AS order_cnt
FROM orders
GROUP BY order_year, half;

 

group_concat

한 줄로 붙이기

SELECT group_concat(name, ", ") as names from employee;

 

INNER JOIN 시 JOIN 키워드 생략

SELECT d.dept_id, d.dept_name, e.name, e.position 
FROM department d, employee e 
WHERE 1=1
AND d.dept_id = e.dept_id
AND e.name = "홍길동"

 

 

KPT

Keep

열심히 하는 것

Problem

게임을 많이 하는 것

Try

게임을 줄이고 집중하기

소감  Diary

TIL 을 오랜만에 적는다. 

보람차다. 

 

 

 

 

 

'verdantjuly > Today I Learned' 카테고리의 다른 글

TIL 20241024  (0) 2024.10.25
TIL 20241023  (5) 2024.10.23
TIL 20241021  (0) 2024.10.21
TIL 20240926  (0) 2024.09.27
TIL 20240925  (5) 2024.09.25