반응형




안녕하세요~ 오늘은 DML로 돌아왔습니다~



DML이란,

(DATA MANIPULATION LANGUAGE)


데이터 조작언어는 데이터베이스 사용자 또는 응용 프로그램 소프트웨어가 컴퓨터 데이터베이스에 대해 데이터 검색, 등록, 삭제, 갱신을 위한 데이터베이스 언어 또는 데이터베이스 언어 요소입니다.


출처: WIKIPEDIA


< DML의 종류 >



SELECT: DATA 검색


INSERT: DATA 삽입


UPDATE: DATA 갱신


DELETE: DATA 삭제


MERGE


 

오늘은 이 중 MERGE에 대해 알아보겠습니다.



MERGE, 섞다출처 _ booleanstrings.com



merge문


insert, update, delete를 한번에 수행하는 명령어 입니다.


(잘 사용할 줄 안다면 굉장히 편리하고 유용한 방법입니다!)



<예제를 위한 테이블>


[ 고객 테이블 ]


고객이름

 나이

  주소 

 총구매액

 추천인

 A

 24

 서울

 30000

 null

 B

 29

 서울

 10000

 A

 C

 26

 파주

 25000

 A

 D

 27

 제주

 1000

 B



[ 등급 테이블 ]


고객등급 

 최소구매액

 최대구매액

 1

 0

 9999

 2

 10000

 19999

 3

 20000

 30000




예제1.

고객이름, 총구매액, 등급을 새로운 고객_등급 테이블로 저장하고 싶습니다.




STEP1. 우선 고객테이블에서 필요한 데이터를 선택하여 서브쿼리를 이용해 새로운 TABLE인 고객_등급 테이블을 생성합니다. (CREATE문은 DDL입니다.)


STEP2. 고객_등급 테이블에 등급 컬럼을 추가합니다. ( ALTER문은 DDL입니다)


STEP3. MERGE를 이용해 고객_등급 테이블의 등급 테이블에 DATA를 UPDATE할 수 있습니다.



< 고객_등급 테이블 결과 >


 고객이름

 총구매액

 등급

 A

 30000

 3

 B

 10000

 2

 C

 25000

 3

 D

 1000

 1





< 이때 UPDATE대신 MERGE를 쓰는 이유! >


만약 고객_등급 테이블에 고객DATA가 약 100만 건이라면?



UPDATE문의 경우 DATA를 하나씩 대조하며 등급 DATA를 업데이트합니다.


100만건의 데이터를 모두 대조해보겠죠?


0.01초에 하나씩 검사를 진행한다고 해도 과연 .. 




MERGE문의 경우 DATA를 한번에 DATA를 업데이트합니다.


따라서 훨씬 빠르게 결과를 얻을 수 있습니다.

(참고로 index를 가진 데이터는 더욱 빠르답니다~)






예제2.

고객테이블에서 총구매액에 변화가 생기면 고객_등급 테이블을 자동적으로 UPDATE가 될까요?






예제3.

(MERGE를 이용해)

고객테이블의 총구매액의 변화를 고객_등급 테이블의 총구매액에 반영하고 싶습니다.




(설명)


합치겠다.


고객_등급 테이블과 고객 테이블과


ON 조건절로


MATCH된다면


SET과 같이 UPDATE하겠다




참고) group함수를 사용하는 경우에는

using절에서 서브쿼리로 사용할 수 있다.



오늘은 여기까지!


DML은 아주 기본적이고도 중요합니다!


특히 빅데이터 분석가를 꿈꾸는 저와 많은 응용 프로그래머들에게는 더더욱! 많이 사용하는 부분이지 않을까 싶습니다!


SELECT 문을 모르신다면 여기로!

반응형
반응형


서브 쿼리 1탄 SINGLE / MULTIPLE ROW 서브쿼리 & EXISTS 를 먼저 보고 오시면 좋습니다.


오늘은 2탄 MULTIPLE COLUMN SUBQUERY를 다루도록 하겠습니다.




< 서브쿼리의 종류 >


   

     1. Single row subquery


     2. Multiple row subquery


     3. Multiple column subquery


     4. Exists

 




MULTIPLE COLUMN SUBQUERY


서브쿼리에 쓰여지는 컬럼의 갯수가 2개 이상인 경우에 사용합니다.


