테이블 설계
컬럼 결정
타입 정하기
관계 정의
폭포수 모델 : back 할 수 없다
애자일 모델 : 자유롭게 back 할 수 있다.
ER-WIN (ERD(Entity Realation Diagram)) : ERD를 보며 조인 해야한다!
관계 형태(1:1, 1:n, n:n)
PK와 FK를 통해서 상속관계 증명 : 관계가 있다. 주는 쪽과 받는 쪽이 결정된다.
개체, Entity, 속성(Attribute)
테이블, 컬럼 형성 - 타입이 결정된다
- DML
SELECT
FROM
WHERE
GROUP BY
[[HAVING]]
ORDER BY
SELECT 컬럼명1, 컬럼명2,.... 함수명(컬럼명3)
FROM 집합1, 집합2, (SELECT 문 - 인라인뷰)
WHERE 컬럼명1 = 값(상수만 아니다. select문 - 서브쿼리) : 조건검색, 조인하는 곳
AND 컬럼명2 = 값(SELECT 문) : AND는 교집합 - 원소가 줄어듦. 경우의 수 감소. 일량 감소 -> 속도 빠름
OR 컬럼명3 = 값(IN) : OR는 합집합 - 경우의 수가 계속 증가. 일량 증가(가능하면 사용하지 말 것)
GROUP BY 컬럼명1, 컬럼명2(단, 그룹함수 아님. GROUP BY 절에 업는 컬럼을 썼을 때)
[[HAVING]]
ORDER BY
--에러: 단일 그룹의 그룹 함수가 아닙니다
SELECT ename, sum(sal)
FROM emp;
--원하는 값 출력되지 않음
SELECT max(ename), sum(sal)
FROM emp
GROUP BY ename;
--GROUP BY절에 여러 개의 조건이 올 수 있다 : 업무에 대한 복잡도 높을수록 조건 증가
SELECT deptno, JOB
FROM emp
GROUP BY deptno, JOB
ORDER BY deptno;
--sum(decode(...)) 패턴 : 소계, 총계, 계...
SELECT decode(JOB, 'CLERK', sal, NULL)
FROM emp;
SELECT sum(decode(JOB, 'CLERK', sal, NULL))
FROM emp;
n:n
은 업무에 대한 정의가 덜 된 경우이므로 조인
을 하면 카타시안 곱
이 된다.:=
같다로 비교하는 것 이외의 모든 것
2개 이상의 테이블 조인 시 A 테이블의 행에 대해 B 테이블에 일치하는 행이 없더라도 B 테이블의 행을 NULL로 하여 행을 리턴한다.
<self join 과정>
1. 모든 경우의 수를 만든다(FROM tdept A, tdept b와 같이 카타시안 곱을 만듦).
2. 카타시안 곱으로 모든 값이 출력된 상태에서 WHERE절로 조건검색을 한다(WHERE A.parent_dept = b.dept_code;).
tdept테이블에 자신의 상위 부서 정보를 관리하고 있다.
이 테이블을 이용하여 부서코드, 부서명, 상위부서코드, 상위부서명을 읽어오는
쿼리를 만들어 보자.
<생각하는 과정>
1. 테이블 하나로는 원하는 값을 출력할 수 없다.
--테이블 하나로는 원하는 값을 출력할 수 없다
SELECT dept_name, parent_dept
FROM tdept;
SELECT dept_name AS "부서명"
, dept_name AS "상위부서명"
FROM tdept;
SELECT A.dept_name AS "부서명"
, b.dept_name AS "상위부서명"
FROM tdept A, tdept b;
WHERE절의 의미는 a테이블 parent_dept 컬럼이 b테이블 dept_code 컬럼과 동일한 것만 조인한다는 것이다.
따라서 a.parent_dept의 aa0001 X3, b.dept_code의 aa0001이 동일하기 때문에 얘네끼리 조인을 하게 된다.
이때 a.parent_dept의 aa0001은 3개라서 dept_name을 경영지원, 재무, 총무를 다 갖게 된다.
b.dept_code의 aa0001은 1개라서 dept_name을 경영지원만 갖게 된다.
출력
<답>
--둘의 관계형태가 1:n이니 정의를 잘해서 사용해야 한다
SELECT A.dept_code AS "부서코드"
, A.dept_name AS "부서명"
, b.parent_dept AS "상위부서코드"
, b.dept_name AS "상위부서명"
FROM tdept A, tdept b
WHERE A.parent_dept = b.dept_code;
http://www.gurubee.net/lecture/1039
<함수와 프로시저가 같은 것인가?>
CREATE OR REPLACE PROCEDURE proc_gugudan(dan IN number)
IS
n_i number(2);
BEGIN
n_i :=0;
dbms_output.put_line(dan||'단을 출력합니다.');
FOR n_i IN 1..9 LOOP
dbms_output.put_line(dan||'*'||n_i||'='||(dan*n_i));
END LOOP;
END;
🔽출력
exec proc_gugudan(3);
SELECT *
FROM (
SELECT ROWNUM rno, workcd_vc, time_nu FROM t_worktime
WHERE ROWNUM < 4
)A,
(
SELECT ROWNUM rno, workcd_vc, time_nu FROM t_worktime
WHERE ROWNUM < 4
)b;