SQL 정리 - (1)

패스트 캠퍼스 모두를 위한sql 강의를 정리하였습니다.
PostgreSQL은 확장 가능성 및 표준 준수를 강조하는 객체-관계형 데이터베이스 관리 시스템(ORDBMS)의 하나이다.[위키백과]
DBeaver는 SQL 클라이언트이자 데이터베이스 관리 도구이다. [위키백과]

조인과 집계 데이터 정리

  • 조인
    • INNER JOIN () on
    • full outer JOIN () on
    • left,right JOIN () on
    • cross join
  • 집계 데이터
    • group by (group by한 컬럼은 select할 수 있지만 나머지는 집계함수를 사용해야함)
    • having (group by에 대한 조건)
    • grouping set
    • roll up (group by와 사용)
    • order by
    • cube(grouping set보다 간결)
    • 분석함수(avg, count) OVER (PARTITION BY B.GROUP_NAME, oreder by())
    • ROW_NUMBER,rank, dense_rank () OVER ( PARTITION BY B.GROUP_NAME ORDER BY A.PRICE)
    • (first,last) value
    • reg, lead

select

A.first_name<br> 

,A.last_name<br> 

,A.email<br> 

from

 customer A #ALIAS는 가독성을 위해서 사용

;


select

 first_name 

,last_name 

from 

customer 

order by first_name asc

; #오름차순


select

 first_name 

,last_name 

from 

customer 

order by first_name desc

; #내림차순


select 사용시에 distinct를 사용하면 중복 값을 제외한 결과값이 출력된다

slect

distinct column_1 from table_name;

데이터 필터

SELECT

 LAST_NAME --3

, FIRST_NAME

FROM

  CUSTOMER --1

WHERE

FIRST_NAME = 'Jamie'; --2 #조건을 걸어줌

AND LAST_NAME = 'Rice'; #AND를 사용해서 두가지 조건을 걸어줌

SELECT

   FILM_ID
 
 , TITLE
 
 , RELEASE_YEAR

FROM

 FILM

ORDER BY FILM_ID –ORDER BY를 한 결과중에서

LIMIT 5 ; –5건만 OFFSET 3; – (0,1,2,3,) 4번째 부터 뽑아달라는 명령어


SELECT

 FILM_ID

, TITLE

FROM

  FILM

ORDER BY TITLE

  • FETCH FIRST ROW ONLY #최초의 한건만 가져옴
  • FETCH FIRST (n) ROW ONLY #n개를 가져옴

;

#LIMIT절 이용이랑 비슷함


SELECT

CUSTOMER_ID

, RENTAL_ID

, RETURN_DATE
  
FROM RENTAL
 
    WHERE
   
    CUSTOMER_ID NOT IN (1, 2)#1과 2가 아닌것 not이 없으면 1 or 2       

    ORDER BY RETURN_DATE DESC;# or보다 in조건이 좋다

#서브쿼리

SELECT

  FIRST_NAME  #뽑아라

, LAST_NAME

FROM CUSTOMER #customer에서

WHERE CUSTOMER_ID IN ( #조건

                    SELECT
				    
                    CUSTOMER_ID
				    
                    FROM
				    
                    RENTAL
				    
                    WHERE 
                    
                    CAST (RETURN_DATE AS DATE) = '2005-05-27' );

SELECT

    CUSTOMER_ID
  
   , PAYMENT_ID
   
   , AMOUNT
   
FROM

PAYMENT
  
WHERE AMOUNT BETWEEN 8 AND 9; #BETWEEN을 이용(등호가 포함됨)

Like : 같은 문자열을 출력해줌

  • LIKE ‘%, _, %%, ‘등을 사용함

null값 찾을 때

Where Is null 사용

outer 조인 : 특정 컬럼을 기준으로 출력하면서 다른 컬럼은 특정 컬럼과 교집합되는 부분만 출력함.

self join 사용

SELECT

F1.TITLE

, F2.TITLE

, F1.LENGTH

FROM

FILM F1

INNER JOIN FILM F2

ON F1.FILM_ID <> F2.FILM_ID

AND F1. LENGTH = F2.LENGTH;