[ 오라클에서 지원하는 Multiple Column Subquery 의 종류 ]


    

     1. NUM PAIR WISE 방식


     2. PAIR WISE 방식




<예제를 위해 사용할 테이블>


[ 고객 테이블 ]


고객이름

 나이

  주소

 총구매액

 추천인

 A

 24

 서울

 30000

 null

 B

 29

 파주

 10000

 A

 C

 26

 파주

 25000

 A

 D

 24

 제주

 1000

 B




예제1. A와 나이도 같고 주소도 같은 고객의 이름, 나이, 주소, 총구매액을 알고싶어요



 

      --> num pair wise


         SQL> SELECT 고객이름, 나이, 주소, 총구매액

                        FROM 고객

                        WHERE 나이 IN (SELECT 나이 FROM 고객

                                                         WHERE 고객이름 = 'A')

                              AND   주소 IN (SELECT 주소 FROM 고객

                                                            WHERE 고객이름 = 'A');


      --> pair wise


         SQL> SELECT 고객이름, 나이, 주소, 총구매액

                        FROM 고객

                        WHERE (나이, 주소) IN (SELECT 나이, 주소 FROM 고객

                                                                        WHERE 고객이름 = 'A')




[ NUM PAIR WISE 결과 ]


고객이름 

 나이

 주소

 총구매액

 A

 24

 서울

 30000

 B

 29

 파주

 10000

 C

 26

 파주

 25000

 D

 24

 제주

 1000



[ PAIR WISE 결과 ]


고객이름 

 나이

 주소

 총구매액

 A

 24

 서울

 30000

 B

 29

 파주

 10000



num pair wise 방식의 경우


나이가 24, 29 중 하나인 사람 중 주소가 서울, 파주 중 하나인 사람을 출력합니다.



pair wise 방식의 경우


나이가 24살이면서 서울에 사는 사람이거나 나이가 29이면서 파주에 사는 사람을 출력합니다.



* 참고로 MSSQL은 PAIR WISE방식을 지원하지 않습니다.

(ONLY num pair wise방식만 지원)



오늘은 여기까지!


모두 수고하셨습니다.


다음주에는 DML로 돌아올겠습니다~

반응형
반응형



안녕하세요!


오늘은 위의 사진과 같이 쿼리 안의 쿼리, 서브쿼리에 대해 알아보겠습니다



서브쿼리란?


간단히 말해 쿼리안에 쿼리가 존재하는 것으로


하나의 SQL문 안에 SELECT문이 중첩되는 것을 의미합니다.


< 서브쿼리의 구조 >



< 서브쿼리의 종류 >


   

     1. Single row subquery


     2. Multiple row subquery


     3. Multiple column subquery


     4. Exists

 




Single row subquery 와 Multiple row subquery 비교하기!


우선! 두 서브쿼리문은 다른 연산자를 이용합니다


 

     ① Single row subquery 연산자


               =, <>, !=, >, <, >=, <=


     ② Multiple row subquery 연산자


               in, not in, >all, <all, >any, <any




<예제를 위해 사용할 테이블>


[ 고객 테이블 ]


고객이름

 나이

  주소

 총구매액

 추천인

 A

 24

 서울

 30000

 null

 B

 29

 서울

 10000

 A

 C

 26

 파주

 25000

 A

 D

 27

 제주

 1000

 B



[ 부서 테이블 ]


주소 

 관할부서

 서울

 한국 A

 일산

 한국 B

 파주

 한국 C

 제주

 한국 D




예제1. 한국 A에서 담당하는 있는 주소에 사는 고객의 이름과 총구매액과 주소를 알고싶어요!





[ 결과 ]


 고객이름

총구매액 

주소 

 A

 30000

 서울

 B

 10000

 서울



TIP! 서브쿼리부분을 먼저 작성합니다.


1. 한국 A에서 담당하는 주소를 선택하고


2. 그 주소 data와 같은 값을 갖는 고객이름, 총구매액, 주소를 찾습니다.  



예제2. 추천인이 아닌 사람들의 이름과 나이를 알고 싶습니다.





[ 결과 ]


고객이름 

 나이

 A

 24

 B

 29



주의!


