반응형


안녕하세요


오늘은 SQL 마지막 포스팅으로


SQL에 특화된 프로그래밍 언어인

PL/SQL에 대해 알아보도록 하겠습니다!



PL/SQL이란?


SQL을 확장한 절차적 언어로

관계형 데이터베이스에서 사용되는 Oracle의 표준 데이터 엑세스 언어입니다.


그렇다면 PL/SQL을 왜 배워야 할까요?


우선 큰 규모의 화사는 데이터를 대부분 오라클에 저장합니다.


하지만

SQL만으로 데이터를 분석하고 처리하려면 많은 노력이 수반됩니다.



PL/SQL을 사용하면 아래와 같은 장점이 있습니다.



 1. PL/SQL을 이용하면 SQL로 반복해서 해야하는 작업을

보다 단순하게 처리할 수 있습니다.


2. R로 데이터 분석을 하기위해 엑셀 등으로

DB의 데이터를 내려받아 분석하는 것이 아니라,

바로 DB에서 PL/SQL을 이용해서 분석할 수 있습니다.


3. SQL 튜닝 방법 중 하나로 PL/SQL을 사용할 수 있습니다.





PLSQL 기본구조


 

     declare

                선언문 (변수, 예외, 커서 등을 선언한다.)

     

     begin

                실행절 (SQL 문, IF 문, LOOP 문 등을 실행한다.)


     end;

/





예제를 통해 활용해보도록 합시다!


[예제를 위한 테이블]


[ emp ] : 사원테이블


사원명

사원번호

직업

연봉 

부서

 A

1001

 MANAGER

 3000

 파주

 B

1002

 SALESMAN

 1600

 제주

 C

1005

 PRESIDENT

 5000

 서울

 D

1024

 SALESMAN

 1400

 파주

 E

2024

 ANALYST

 3000

 서울 

 F

2215

 SALESMAN

 1350

 서울

 G

2015

 MANAGER

 2900

 일산

 H

1240

 ANALYST

 3000

 파주

 I

3415

 SALESMAN

 1700

 서울




예제1. 사원번호를 입력하면 해당 사원의 월급에 대한 순위가 출력되게 하시오

(단, 없는 사원번호를 입력하였을 때 예외처리를 하시오)



설명)


1. set serveroutput on 을 사용하여 데이터를 출력하는 dbms_output.put_line함수를 이용할 수 있다.


2. accept는 데이터를 입력받기 위한 것으로

&치환변수를 이용하여 값을 입력받는다.


3. exception이란 예외처리하는 것으로

no_data_found란 데이터가 없을 때 발생하는 오류로

오라클에서 지정해 놓은 예외처리 방법 중 하나이다.




예제2. 직업을 입력하면 해당 직업의 토탈월급이 출력되는 함수를 생성하고 실행하시오.



설명)


1. create를 이용하여 함수를 생성한다.


2. 가로의 값은 입력받을 파라미터를 지정하는 것이다.


3. return 값이 꼭 존재해야하며,

여기서는 v_sumsal의 타입인 number로 지정한다.



사용방법)


SQL> SELECT 사원명, 직업, job_sal_sum('SALESMAN') FROM emp;




예제3. 직업, 부서별 토탈월급을 출력하시오

(PL/SQL 프로시져를 이용하세요)



우선 SQL을 이용하면 아래와 같습니다.



SQL> SELECT  직업, sum( decode(부서, '서울', 연봉, 0) ) "서울",

sum( decode(부서, '파주', 연봉, 0) ) "파주",

sum( decode(부서, '일산', 연봉, 0) ) "일산"

FROM emp

GROUP BY 직업;




[결과]


 직업

 서울

 파주

 일산

 MANAGER

 

 3000

 2900

 SALESMAN

 3050

 1400

 

 PRESIDENT

 5000

 

 

 ANALYST

 3000

 3000

 




사용방법)


SQL1> variable v_result1 refcursor;


SQL2> exec job_dept(:v_result1);


SQL3> print v_result3;



설명)


프로시져란 PLSQL 코드를 database에 저장하기 위한 것으로

함수와 달리 return절이 없으며 결과를 반드시 출력하지 않아도 됩니다.


