PostgreSQL 26

[쉽게 쓴 SQL] 서브쿼리란?

메인쿼리가 아닌것. 종류로는 중첩 서브쿼리, 인라인 뷰, 스칼라 서브쿼리가 있다 메인 쿼리란, SELECT avg(f.rental_rate) FROM film f ; 이런 것. SELECT f.film_id ,f.title ,f.rental_rate FROM film f WHERE f.rental_rate > 2.98; 또는 이런 것. 이걸 하나의 SQL문으로 만들 수 있을까? 중첩 서브쿼리 괄호를 써서 사용한다 SELECT f.film_id ,f.title ,f.rental_rate FROM film f WHERE f.rental_rate > ( SELECT avg(f.rental_rate) FROM film f ); 인라인 뷰 from 절 내에 괄호에 있는 쿼리 SELECT f.film_id ,f.t..

[쉽게 쓴 SQL] EXCEPT

[연산] 집합 두 개 중에 1개에만 해당되는 내용을 보고 싶을 때 엄청나게 많이 쓰인다! 재고가 있는 film_id 와 이름을 추출하려면? SELECT DISTINCT f2.film_id,f2.title FROM film f2 , inventory i2 WHERE f2.film_id = i2.film_id ORDER BY f2.film_id ; 958개의 결과가 있음 재고가 없는 film_id 와 이름을 추출하고 싶다 전체 필름 중에서 재고가 있는 것을 빼면 된다. '재고'라는 column이 있는 것이 아니므로, OUTER JOIN으로 '재고' IS NULL은 불가. SELECT f3.film_id, f3.title FROM film f3 EXCEPT SELECT DISTINCT f2.film_id, f..

[쉽게 쓴 SQL] INTERSECT

[연산] 두 집합의 교집합을 보고 싶다 교집합? 이전에 했던 INNER JOIN과 같지 않은가? 실제 쓰임에서는 INNER JOIN 과 같아 잘 안쓴다. 실습 세팅 CREATE TABLE employees ( employee_id serial PRIMARY KEY ,employee_name varchar(255) NOT null ); CREATE TABLE keys ( employee_id int PRIMARY KEY ,effective_date date NOT NULL ,FOREIGN key(employee_id) REFERENCES employees(employee_id) ); CREATE TABLE hipos ( employee_id int PRIMARY KEY ,effective_date date..

[쉽게 쓴 SQL] UNION + ALL

UNION [연산] : 집합(sql을 통해 추출된 결과)을 하나로 합칠 때 사용한다. 중복된 데이터를 생략해 준다. UNION ALL [연산] : 집합(sql을 통해 추출된 결과)을 하나로 합칠 때 사용한다. 중복 된 데이터도 보여 준다. union all이 더 많이 쓰인다. 실습 닮은 두 테이블 sales2007_1, sales2007_2를 만든다. CREATE TABLE sales2007_1 ( name varchar(50) ,amount NUMERIC(15, 2) ); CREATE TABLE sales2007_2 ( name varchar(50) ,amount numeric(15,2) ); INSERT INTO sales2007_1 VALUES ('mike',150000.25) ,('jonin',1..

[쉽게 쓴 SQL] FIRST_VALUE, LAST_VALUE 함수

특정 컬럼의 첫 번째, 혹은 마지막 값을 뽑고 싶다. 예제 세팅 글 각 제품 그룹에서 가장 낮은 값을 알고 싶다 - FIRST_VALUE SELECT a.product_name ,b.group_name ,a.price ,FIRST_VALUE (a.price) OVER (PARTITION BY b.group_name ORDER BY a.price) AS lowest_price_per_group FROM product a INNER JOIN product_group b ON (a.group_id = b.group_id); 그럼 가장 비싼 값을 알고 싶다면? SELECT a.product_name ,b.group_name ,a.price ,FIRST_VALUE (a.price) OVER (PARTITION B..

[쉽게 쓴 SQL] ROW_NUMBER, RANK, DENSE_RANK 차이

*dense : 빽빽한, 밀집한 세 개의 함수는 모두 순위를 매길 때 사용하지만, 조금씩의 차이가 있다. 예제 세팅 글 제품 가격이 낮은 순서로 순위를 매기고 싶다. 단, 같은 가격에도 순위 차이가 생기도록 한다. - ROW_NUMBER SELECT a.product_name ,b.group_name ,a.price ,ROW_NUMBER () OVER (PARTITION BY b.group_name ORDER BY a.price) FROM product a INNER JOIN product_group b ON (a.group_id = b.group_id); Postgresql에서는 같은 값을 가지는 ROW 중 ROW ID 가 높은 행이 우선 정렬된다 (desc 정렬에도 동일하다) = SELECT * FR..

[SQL 문법] AVG 함수

group_name 별 평균 가격을 알고 싶다 이전 글에서 준비한 product, product_group 테이블을 inner join 후 avg 함수 사용 SELECT a.group_name , avg(price) FROM product_group a INNER JOIN product b ON (a.group_id = b.group_id) GROUP BY a.group_name; 제품의 가격과 그 제품의 그룹 별 평균 가격을 같이 보고 싶다 이 때 분석함수를 사용 SELECT b.product_name , b.price , a.group_name , avg(b.price) OVER(PARTITION BY a.group_name) FROM product_group a INNER JOIN product b..

[SQL 문법] 분석 함수

집계의 결과와 테이블의 내용을 같이 보고 싶기 때문에 사용 실습 세팅 CREATE TABLE product_group ( group_id serial PRIMARY KEY, group_name varchar (255) NOT null ); CREATE TABLE product ( product_id serial PRIMARY KEY ,product_name varchar(255) NOT null ,price decimal (11,2) ,group_id int NOT null ,FOREIGN key(GROUP_id) REFERENCES product_group (group_id) ); INSERT INTO product_group (group_name) VALUES ('smartphone') ,('lapt..

[SQL 문법] CUBE () 절

다차원의 소계를 구한다 브랜드brand 별, 세그먼트segment 별 소계 및 전체 합계를 보고 싶다 역시 GRUOPING SETS로 아래와 같이 할 수 있다 SELECT brand, segment, sum(revenue) FROM sales_items GROUP BY GROUPING SETS ( (brand, segment), (brand), (segment), ()) ORDER BY brand, segment; 이를 쉽게 하는 방법이 CUBE() 절 SELECT brand, segment, sum(revenue) FROM sales_items GROUP BY CUBE (brand,segment) ORDER BY brand, segment; CUBE 절에 지정된 컬럼 수가 N개 면, 2의 N승 개의 레..

[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..