PostgreSQL 26

[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 문법] 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@..

[SQL 문법] LIKE

유사한 패턴을 가지는 요소를 뽑는다. 이름이 'Jan'으로 시작하는 사람 찾기 SELECT c.first_name , c.last_name FROM customer c WHERE c.first_name LIKE 'Jan%'; 'Jan'이 포함 된 것들이 나옵니다. 검색할 때 사용할 듯 하네요. 여기에 쓰이는 두 개 도우미가 있습니다. '%'와 '_' SELECT 'foo' LIKE 'foo' ,'foo' LIKE 'f%' ,'foo' LIKE '%o' ,'foo' LIKE 'F%' ,'foo' LIKE '_o_' ,'foo' LIKE 'f_' ,'fow' LIKE '%o'; %는 개수에 상관 없이 뭐든 포함 되고, _는 개수가 무조건 맞아야 합니다. 그리고 대소문자 구분합니다 따라서 위의 결과는 참,참,..

[SQL 문법] BETWEEN

특정 범위의 값을 뽑기 'payment' 테이블에서 amount 값이 8과 9 사이인 값 뽑기 SELECT p.customer_id , p.payment_id , p.amount FROM payment p WHERE p.amount BETWEEN 8 AND 9; 결과는 간단하다 반대로 8과 9 사이에 없는 값 뽑기 - NOT SELECT p.customer_id , p.payment_id , p.amount FROM payment p WHERE p.amount NOT BETWEEN 8 AND 9; 결과도 단순~ 일자 비교하기 - 실전 BETWEEN은 일자 비교에 많이 쓰임. 하지만 일자에서 timestamp 형은 비교에 제대로 안됨. 따라서 형을 바꿔야하는데, SELECT p.customer_id , p..