DB

2023.02.14

연을 2023. 2. 14. 17:30
728x90

ansi 조인

기존 문법 ansi 문법
select a.컬럼, b.컬럼
from 테이블 a, 테이블 b
where a.컬럼 = b.컬럼
select a.컬럼, b.컬럼
from 테이블 a inner join 테이블 b on (a.컬럼 = b.컬럼)
where ...
select a.A1, b.B1
from a,b
where a.A1 = b.B1(+)
select a.A1, b.B1
from a left outer join b on a.A1=b.B1
from a right outer join b on a.A1=b.B1
from a full outer join b on a.A1=b.B1
예시
select 직원.이름, 부서.부서명
from 직원, 부서
where 직원.부서코드 = 부서.부서코드(+)
select 직원.이름, 부서.부서명
from 직원 left outer join부서
on 직원.부서코드 = 부서.부서코드
select 직원.이름, 부서.부서명
from 직원, 부서
where 직원.부서코드(+) = 부서.부서코드
select 직원.이름, 부서.부서명
from 직원 right outer join부서
on 직원.부서코드 = 부서.부서코드
select 직원.이름, 부서.부서명
from 직원, 부서
where 직원.부서코드(+) = 부서.부서코드(+)
select 직원.이름, 부서.부서명
from 직원 full outer join부서
on 직원.부서코드 = 부서.부서코드

=======================================

PL/SQL
코드블록(code block)
- 익명블록(unnamed block)
- 함수/프로시저(function/procedure)
declare
     변수선언
begin
     실행문(s)
end;
dbms_output.put_line();
=
system.out.println();
=
document.write();
console.log()
언어 C/C++/Java/JS Pascal/COBOL
배정연산자 = :=
비교연산자 == =
변수타입선언
변수명 테이블명.컬럼명%type:='Jefferson';
  • SQL의 결과물이 하나일때 - into구문 사용
  • SQL의 결과물이 여럿일때 - cursor 사용

<코드>

declare = 선언 / 선언할 변수 없다면 declare를 쓰지 않으면 된다.

declare
i number;
begin
i:=100;
dbms_output.put_line(i);
end;
/

<결과>

보기 => dbms출력 => +표시 눌러서 db랑 연결

 <코드>

declare
    a integer := 2**2*3**2;
begin
    dbms_output.put_line('a='||to_char(a));
end;
/

<결과>

<코드>

declare
    vs_emp_name varchar2(80); --employees.emp_name%type;
    vs_dep_name varchar2(80); -- departments.department_name%type;
begin
    select a.emp_name, b.department_name
    into vs_emp_name, vs_dep_name --값 1개만 저장가능
    from employees a, departments b
    where a.department_id = b.department_id and a.employee_id =100;
    dbms_output.put_line(vs_emp_name||' - '||vs_dep_name);
end;
/

<결과>

=====================================

if문
if 조건식1 then
     실행문(s);
else if 조건식2 then
     실행문(s);
else
     실행문(s);
end if;

<코드>

declare
    vn_mid employees.manager_id%type;
    vs_self employees.emp_name%type;
    vs_name employees.emp_name%type;
begin
    select emp_name,manager_id into vs_self,vn_mid from employees where employee_id = 100;
    if vn_mid is null then
        dbms_output.put_line('직원명='||vs_self||',매니저가 없습니다.');
    else
        select emp_name into vs_name from employees where employee_id = vn_mid;
        if vs_name is null then
            dbms_output.put_line('직원명='||vs_self||',매니저이름을 찾을 수 없습니다.');
        else
            dbms_output.put_line('직원명='||vs_self||',매니저='||vs_name);
    end if;
end if;
end;

<결과>

<코드>

월급이 가장 낮은 사람의 사번,이름,매니저이름 찾는 pl/sql 작성

declare
    vn_eid employees.employee_id%type; --사번
    vs_name employees.emp_name%type;   --이름
    vs_mname employees.emp_name%type;  --매니저이름
    vn_mid employees.manager_id%type;  --매니저아이디
begin
    select employee_id, emp_name, manager_id into vn_eid,vs_name,vn_mid from employees 
    where salary = (select min(salary) from employees);
    if vs_name is null then
        dbms_output.put_line('찾을 수 없습니다.');
    else
        select emp_name into vs_mname from employees where employee_id = vn_mid;
        if vs_mname is null then
            dbms_output.put_line('사번 : '||vn_eid||', 이름 : '||vs_name||', 매니저를 찾을 수 없습니다. ');
        else
            dbms_output.put_line('사번 : '||vn_eid||', 이름 : '||vs_name||', 매니저 : '||vs_mname);
        end if;
    end if;
end;
/
declare
    eid employees.employee_id%type;
    ename employees.emp_name%type;
    mname employees.emp_name%type;
    payment employees.salary%type;
begin
    select a.employee_id,a.emp_name,a.salary,b.emp_name
    into eid,ename,payment,mname
    from employees a, employees b
    where a.salary = (select min(salary) from employees)
    and a.manager_id=b.employee_id;
    dbms_output.put_line('사번='||eid||',이름='||ename||', 월급='||payment||',매니저='||mname);
end;
/

<결과>

=======================================

case문
case 변수/표현식/컬럼명
when 값1 then 실행문1
when 값2 then 실행문2
else 실행문3
end
case
when 조건식1 then 실행문1
when 조건식2 then 실행문2
else 실행문3
end

========================================

loop
loop
     실행문(s)
     exit when 조건식
end loop;
while 조건문
loop
      실행문(s);
end loop;

<코드>

declare
    i number := 0;
begin
    loop
        dbms_output.put_line('i='||i);
        i:=i+1;
        exit when i>10;
    end loop;
    dbms_output.put_line('Program terminated');
end;
/

<결과>

<코드>

구구단

declare
     i number := 1;
     j number := 1;
begin
    loop
        i:=i+1;
        j:=1;
        loop
            dbms_output.put_line(i||'x'||j||'='||i*j);
            j:=j+1;
            if j>9 then
            dbms_output.new_line;
            exit;
            end if;
        end loop;
        exit when i>=9;
    end loop;
end;
/

<결과>

이렇게 9단까지 나온다.

==================================

for문
for 변수 in 시작값..마지막값
loop
     실행문;
end loop;

<코드>

declare
    i number :=2;
    j number :=1;
begin
    for i in 2..9
    loop
        for j in 1..9
        loop
            dbms_output.put_line(i||'x'||j||'='||i*j);
        end loop;
        dbms_output.new_line;
    end loop;
end;
/

<결과>

이렇게 9단까지 나온다.

======================

continue

<코드>

소수구하기

declare
    i number :=2;
    j number :=2;
begin
    for i in 2..1000
    loop
        for j in 2..i
        loop
            if mod(i,j)=0 then exit;
            end if;
        end loop;
        if i=j then dbms_output.put_line(i);
        end if;
    end loop;
end;
/

정확한 답이 아니니 내일..한다...

728x90