반응형


안녕하세요


오늘은 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을 간단히 다뤄보았습니다!


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


반응형
반응형



Data는 중요하죠!


또한 우리가 data를 이용하기 위해서는


그것을 저장해두고 사용해야 합니다!

 


이러한 Data를 저장하고 관리하는 Database(DB) 시스템에는 다양한 종류가 있습니다.



테이블형식으로 data를 저장하는 관계형 데이터베이스 SQL DB과



SNS 데이터량 증가 등의 이유로 다양한 형태의 data를 저장하기 용이한


비관계형 데이터베이스 NoSQL ('Not Only SQL') 이 있습니다.



Oracle DB의 경우 관계형 DB에 속하며


오픈소스인 Mysql과 달리


많은 기업체에서는 구매하여 사용하는 DB중 하나입니다.



빅데이터 분석가는 Data를 다루는 사람으로서,


Database는 절대 피할 수 없는, 그리고 꼭 필요한 기술이라고 할 수 있습니다.





(흔히 database를 이렇게 표현하더라구여.. 이유는 모르겠음 알고 계신 분은 댓글로 공유해 주세요! )





오늘은 기본 연산자 이외에 존재하는 기타 연산자 중 LIKE연산자에 대해 알아보도록 하겠습니다.



[연산자]


1. 산술 연산자: * (곱하기), / (나누기), + (더하기), - (빼기)


2. 비교 연산자:  >, <, >=, <=, <>, !=, ^=


참고)  <>, !=, ^= 는 각각 같지 않음을 나타낸다.


3. 논리 연산자: and, or, not



[기타 연산자]


1. BETWEEN ... AND 연산자


 2. LIKE 연산자


 3. IN 연산자


 4. IS 연산자




데이터 검색 조건을 기술하는 WHERE절에서


LIKE연산자를 사용하여


지정한 패턴과 일치하는 값을 필드에서 찾을 수 있습니다.

(출처: Microsoft)




우선 우리가 갖고 있는 DB시스템은 직원관리 시스템으로


여기서 사용할 TABLE은 직원 테이블 입니다. (이하 emp라고 부르겠음)



emp TABLE에 들어 있는 컬럼(Columns)은 각각 아래와 같습니다.


EMPNO                사원번호

ENAME                사원이름

JOB                직업

MGR                관리자의 사원번호

HIREDATE        입사일

SAL                월급

COMM                커미션

DEPTNO        부서번호 




여기서 첫 번째 문제!


이름의 첫번째 철자가 S로 시작하는 사원들의 이름을 출력하고 싶다면?





위처럼 작성하면 됩니다. 쉽죠? 



이해가 안된다면 이 아래를 참고하세요






LIKE문


[ WHERE 기준 컬럼명 LIKE 패턴지정 ]



여기서 잠깐! (뚜둔!)



LIKE 연산자를 사용할 때 사용하는 키워드 2개가 있습니다.


1. %


특수문자 %는 여기서 wild card라는 SQL 키워드 입니다


와일드 카드


"이 자리에 무엇이 와도 관계없다!" 그리고 "철자의 갯수가 몇 개가 되어도 관계없다!" 라는 의미를 갖고 있습니다.



단, LIKE 연산자와 함께 쓸 때만 가능하며


평소에는 Percent를 의미하는 % 그대로 인식합니다.



2. _ (under bar)


흔히 언더바라고 불리는 이 키워드는


"이 자리에 무엇이 와도 관계없다!" 그리고 "자릿수는 한 자리여야 한다!"라는 의미를 갖고 있죠.




따라서 첫번째 문제의 답



SQL> SELECT ename

FROM emp

WHERE ename LIKE 'S%';



을 다시 풀어보면,




" 이름의 첫 번째 철자가 S로 시작하는

  (그 이후의 철자 갯수가 몇 개가 되어도 관심없다!)


  사원들의 이름을 출력하라! "



는 의미입니다.






여기서 두번째 문제!



이름의 두번째 철자가 %인 사원의 이름을 출력하고 싶다면?





라고 작성하면 됩니다. 



" 잘 모르겠다! " 라고 하셔도 됩니다! 저도 몰랐으니까요! (당당)




여기서 모르는 가장 큰 이유는!


바로!


ESCAPE를 알지 못했기 때문일테지요~




위 SQL코드의 ESCAPE문은


" m 바로 다음에 나오는 % 는 와일드카드가 아니라 퍼센트를 나타내는 특수문자 '%' 이다. "


라는 의미입니다.



참고) m의 자리에는 어떤 문자가 와도 상관이 없습니다.


단 그경우에는, ESCAPE문 다음에 나올 문자와는 같아야겠죠?




오늘은 여기까지 입니다!... 만!



추가 문제 하나 더 풀어보죠!



이름의 두번째 철자와 세번째 철자가 %인 사원의 이름을 출력하세요!



정답은 각자 풀어보고 댓글로 남겨주세요 ~!


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




반응형

+ Recent posts