SELECT e.ename , e.deptno, d.dname FROM emp e, dept d WHERE e.deptno = d.deptno;
SELECT e.ename, e.job, d.dname, d.loc FROM emp e, dept d WHERE e.deptno = d.deptno AND e.job = 'MANAGER';
SELECT e.ename , e.sal , d.dname, d.loc FROM emp e, dept d WHERE e.deptno= d.deptno AND ( e.sal + NVL(comm,0)) >= 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 DISTINCT (d.loc) , COUNT(e.empno) FROM emp e , dept d WHERE e.deptno (+)= d.deptno GROUP BY d.loc HAVING COUNT(e.empno) <= 5 ORDER BY COUNT(e.empno);
SELECT e.ename "Employee", e.empno "EMP#" , m.ename "Manager", m.empno "MGR#" FROM emp e, emp m WHERE m.empno = e.mgr;
SELECT e.ename "Employee" , e.hiredate "EMP Hired" , m.ename "Manager" , m.hiredate "MGR Hired" FROM emp e, emp m WHERE m.empno = e.mgr AND e.hiredate < m.hiredate;
SELECT emp.ename , dept.deptno FROM emp INNER JOIN dept ON emp.deptno = dept.deptno ;
SELECT emp.ename , dept.deptno FROM emp JOIN dept ON emp.deptno = dept.deptno ;
SELECT e.ename, d.dname FROM emp e JOIN dept d ON e.deptno = d.deptno;
두 개 테이블의 공통 컬럼은 알리아스를 생략할 수 없음
SELECT ename, dname, d.deptno FROM emp e JOIN dept d ON e.deptno = d.deptno;
ON절은 JOIN 조건을 명시하고 WHERE에 부가 조건을 명시한다.
SELECT e.ename, d.dname FROM emp e JOIN dept d ON e.deptno = d.deptno WHERE e.ename = 'ALLEN';
만약 JOIN 조건에 사용된 컬럼의 이름이 같다면 다음과 같이 USING절을 사용할 수 있다.
USING(컬럼명) 절에 명시한 컬럼명을 호출할 때는 테이블명 또는 알리아스를 명시해서 호출이 불가능하다.
SELECT * FROM emp e JOIN dept d USING(deptno);
SELECT e.ename, d.deptno FROM emp e JOIN dept d USING(deptno); -- 오류 발생함
SELECT e.ename, deptno, d.dname FROM emp e JOIN dept d USING(deptno);
SELECT ename, deptno, dname FROM emp e JOIN dept d USING(deptno); -- 알리아스를 생략해도 문제 없다!
SELECT e.ename, deptno FROM emp e JOIN dept d USING (deptno) WHERE e.ename = 'ALLEN';
사원 이름과 해당 사원의 관리자 이름 구하기 (관리자가 없는 사원은 제외)
SELECT e.ename "Employee" , m.ename "Manager" FROM emp e JOIN emp m ON e.mgr = m.empno ;
누락된 행의 방향 표시
SELECT e.deptno,d.deptno FROM emp e RIGHT OUTER JOIN dept d ON e.deptno = d.deptno;
사원 이름과 해당 사원의 관리자 이름 구하기 (관리자 없는 사원도 표시)
SELECT e.ename "Employee Name" ,m.ename "Manager Name" FROM emp e LEFT OUTER JOIN emp m ON e.mgr = m.empno;
SELECT e.ename, e.deptno , d.dname, d.loc FROM emp e JOIN dept d ON e.deptno = d.deptno;
SELECT e.ename , e.job , d.dname, d.loc FROM emp e JOIN dept d ON e.deptno = d.deptno WHERE e.job = 'SALESMAN';
SELECT e.empno "사원 번호", e.ename "사원 이름", (e.sal +e.comm) "실급여" , (e.sal * 12) "연봉" , s.grade "급여 등급"
FROM emp e JOIN salgrade s ON (e.sal + e.comm)
BETWEEN s.losal AND s.hisal WHERE e.comm IS NOT NULL;
[오라클 전용]
SELECT d.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]
SELECT d.deptno , d.dname, e.ename, e.sal, s.grade FROM emp e JOIN dept d ON e.deptno = d.deptno JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal WHERE e.deptno=10;
SELECT deptno FROM emp UNION SELECT deptno FROM dept;
SELECT deptno FROM emp UNION ALL SELECT deptno FROM dept;
SELECT deptno FROM emp INTERSECT SELECT deptno FROM dept;
SELECT deptno FROM dept MINUS SELECT deptno FROM emp;
SELECT job FROM emp WHERE empno = 7369;
SELECT empno, ename , job FROM emp WHERE job = 'CLERK';
-> 위의 두개의 문자를 서브쿼리를 사용해서 작성
SELECT empno, ename, job FROM emp WHERE job = (SELECT job FROM emp WHERE empno = 7369);
7698의 급여보다 많은 급여를 받는 사원들의 사원번호, 사원이름, 급여를 출력하세요.
SELECT empno, ename, sal FROM emp WHERE sal > (SELECT sal FROM emp WHERE empno = 7698);
하나 이상의 행을 반환하는 서브쿼리
SELECT empno, ename, sal, deptno FROM emp WHERE sal IN(SELECT MIN(sal) FROM emp GROUP BY deptno);
SELECT sal FROM emp WHERE job = 'SALESMAN';
SELECT ename, sal FROM emp WHERE sal>1250 OR sal>1500 OR sal>1600;
-> 위 문장을 서브쿼리로 작성
SELECT ename, sal FROM emp WHERE sal > ANY (SELECT sal FROM emp WHERE job = 'SALESMAN');
SELECT sal FROM emp WHERE deptno =20;
SELECT empno, ename, sal, deptno FROM emp WHERE sal>800 AND sal>2975 AND sal >3000;
-> 위 두 쿼리를 서브쿼리로 작성
SELECT empno, ename, sal, deptno FROM emp WHERE sal > ALL ( SELECT sal FROM emp WHERE deptno = 20);
서브쿼리의 결과가 두 개 이상의 컬럼으로 반환되어 메인 쿼리에 전달하는 쿼리
SELECT empno, ename, sal, deptno FROM emp WHERE (deptno, sal) IN (SELECT deptno , sal FROM emp WHERE deptno = 30);
부서별로 가장 급여를 적게 받는 사원 정보를 출력
SELECT empno, ename, sal, deptno FROM emp WHERE (deptno, sal) IN (SELECT deptno ,MIN(sal) FROM emp GROUP BY deptno);
부서별로 가장 급여를 적게 받는 사원과 동일 급여를 받는 사원 정보를 출력
SELECT empno, ename, sal, deptno FROM emp WHERE sal IN (SELECT MIN(sal) FROM emp GROUP BY deptno);
SELECT * FROM emp;
SELECT empno,deptno FROM emp WHERE sal > (SELECT AVG(sal) FROM emp WHERE deptno = 20);