데이터 분석/SQL 36

[쉽게 쓴 SQL] UPDATE JOIN 문

JOIN과 UPDATE를 같이 하자! 사용법 : 다른 테이블의 내용을 참조해서 UPDATE 한다 UPDATE target_table a--update할 테이블 a SET a.COLUMN_1 = 표현식 --a의 컬럼을 어떻게 바꾼다 FROM ref_table b--참조 테이블 b 지정 WHERE a.column_1 = b.column_1-- 조인 조건 ; 실습 세팅 product와 product_segment 테이블을 만든다. 모든 product는 1개의 product_segment를 가지도록 만든다. DROP TABLE product; CREATE TABLE product_segment ( Id serial PRIMARY KEY, segment varchar NOT NULL, discount NUMERI..

[쉽게 쓴 SQL] UPDATE 문

테이블에 존재하는 데이터를 수정합니다. 동시성에 유의해야 합니다(?). 수정 시 대상 행을 LOCK을 잡는다. 영화관 표 예매 시스템처럼. table_name이라는 이름의 테이블의 column_1에는 value1을, column_2에는 value2를 넣는다 UPDATE table_name SET column_1 = value1, column_2 = value2 WHERE 조건 ; 이전 글에서 쓰던 테이블 사용하여, 'last_update' 컬럼을 추가하고 디폴트DEFAULT 값을 현재 시간(current_date)으로 바꾼다 ALTER TABLE link ADD COLUMN last_update date; ALTER TABLE link ALTER COLUMN last_update SET DEFAULT c..

[쉽게 쓴 SQL] INSERT 구문

테이블에 데이터를 삽입할 때 사용 table_name이라는 테이블에 value들을 순서대로 넣겠다. INSERT INTO table_name VALUES (value1,value2,value3,...) ; 자동으로 내용 들어감 (잘 안쓰임) table_name이라는 테이블의 column1,column2에 value1,2를 각각 넣겠다. INSERT INTO table_name (column1,column2) VALUES (value1,value2) ; 직접 넣는다. 예제) link라는 테이블을 만들어 데이터를 넣는다. CREATE TABLE link ( id serial PRIMARY KEY , url varchar(255) NOT NULL , name varchar(255) NOT NULL , desc..

[쉽게 쓴 SQL] ANY 그리고 IN, ALL

(연산자) 서브 쿼리의 값의 집합과 비교할 수 있다. WHERE ANY 영화 분류별, 가장 긴 상영시간은? SELECT DISTINCT max(f2.length) FROM film f2 , film_category fc WHERE f2.film_id = fc.film_id GROUP BY fc.category_id ORDER BY max ; 결과로 [178,181,183,184,185]의 집합이 나온다. (중복 제거 시) 영화 분류별로 상영시간이 가장 긴 영화보다 상영시간이 같거나 긴 영화는? - ANY ANY는 집합 중, 하나라도 만족하면 OK SELECT f.title , f.length FROM film f WHERE f.length >= ANY ( SELECT max(length) FROM fil..

[쉽게 쓴 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] LAG, LEAD 함수

* lag : 뒤처지다 * lead : 이끌다 이전 행의 값 또는 다음 행의 값을 알고 싶을 때 사용. 각 제품 보다 1단계 싼(이전 행의) 제품의 가격을 같이 보고, 그 차이를 알고 싶다. -LAG SELECT a.product_name ,b.group_name ,a.price ,LAG (a.price, 1) OVER (PARTITION BY b.group_name ORDER BY a.price) AS prev_price ,a.price - LAG (a.price, 1) OVER (PARTITION BY b.group_name ORDER BY a.price) AS cur_prev_diff FROM product a INNER JOIN product_group b ON (a.group_id = b.gro..