-- 테이블
--DROP TABLE employee; --테이블 잘못 생성시 이걸로 삭제하세요 !
--테이블 생성
CREATE TABLE employee( /*테이블 소괄호 */
empno NUMBER(6), name VARCHAR2(20) NOT NULL, salary NUMBER(8,2)/*소숫점 2짜리 까지 명시*/, hire_date DATE DEFAULT SYSDATE,
CONSTRAINT employee_pk_empno PRIMARY KEY(empno)
) ;
--기본키와 외래키를 적용해서 테이블 생성
CREATE TABLE suser(
id VARCHAR2(20) ,
name VARCHAR2(20),
CONSTRAINT suser_pk_id PRIMARY KEY (id)
);
--아이디를 참조하는 테이블
CREATE TABLE sboard(
num NUMBER,
id VARCHAR2(20) NOT NULL ,
content VARCHAR2(4000) NOT NULL,
CONSTRAINT sboard_pk_num PRIMARY KEY(num),
CONSTRAINT sboard_suser_fk1 FOREIGN KEY(id) REFERENCES suser(id)
);
--테이블 관리
--add 연산자 : 테이블에 새로운 컬럼을 추가
ALTER TABLE employee ADD(addr VARCHAR2(50)); --addr VARCHAR2(50)의 컬럼을 생성
-- 제약조건추가
ALTER TABLE employee ADD CONSTRAINT employee_pk PRIMARY KEY (id); --원래 있는거라 에러남
--modify 연산자 : 테이블의 컬럼을 수정하거나 NOT NULL 컬럼으로 변경
ALTER TABLE employee MODIFY (salary NUMBER(10,2) NOT NULL);
--drop 연산자 : 컬럼의 삭제
ALTER TABLE employee DROP COLUMN addr;
--rename 연산자 : 컬럼명 변경
ALTER TABLE employee RENAME COLUMN salary to sal;
--테이블명 변경
RENAME employee to employee2;
--테이블의 삭제
DROP TABLE employee2;
--join : 둘이상의 테이블을 연결하여 데이터를 검색하는 방법
--CARTESIAN PRODUCT (카티션 곱) : 검색하고자 했던 데이터뿐 아니라 조인에 사용된 테이블의 모든 데이터가 반환되는 현상
SELECT * FROM emp,dept;
--카티션 곱은 다음과 같은 경우 발생
-- 1-조인 조건을 정의하지 않았을 경우
-- 2-조인 조건이 잘못된 경우
-- 3-첫 번째 테이블의 모든 행들이 두 번째 테이블의 모든 행과 조인이 되는 경우
-- join 방법
--<oracle 전용>
--조건절 Equality condition (=)에 의하여 조인이 이루어짐
SELECT emp.ename, dept.loc FROM emp,dept WHERE emp.deptno = dept.deptno;
-- 테이블에 알리아스 부여하기
SELECT e.ename, d.dname FROM emp e , dept d WHERE e.deptno = d.deptno;
-- 추가적인 조건 명시하기
SELECT e.ename, d.dname FROM emp e , dept d WHERE e.deptno = d.deptno AND e.ename = 'ALLEN';
SELECT e.ename, e.sal, d.dname FROM emp e ,dept d WHERE e.deptno = d.deptno AND e.sal BETWEEN 3000 AND 4000;
-- 비 동등 조인 (non equi join)
-- 테이블의 어떤 column도 join할 테이블의 column에 일치하지 않을 때 사용하고 조인 조건은 동등 (=) 이외의 연산자를 갖음
-- (Between and , is null, is not null, in not in)
-- 사원이름, 급여 , 급여등급 구하기 (emp,salgrade 테이블 이용)
SELECT e.ename, e.sal, s.grade FROM emp e, salgrade s WHERE e.sal Between s.losal and s.hisal;
-- self Join
-- 사원이름과 해당 사원의 관리자 이름 구하기 (관리자가 없는 사원 제외)
SELECT a.ename 사원이름 , m.ename 관리자이름 FROM emp a, emp m WHERE a.mgr = m.empno;
-- 외부 조인(outer Join) 누락된 내용을 볼 수 있음
-- equi join 문장들은 두개의 테이블의 두개 컬럼에서 공통된 값이 없다면 테이블로부터 데이터를 반환하지 않는 다는 것.
-- 정상적으로 조인 조건을 만족하지 못하는 행들을 보기 위해 outer join 사용
SELECT distinct /* 중복값을 제거 해줌*/ (e.deptno) , d.deptno FROM emp e , dept d WHERE e.deptno (+)= d.deptno;
--사원이름과 해당 사원의 관리자 이름 구하기 ( 관리자가 없는 사원도 표시)
SELECT a.ename 사원이름 , m.ename 관리자이름 FROM emp a, emp m WHERE a.mgr = m.empno(+);
--[실습문제]
-- 1) 모든 사원의 이름,부서번호,부서이름을 표시하시오 (emp, dept)
-- 2) 업무가 MANAGER인 사원의 정보를 이름,업무,부서명,근무지 순으로 출력하시오. (emp, dept)
SELECT a.ename 이름,a.deptno 부서번호, d.dname 부서이름 FROM emp a ,dept d WHERE a.deptno = d.deptno;
SELECT a.ename 이름, a.job 업무, d.dname 부서명,d.loc 근무지 FROM emp a , dept d WHERE a.deptno = d.deptno and a.job = 'MANAGER';
-- 3) 커미션 계약을 맺고 급여가 1,600 이상인 사원의 사원이름,부서명,근무지 출력
-- 4) 근무지가 시카고(CHICAGO)인 모든 사원의 이름,업무,부서번호 및 부서이름을 출력
-- 5) 근무지(loc)별로 근무하는 사원의 수가 5명 이하인 경우, 인원이 적은 도시 순으로 정렬하시오.(근무 인원이 0명인 곳도 표시)
SELECT e.ename 사원이름,e.sal 급여, d.dname 부서명 ,d.loc 근무지 FROM emp e, dept d WHERE e.deptno = d.deptno and e.comm IS NOT NULL and e.sal>=1600;
SELECT e.ename 사원이름,e.job 업무 , e.deptno 부서번호, d.dname 부서이름 FROM emp e, dept d WHERE e.deptno = d.deptno and d.loc ='CHICAGO';
SELECT d.loc 도시, count(e.empno) emp_number FROM emp e, dept d WHERE e.deptno(+) = d.deptno GROUP BY d.loc Having count(e.empno)<=5 ORDER BY emp_number;
-- 6) 사원의 이름 , 사원번호, 관리자의 이름, 관리자번호를 표시하고 각각의 열 레이블은 Employee , emp# , manager, mgr# 으로 지정 (관리자가 없으면 출력 x)
-- 7) 관리자보다 먼저 입사한 모든 사원의 이름 및 입사일을 관리자의 이름 및 입사일과 함께 표시하고 열 레이블을 각각 Employee , emp hired , manager, mgr hired 로 지정 (관리자가 없으면 출력 x)
SELECT a.ename Employee ,a.empno emp#, m.ename manager ,m.empno manager# FROM emp a, emp m WHERE a.mgr = m.empno;
SELECT a.ename Employee ,a.empno "emp hired", m.ename manager ,m.empno "mgr hired" FROM emp a, emp m WHERE a.mgr = m.empno and a.hiredate<m.hiredate;
-- 8) 지정한 부서번호, 사원이름 , 지정한 사원과 동일한 부서에서 근무하는 모든사원을 표시하도록 질의를 작성하고 부서번호 department 사원이름 employee, 동일한 부서에서 근무하는 사원은 colleague 표시
-- (부서번호,사원이름,동료순으로 오름차순 정렬)
-- 9) 10번 부스에서 근무하는 사원들의 부서번호 ,부서이름, 사원이름, 월급, 급여등급을 출력하시오.
SELECT e.deptno department, e.ename employee, c.ename colleage FROM emp e , emp c WHERE e.deptno=c.deptno AND e.empno<>c.empno ORDER BY e.deptno,e.ename,c.ename;
SELECT e.deptno, d.dname , e.ename, e.sal, s.grade FROM emp e , dept d, salgrade s WHERE e.deptno=d.deptno AND e.sal BETWEEN s.losal and s.hisal AND e.deptno=10;
-- 표준 SQL
-- 내부조인(inner join)
SELECT e.ename , d.deptno FROM emp e INNER JOIN dept d ON e.deptno =d.deptno;
--join 사용시 on절을 정의하고 부가적인 조건이 있으면 where절 사용
SELECT e.ename, d.dname FROM emp e JOIN dept d ON e.deptno =d.deptno WHERE e.ename = 'ALLEN';
--만약 조인 조건에 사용된 컬럼의 이름이 같다면 다음과 같이 using절 사용하여 조인 조건을 정의할 수 있음.
/*주의 using에 사용된 컬럼은 테이블명 또는 테이블 알리아스를 붙이지 않음*/
SELECT e.ename, d.dname FROM emp e JOIN dept d USING(deptno) WHERE e.ename = 'ALLEN';
--salf JOIN
--사원이름과 해당 사원의 관리자 이름 구하기 (관리자 없는 사원은 제외)
SELECT e.ename, m.ename manager_name FROM emp e Join emp m ON e.mgr = m.empno;
-- 외부 조인 (Outer Join) : 누락된 행의 방향 표시
SELECT distinct(e.deptno), d.deptno FROM emp e JOIN dept d ON e.deptno =d.deptno;
-- 사원이름과 해당 사원의 관리자이름 구하기 (관리자가 없는 사원도 표시)
SELECT e.ename name , m.ename manager_name FROM emp e LEFT OUTER JOIN emp m ON e.mgr = m.empno;
-- 10) 업무가 MANAGER 인 사원의 정보를 이름,업무,부서명,근무지 순으로 출력하시오.
-- 11) 커미션을 받고 급여가 1,600 이상인 사원이름 급여 부서명 근무지 출력
-- 12) 근무지(loc) 별로 근무하는 사원의 수가 5명 이하인 경우 인원이 적은 도시 순으로 정렬 (근무 인원 0명인 곳도 표시, 근무지 근무인원)
SELECT e.ename , e.job , d.dname , d.loc FROM emp e JOIN dept d ON e.deptno = d.deptno WHERE e.job='MANAGER' ;
SELECT e.ename , e.sal, d.dname , d.loc FROM emp e JOIN dept d ON e.deptno = d.deptno WHERE e.comm IS NOT NULL and e.sal >=1600 ;
SELECT d.loc,COUNT(e.empno) emp_member FROM emp e RIGHT OUTER JOIN dept d ON e.deptno = d.deptno GROUP BY d.loc HAVING/*해빙절에서 as 사용불가*/ COUNT(e.empno)<=5 ORDER BY emp_member ASC;
-- 13) 10번부서에서 근무하는 사원들의 부서번호, 부서이름 , 사원이름 , 월급, 급여등급을 출력하시오.
SELECT e.deptno, d.dname ,e.ename, e.sal , s.grade FROM emp e INNER JOIN dept d ON e.deptno =d.deptno INNER JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal WHERE e.deptno=10;
--집합 연산자
-- union : 합집합, 중복값 제거 (유니온은 두 테이블의 결합을 나타내며, 결합시키는 두 테이블의 중복되지 않은 값들을 반환
SELECT deptno FROM emp UNION SELECT deptno FROM dept;
-- union all : union과 같으나 두 테이블의 중복되는 값까지 반환
SELECT deptno FROM emp UNION ALL SELECT deptno FROM dept;
--intersect : 두 행의 집합 중 공통된 행을 반환 (교집합)
SELECT deptno FROM emp INTERSECT SELECT deptno FROM dept;
-- minus : 첫번째 select 문에 의해 반환되는 행 중에서 두번째 select문에 의해 반환되는 행에 존재하지 않는 행들을 보여줌 (차집합)
SELECT deptno FROM dept MINUS SELECT deptno FROM emp;
'프로그래밍 > sql,php' 카테고리의 다른 글
sql> PL/SQL 2일차 (0) | 2018.11.22 |
---|---|
sql>오라클 DB수업 6일차 + PL/SQL START (0) | 2018.11.21 |
sql> 오라클db 수업 3일차 (0) | 2018.11.16 |
sql> 오라클 sql 수업 2일차 (0) | 2018.11.15 |
sql> 오라클 sql 수업 1일차 (0) | 2018.11.14 |