SQL 12

[쉽게 쓴 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] 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] 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..