서브쿼리에서 NOT IN을 사용할 때 서브쿼리의 NULL처리를 해주어야 합니다.


NOT IN != ALL 과 같은 의미입니다.



논리 연산자 AND의 속성에 따라


TRUE AND NULL의 값은 NULL로 인식합니다.


따라서

비교하고 싶은 서브쿼리의 결과값에 NULL이 존재한다면

전부 NULL로 바꾸어 인식하게 됩니다.



예제1과 예제2의 차이점을 눈치 채셨나요?


서브쿼리와 비교하는 메인절에서 등호(=)를 사용하거나 IN을 사용했습니다.


그 이유는

서브쿼리의 결과 갯수가 다르기 때문입니다.


(참고)

비교하고자 하는 값이 1개일때 등호(=),

비교하고자 하는 값이 2개 이상일 때 IN을 비교연산자로 사용합니다.



예제3. 추천한 사람이 있는 고객을 알고싶습니다.


 

      SQL> SELECT c.고객이름

                        FROM 고객 c

                        WHERE EXISTS ( SELECT 'x' FROM 고객 r

                                                        WHERE c.추천인 = r.고객이름)



결과는 추천인 column에 null값을 가진 A고객을 제외한

B, C, D고객이 모두 출력됩니다!


(참고)

'x'자리에는 어떠한 문자를 넣어도 관계없습니다.



분량조절 실패로..


다음 포스팅에서 2탄 서브쿼리 Multi Column Subquery편으로 다루도록 하겠습니다!

반응형
반응형



안녕하세요~


오늘은 두 집합을 연결하는 또 다른 연산자 UNION에 대해 알아보겠습니다!


UNION은 위의 사진처럼 TABLES의 행(ROW)을 위 아래로 결합하는 것입니다.


더 자세히 알아볼까요?


집합 연산자란?


두 집합 사이의 합집합 , 교집합, 차집합을 출력하는 연산자 입니다.




그렇다면 JOIN과는 어떠한 차이점이 있을까요?



JOIN            VS           UNION



JOIN절은 위와같이 옆으로! COLUMN이 추가되며 합쳐지는 형태를 갖습니다.


반면에


UNION절은 위 - 아래로 하나의 COLUMN에 ROW가 추가되는 형태를 갖습니다.


(조인을 더 알고 싶다면 여기로)



먼저, UNION 절의 종류에 대해 알아봅시다!




      - UNION ALL: 두 집합의 합집합을 출력하는 연산자

  

      - UNION: 두 집합의 합집합을 출력하는 연산자.

                    (단 중복을 제거하여 반환)


      - INTEREST: 교집합을 출력하는 연산자

                       ( 양쪽 쿼리에 공통되는 행을 반환 )


      - MINUS: 두 집합 사이의 차집합을 출력하는 연산자로

                     첫번째 쿼리에 의해 선택되지만

                     두번째 쿼리 결과 집합에는 없는 모든 행을 반환



* 참고: 위에서 의미하는 집합이란 결과 데이터를 의미합니다.




예제를 통해 UNION절의 사용방법에 대해 알아보겠습니다.


[ 고객A 테이블 ]


고객이름

 나이

  주소 

 총구매액

 추천인

 A

 24

 서울

 30000

 null

 B

 29

 서울

 10000

 A

 C

 26

 파주

 25000

 A

 D

 27

 제주

 1000

 B




예제1. UNION ALL 과 UNION의 차이를 확인해보죠!



    

    SQL1> SELECT 고객이름

                         FROM 고객

              UNION ALL

              SELECT 고객이름

                         FROM 고객; 

 

    SQL2> SELECT 고객이름

                         FROM 고객

              UNION

              SELECT 고객이름

                         FROM 고객; 





SQL1 UNION ALL 결과

 고객이름

 A

 B

 C

 D

 A

 B

 C

 D



SQL2 UNION 결과


 고객이름

 A

 B

 C

 D



참고:


INTEREST 와 MINUS 연산자의 경우

위의 UNION ALL/ UNION 자리에 입력하여 결과를 확인하면

쉽게 이해하실 수 있을 것 같아서 PASS!



집합연산자 사용시 주의사항


1. 집합 연산자 위-아래의 쿼리문의 컬럼의 갯수와 데이터 타입이 동일해야한다.