self join을 사용하는 이유(밑에건 작동 안함)

SELECT *

FROM film f1 –테이블을 조회

WHERE f1.LENGTH = f1.length

AND F1.FILM_ID <> f1.FILM_ID

;


full outer join은 left right inner join을 합한것

group by grouping grouping sets 사용법

SELECT

    CASE WHEN GROUPING(BRAND) = 0 AND GROUPING(SEGMENT) = 0 THEN '브랜드별+등급별'
		 
         WHEN GROUPING(BRAND) = 0 AND GROUPING(SEGMENT) = 1 THEN '브랜드별'
	     
         WHEN GROUPING(BRAND) = 1 AND GROUPING(SEGMENT) = 0 THEN '등급별'
		 
         WHEN GROUPING(BRAND) = 1 AND GROUPING(SEGMENT) = 1 THEN '전체합계'
		 
         ELSE '' 
		 
         END AS "집계기준"	
 , BRAND
 
 , SEGMENT
 
 , SUM (QUANTITY)

FROM

  SALES

GROUP BY

GROUPING SETS

(

(BRAND, SEGMENT)

, (BRAND)

, (SEGMENT)

, ()

)

ORDER BY BRAND, SEGMENT;


group by roll up

SELECT

BRAND

, SEGMENT

, SUM (QUANTITY)

FROM

SALES

GROUP BY

ROLLUP (BRAND, SEGMENT)

ORDER BY

BRAND, SEGMENT;

–group by별 합계 + rollup절에 맨 앞에 쓴 컬럼 기준의 합계도 나오고 + 전체 합계도 나왔다


cube는 grouping sets의 기능을 해준다.

SELECT

BRAND, SEGMENT

,sum(QUANTITY)

FROM SALES

GROUP BY

CUBE (BRAND, SEGMENT)

ORDER BY

BRAND, SEGMENT;


first value, last value

SELECT

   A.PRODUCT_NAME, B.GROUP_NAME, A.PRICE
 
 , FIRST_VALUE (A.PRICE) OVER 
 
 (PARTITION BY B.GROUP_NAME ORDER BY A.PRICE DESC ) 


​ 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

, LAST_VALUE (A.PRICE) OVER 

(PARTITION BY B.GROUP_NAME ORDER BY A.PRICE DESC 

RANGE BETWEEN UNBOUNDED PRECEDING

AND UNBOUNDED FOLLOWING) 

AS LOWEST_PRICE_PER_GROUP

FROM PRODUCT A

INNER JOIN PRODUCT_GROUP B

ON (A.GROUP_ID = B.GROUP_ID);


연월 기준 뽑기

SELECT

TO_CHAR(RENTAL_DATE, 'YYYY') ,

TO_CHAR(RENTAL_DATE, 'MM') ,

TO_CHAR(RENTAL_DATE, 'DD')

,count(*) 

FROM

RENTAL

GROUP BY

ROLLUP(

TO_CHAR(RENTAL_DATE, 'YYYY') ,

TO_CHAR(RENTAL_DATE, 'MM') ,

TO_CHAR(RENTAL_DATE, 'DD') ) ;

select

A.CUSTOMER_ID 

,row_number () over (order byCOUNT(A.RENTAL_ID) desc) as RENTAL_RANK ,COUNT(*) RENTAL_COUNT

,B.FIRATS_NAME

,B.LAST_NAME

from

RENTAL A ,

CUSTOMER B

where

A.CUSTOMER_ID = B.CUSTOMER_ID

group by

A.CUSTOMER_ID

order by

RENTAL_COUNT desc

limit 1 ;

작동안되는 이유 : group by를 쓰면 집계함수를 사용해야함

select

A.CUSTOMER_ID ,

row_number () over (order by COUNT(A.RENTAL_ID) desc) as RENTAL_RANK ,

COUNT(*) RENTAL_COUNT ,

max(B.first_name) first_name ,

max(B.LAST_NAME) last_name

from

RENTAL A ,

CUSTOMER B

where

A.CUSTOMER_ID = B.CUSTOMER_ID

group by

A.CUSTOMER_ID

order by

RENTAL_COUNT desc

limit 1 ;


Comments