1. 연결 연산자와 함수를 이용하여 SQL문을 완성합니다.


2. 만약 부서가 위의 테이블보다 훨씬 많이 존재한다고 가정한다면,


for loop문을 이용하여 만든 PLSQL문이 보다 효율적이며,

부서가 추가되었을 때에도 코드를 수정하지 않아도 된다는 장점이 있습니다.





PL/SQL을 간단히 다뤄보았습니다!


더 궁금한 점이 있다면 댓글로 남겨주세요~


반응형
반응형




안녕하세요~ 오늘은 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 문을 모르신다면 여기로!

반응형
반응형


오늘은~ JOIN절 2탄!


1탄은 ORACLE | JOIN을 사용하는 오라클만의 방법! 에 있습니다~



JOIN은 기본적으로 위의 퍼즐같이 두개 이상의 테이블의 컬럼을 합쳐서

하나의 테이블처럼 사용하는 방법입니다.


그럼~ 차근차근 따라가 볼까요?



오라클 조인 문법과 1999 ANSI 조인 문법을 모두 이용하여 문제를 풀어보겠습니다.



[ 고객 테이블 ]


고객이름

 나이

  주소 

 총구매액

 추천인

 A

 24

 서울

 30000

 null

 B

 29

 서울

 10000

 A

 C

 26

 파주

 25000

 A

 D

 27

 제주

 1000

 B



[ 주소 테이블 ]


주소 

 관할부서

 서울

 한국 A

 일산

 한국 B

 파주

 한국 C

 제주

 한국 D



[ 등급 테이블 ]


고객등급 

 최소구매액

 최대구매액

 1

 0

 9999

 2

 10000

 19999

 3

 20000

 30000




문제1. 고객 이름, 관할부서, 고객등급을 출력하시오





결과


 고객이름

 관할부서

 고객등급

 A

 한국 A

 3

 B

 한국 A

 2

 C

 한국 C

 3

 D

 한국 D

 1




중요!


TABLE이 3개일 경우 연결고리는 2 ( = 3 - 1) 개 입니다.



오라클 조인 문법에서 JOIN절의 WHERE절은 '조인 조건'으로 사용됩니다.



여기서 주의해야할 점은 1999 ANSI문법의 경우 양쪽에 연결고리가 있는 테이블명을 먼저 작성해야합니다.


또한, 1999 ANSI문법의 경우 오라클 문법과 달리 WHERE절은 그저 '검색 조건' 입니다.


따라서 JOIN절에서 조인 조건을 주기 위해서는 ON절을 사용하여 '조인 조건'을 줄 수 있습니다.




오라클 Database에서는 어떠한 문법을 사용하여도 문제가 없습니다.


하지만,


1999 ANSI 문법의 경우 '조인 조건' ON과 '검색 조건' WHERE이 별개로 구분되어 있기 때문에

보다 가독성이 좋다고 하네요~




추가) using절을 사용한 조인과 natural join



위의 정답 문법을 각각 using 절과 natural join으로 바꾼 SQL문을 먼저 확인하시죠.



 

       SQL> SELECT c.고객이름, a.관할부서, g.고객등급

FROM 고객 c JOIN 주소 a

USING ( 주소 )  

JOIN 등급 g

ON ( c.총구매액 BETWEEN 최소구매액 AND 최대구매액 );





 

       SQL> SELECT c.고객이름, a.관할부서, g.고객등급

FROM 고객 c NATURAL JOIN 주소 a

 JOIN 등급 g

ON ( c.총구매액 BETWEEN 최소구매액 AND 최대구매액 );





먼저 using절에서 주의사항이 있습니다.


 using절에서는 테이블 별칭 즉, c.주소 or a.주소를 사용하지 않습니다.



natural join의 경우 오라클이 알아서 고객 table과 주소 table의 공통의 컬럼(column)을 찾아서 조인을 합니다!


natural join에서 주의할 점은

공통 컬럼이 없는 경우 or data type이 다른 경우 오류가 발생한다는 것입니다.


(참고: data type을 모른다면 여기!)




오늘은 여기까지


내일은 집합 연산자 union으로 돌아올겠습니다!



이 글이 도움되셨다면 아래 공감 꾹~ 



반응형

+ Recent posts