> 연산자 : =, >, >=, < ,<=, <>
> 예시) 사원번호가 7369인 사원과 같은 직업을 갖는 사원들의 사원번호,이름,직업을 출력하시오.
>>알고리즘
(1)사원번호, 이름, 직업을 조회.
(2)어떤 조건? 어떠한 직업을 갖는 조건
(3)어떤 직업? 사원번호가 7369인 사원과 같은 직업
>>서브쿼리로 만들어줄 부분: 사원번호가 7369인 사원의 직업
입력예시)
SELECT EMPNO, ENAME, JOB FROM EMP
WHERE JOB=(SELECT JOB FROM EMP WHERE EMPNO=7369);
> 연산자: IN, ANY, ALL, EXIST(단일행 연산자 사용x)
> 서브쿼리에서 두 컬럼을 한번에 비교하고 메인쿼리로 넘긴다.
문법)
WHERE(컬럼1,컬럼2) [IN/ANY/ALL](SELECT 컬럼1,컬럼2...서브쿼리)
문법)
WHERE 비교컬럼 IN (서브쿼리)
문법)
WHERE 비교컬럼[=,<,>,<> 등]ANY(서브쿼리)
WHERE 비교컬럼[=,<,>,<> 등]ALL(서브쿼리)
문법)
WHERE 비교컬럼 EXIST(서브쿼리)
cf)ROWID: 행의 고유번호 -- JAVA의 주소값이라고 보면 됨. 중간에 ROW를 삭제해도 변하지 않음
문법)
SELECT * FROM(서브쿼리: ORDER BY로 순위를 정렬해줄 수 있다.) WHERE ROWNUM[=,<,> 등] 인덱스숫자;
cf) FROM절에도 서브쿼리가 올 수 있다.
해석)
(1) 정렬을 한 서브쿼리 조건에서 전체를 조회함
(2) 무슨 조건으로? 인덱스 조건으로
=>다른 테이블의 컬럼을 조회할때 사용
=>JOIN과 비슷하지만 조회되는 데이터의 양이 적을 경우에만 효율적임
=>결과값이 행하나 열 하나인 경우에만 사용 가능
문법)
SELECT 테이블1.컬럼1, 테이블1.컬럼2,(서브쿼리) [ALIAS명] FROM 테이블1;
서브쿼리 내용)
SELECT 컬럼3 FROM 테이블2 WHERE 테이블1.컬럼3=테이블2.컬럼3
WHERE절을 써주어야 하는 이유: 써주지 않으면 서브쿼리 테이블에 있는 컬럼 종류만 딱 가져오기 때문에 행 개수 불일치 오류가 난다.
예시) 사원번호,사원이름,부서번호,부서이름을 조회하시오.
--테이블 EMP, DEPT에 있는 공통적인 컬럼=>DEPTNO. 즉 부서번호가 같으면 불러와라
SELECT EMPNO, ENAME, DEPTNO,
(SELECT DNAME FROM DEPT WHERE E.DEPTNO=D.DEPTNO) 부서명
-- 부서명: ALIAS
FROM EMP ;
출력예시>
EMPNO ENAME DEPTNO 부서명
---------- ---------- ---------- --------------
7369 SMITH 20 RESEARCH
7499 ALLEN 30 SALES
7521 WARD 30 SALES
7566 JONES 20 RESEARCH
7654 MARTIN 30 SALES
7698 BLAKE 30 SALES
7782 CLARK 10 ACCOUNTING
7839 KING 10 ACCOUNTING
7844 TURNER 30 SALES
7900 JAMES 30 SALES
7902 FORD 20 RESEARCH
EMPNO ENAME DEPTNO 부서명
---------- ---------- ---------- --------------
7934 MILLER 10 ACCOUNTING