데이터 분석 41

[SQL 문법] ROLLUP ( ) 절

GROUP BY를 한 컬럼을 기준으로 가능한 소계를 모두 보기 위해 사용한다 * roll up : 말아 올린다. * 소계 : 영어로 subtotal, 전체가 아닌 어느 한 부분만을 셈한 합계 (출처 : 네이버 사전) 브랜드를 기준으로 각 세그먼트의 소계 및 전체 합계를 보고 싶다 지난 글에서 했듯이 GROUPING SETS를 통해 할 수 있다 SELECT brand, segment, sum(revenue) FROM sales_items GROUP BY GROUPING SETS ( (brand,segment), (brand), ()) ORDER BY brand, segment; 이와 동일한 것이 ROLLUP SELECT brand, segment, sum(revenue) FROM sales_items GR..

[SQL 문법] GROUPING SET 절, GROUPING 함수

다양한 기준으로 집계함수(sum, count 등)를 사용하여 도출한 결과를 한 눈에 보려면 UNION ALL 을 써야 한다. 이것을 쉽게 정리할 수 있게 돕는다 판매 제품에 대한 테이블이 있다 CREATE TABLE sales_items ( brand varchar NOT NULL ,segment varchar NOT NULL ,revenue int NOT NULL ,primary KEY (brand, segment) ); INSERT INTO sales_items (brand, segment, revenue) VALUES ('abc', 'premium', 100) ,('abc','basic',200) ,('xyz','premium',100) ,('xyz', 'basic', 300) ; 브랜드 별, 세그..

[SQL 문법] HAVING

group by 를 사용하고 집계함수를 써 결과 값을 만들어 내는데, 그 결과 값을 필터링 하기 위함 where는 결과 이전을 필터링 하고 having은 그 이후를 필터링 구매량이 200 이상인 고객을 찾고 싶다 SELECT p.customer_id ,sum(p.amount) AS amount FROM payment p GROUP BY customer_id HAVING sum(p.amount) > 200 ORDER BY amount DESC; ORDER BY amount 는 됐는데, HAVING amount > 200 은 안됨. 구매량의 합이 190 이상인 고객이 이용한 매장을 알고 싶다 SELECT p.customer_id ,c.store_id ,sum(p.amount) AS amount FROM pa..

[SQL 문법] GROUP BY

특정 column 기준으로 그룹을 나눈다 payment 테이블에서 각 customer 만 뽑는다 SELECT p.customer_id FROM payment p GROUP BY p.customer_id ; 599건이 나옴. 전에 썼던 select distinct 로 활용 가능 SELECT DISTINCT p.customer_id FROM payment p ; 거래액이 가장 많은 고객 순으로 뽑고 싶다 SELECT p2.customer_id ,sum( p2.amount ) AS amount_sum FROM payment p2 GROUP BY p2.customer_id ORDER BY amount_sum DESC ; sum 함수 없이 쓰면 이런 오류가 나온다. *aggregate function : 집계함수..

[SQL 문법] NATURAL JOIN

자동으로 값의 일부가 같은 행을 묶어준다. 하지만 실무에서는 잘 쓰이지 않는다. 오류가 생길 수 있기 때문 우리가 natural join 에 기대하는 상황 CREATE TABLE CATEGORIES ( CATEGORY_ID SERIAL PRIMARY KEY ,CATEGORY_NAME VARCHAR (255) NOT NULL ); CREATE TABLE PRODUCTS ( PRODUCT_ID SERIAL PRIMARY KEY ,PRODUCT_NAME VARCHAR(255) NOT NULL ,CATEGORY_ID INT NOT NULL ,FOREIGN KEY (CATEGORY_ID) REFERENCES CATEGORIES (CATEGORY_ID) ); INSERT INTO CATEGORIES (CATEGOR..

[SQL 문법] CROSS JOIN

모든 row 의 내용을 교차하여 새로운 테이블 생성 샘플 테이블 cross_t1, cross_t2 가 있다 CREATE TABLE cross_t1 ( LABEL char(1) PRIMARY key ); CREATE TABLE cross_t2 ( score int PRIMARY key ); INSERT INTO cross_t1(label) VALUES ('a') ,('b'); INSERT INTO cross_t2(score) VALUES (1) ,(2) ,(3); COMMIT; SELECT * FROM cross_t1 ; SELECT * FROM cross_t2 ; CROSS JOIN SELECT * FROM cross_t1 CROSS JOIN cross_t2 ORDER BY LABEL ; 2 x 3 = ..

[SQL 문법] FULL OUTER JOIN

전체 집합의 내용을 알고 싶을 때, 즉 테이블 A, B가 있을 때, 겹치는 것, 겹치지 않는 것 전부 포함해서 보여주자는 것. 부서 테이블, 직원 테이블이 있을 때 하나의 부서는 여러개의 직원을 가질 수 있다 CREATE TABLE IF NOT EXISTS departments ( department_id serial PRIMARY KEY ,department_name varchar(255) NOT NULL ); CREATE TABLE IF NOT EXISTS employees ( employee_id serial PRIMARY KEY ,employee_name varchar(255) ,department_id integer ); SELECT * FROM departments ; SELECT * FROM..

[SQL 문법] SELF JOIN + ON

같은 테이블에서 같은 속성끼리 묶어서 조인하고 싶을 때 사용. 조직도 테이블이 있을 때(테이블 세팅), CREATE TABLE employee ( employee_id int PRIMARY KEY ,first_name varchar (255) NOT NULL ,last_name varchar (255) NOT NULL ,manager_id int ,FOREIGN KEY (manager_id) REFERENCES employee(employee_id) ON DELETE CASCADE ); INSERT INTO employee ( employee_id ,first_name ,last_name ,manager_id ) VALUES (1, 'windy', 'hays',null) ,(2, 'ava','christ..

[SQL 문법] INNER JOIN + ON

두 테이블의 교집합을 찾는 JOIN 모든 'customer'의 'payment' amount,payment_date를 확인하기 SELECT C.customer_id ,C.first_name ,C.last_name ,C.email ,P.amount ,P.payment_date FROM customer c INNER JOIN payment p ON C.customer_id =P.customer_id ; 그 중 id=3인 사람의 내역 확인하기 SELECT c.customer_id ,c.first_name ,c.last_name , c.email ,p.amount ,p.payment_date FROM customer c INNER JOIN payment p ON c.customer_id = p.customer_..

[SQL 문법] IS NULL

NULL 은 아무것도 아닌, 아무것도 없는 값. 테이블을 만든다고 값을 전부 넣을 필요는 없다. 우리가 회원가입 시 개인정보 입력할 때 필수 입력이 아닌 것이 있듯이. 즉, NULL 이 생길 수 있다. NULL 찾기 CREATE TABLE contacts ( id int GENERATED BY DEFAULT AS IDENTITY , first_name varchar(50) NOT NULL ,last_name varchar(50) NOT NULL ,email varchar(255) NOT NULL ,phone varchar(15) ,PRIMARY key(ID) ); INSERT INTO contacts(first_name,last_name,email,phone) VALUES ('ho','do','doho@..