2. ORDER BY절은 맨 아래 쿼리에만 사용할 수 있으며

ORDER BY절을 사용하려면 쿼리문들의 컬럼명과 데이터 타입이 모두 동일해야합니다!

( 특히 SELECT 문에서 NULL값을 두개 이상 사용할 경우!

ALIAS로 COLUMN명을 동일하게 만들어준다!! )





두번째! UNION 절과 함께 알아두면 좋은~

레포팅 함수에 대해 알려드릴께요!



<레포팅함수 종류>


 

       - ROLLUP


       - CUBE


       - GROUPING SETS


       - GROUPING (여기서 다루지 않음)

                        : (리얼) Null ( --> 0)

                           grouping되는 결과를 보기위해

                          어쩔수 없이 null 출력되는 데이터( --> 1 )를

                   구분해 주기 위해서 사용하는 함수





예제2: 주소, 나이, 주소별 & 나이별 고객의 총 구매액을 구하고

마지막에 전체 고객의 총 구매액을 추가해주세요



        

     -- UNION 절


      SQL3> SELECT 주소, 나이, SUM(총구매액)

                            FROM 고객

                            GROUP BY 주소, 나이

                UNION

                SELECT NULL  주소, NULL 나이, SUM(총구매액)

                            FROM 고객

                ORDER BY 주소 ASC;


     -- ROLLUP절

 

     SQL4> SELECT 주소, 나이, SUM(총구매액)

                           FROM 고객

                           GROUP BY ROLLUP ( (주소, 나이) );




SQL3 & SQL4의 결과


주소

 나이

 SUM(총구매액)

 서울

 24

 30000

 서울

 29

 10000

 제주

 27

 1000

 파주

 26

 25000

 null

 null

 30000+10000+1000+25000



위와 같이 두개의 SQL문이 실행되야하는 UNION절

하나의 SQL문이 실행되는 ROLLUP으로 대신 사용하면

속도가 보다 빨라지기 때문에 성능이 더 좋다고 할 수 있겠죠?



위의 SQL2문에서 ROLLUP함수에 ( ( ) ) 두 개의 괄호가 있는 것을 눈치 채셨나요?


만약 괄호를 ( ) 한 개만 사용한다면 어떻게 될까요?



     -- ROLLUP절

 

     SQL5> SELECT 주소, 나이, SUM(총구매액)

                         FROM 고객

                         GROUP BY ROLLUP ( 주소, 나이 );



SQL5 결과


주소 

 나이

 SUM(총구매액)

 서울

 24

 30000

 서울

 29

 10000

 서울                  

 null                    

 30000 + 10000                

 제주

 27

 1000

 제주                  

 null                    

 1000                             

 파주

 26

 25000

 파주                  

 null                    

 25000                           

 null

 null

 30000+10000+1000+25000



위의 색칠되어있는 부분이 추가된 것을 볼 수 있습니다.


이것은 ROLLUP의 특징인데요



'SQL5의 실행 순서'를 보면


1. (주소, 나이)로 그룹핑하여 총합을 구한다


2. (주소)로 그룹핑하여 총합을 구한다


3. (체) 총합을 구한다



위의 SQL4, SQL5결과를 각각 GROUP SETS로 실행시켜봅시다!


 

       -- SQL4를 GROUP SETS로       


      SQL6> SELECT 주소, 나이, SUM(총구매액)

                          FROM 고객

                          GROUP BY GROUP SETS ( (주소, 나이),

                                                                        ( ) );

 

        -- SQL5를 GROUP SETS로      

       

      SQL7> SELECT 주소, 나이, SUM(총구매액)

                         FROM 고객

                         GROUP BY GROUP SETS ( (주소, 나이),

                                                                    (주소),

                                                                      ( ) );




따라서


GROUP SETS는 ROLLUP보다 GROUPING된 결과를 더 잘 예상할 수 있어 작성하기도 편하답니다! 



참고:


 CUBE는 간단히 ROLLUP의 반대라고 생각하면 됩니다!


예제2와 달리 총구매액이 맨 위로 출력됩니다!





오늘은 여기까지!


내일은 서브쿼리로 돌아올겠습니다~



(오늘이 금요일이 아니라니..)

반응형

+ Recent posts