3일차 Oracle(2023-03-23)

권단비·2023년 3월 23일
0

IT

목록 보기
105/139

Cardinality

--공통적으로 존재하는 컬럼의 값이 일치되는 행을 연결하여 결과를 생성화는 조인 기법
--관계를 맺어줌 - 뭐를 통해서 key를 통해서
--그 관계(Relation)에도 종류가 있음
--1:1, 1:n, n:m
--EMP부모(1) : DEPT자식(n) ⇒1:2

SELECT * FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;

--조인은 언제 쓰나? 서로 다른 테이블에 있는 컬럼을 하나의 테이블로 만들어주기 위해 사용
--job이 세일즈맨인 사람들이 근무하는 위치는?
SELECT ENAME, JOB, LOC FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO AND JOB = 'SALESMAN';
SELECT * FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO and job = 'SALESMAN';

--사원(EMP)테이블의 별칭을 E로, 부서(DEPT)테이블의 별칭을 D로 부여하는 쿼리문
SELECT * FROM EMP e, DEPT d WHERE e.DEPTNO = d.DEPTNO and e.job = 'SALESMAN';

--NON-EQUI JOIN(비등가 조인)

--각 사원의 급여가 몇 등급인지 살펴보는 쿼리문
SELECT * FROM EMP, SALGRADE WHERE sal >= losal AND sal <=hisal;
SELECT * FROM emp, salgrade WHERE sal BETWEEN losal AND hisal;

--사원 이름과 소속 부서명, 급여의 등급을 출력하는 쿼리문
--(사원테이블에는 부서 이름과 급여 등급은 없고, 부서 번호와 급여만 있다.)
SELECT ENAME, DEPTNO, GRADE FROM EMP e, SALGRADE s WHERE e.sal BETWEEN s.losal AND s.hisal;
SELECT * FROM EMP, SALGRADE, DEPT WHERE SAL >= LOSAL AND SAL <= HISAL AND EMP.DEPTNO = DEPT.DEPTNO;
SELECT E.ENAME, D.DNAME, S.GRADE FROM EMP E, DEPT D, SALGRADE S WHERE E.DEPTNO = D.DEPTNO AND E.SAL BETWEEN S.LOSAL AND S.HISAL;

--4)SELF JOIN
--SMITH의 매니저 이름
SELECT * FROM EMP E, EMP M;
SELECT E.ENAME, M.ENAME AS 매니저 FROM EMP E, EMP M WHERE E.MGR=M.EMPNO;

SELECT E.ENAME, M.ENAME AS 매니저 FROM EMP E, EMP M WHERE E.MGR=M.EMPNO AND E.ENAME='SMITH';

--서브 쿼리 - 쿼리안에 쿼리
--하나의 SELECT 문장 내에 포함된 또 하나의 SELECT 문장이 있는 쿼리문이다.
--비교 연산자의 오른쪽에 기술해야 하고, 반드시 괄호 안에 넣어야 한다.
--단일행, 다중행(결과물이 2개 나옴)
SELECT ename FROM emp WHERE emp.empno =(
select mgr FROM emp WHERE ename = 'SMITH'
);
--1)단일행 서브 쿼리
--사원들의 평균 급여보다 더 많은 급여를 받는 사원을 검색하는 쿼리문
SELECT ename, sal FROM EMP WHERE EMP.sal >=(
SELECT round(AVG(sal)) FROM EMP);

select * from emp where sal > (
select avg(sal)from emp);

--SMITH의 급여와 동일하거나(서브쿼리) 급여를 더 많이 받는(조건 연산자) 사원과 급여를 출력하는(메인쿼리) 쿼리문
SELECT ename, sal FROM EMP WHERE EMP.sal >=(
SELECT sal FROM EMP WHERE EMP.ename = 'SMITH');

--ALLEN이 근무하는 위치(서브쿼리)
SELECT ename, loc FROM DEPT, EMP WHERE EMP.ename = 'ALLEN' AND DEPT.DEPTNO = (
SELECT deptno FROM EMP WHERE EMP.ename='ALLEN');

select * from dept where deptno = (
select deptno from emp where ename = 'ALLEN');

--1)다중행 서브 쿼리
--연봉을 3000이상 받는 사원이 소속된 부서(연산자)와 동일한 부서에서 근무하는 사원들의 정보를 출력하는 쿼리문
SELECT * FROM EMP WHERE EMP.DEPTNO in (SELECT deptno FROM EMP WHERE EMP.sal>=3000);

select * from emp where comm in (300,500,1400);

--ANY : 30번 부서의 여러개의 급여 중 최솟값 선택하여 출력
select ename, sal FROM emp WHERE sal > ANY (select sal FROM emp WHERE deptno = 30);

0개의 댓글