<서브쿼리>
- Java 객제지향의 상속과 똑같은 개념이다
- 상속당한 자식 객체는 부모 객체의 인스턴스를 사용할 수 있고, 부모는 자식객체의 인스턴스를 사용할수 없다
<장점>
- 서브쿼리는 쿼리를 구조화시키므로, 쿼리의 각 부분을 명확히 구분할 수 있게 해준다
- 서브쿼리는 복잡한 JOIN이나 UNION과 같은 동작을 수행할 수 있는 또 다른 방법을 제공한다
- 서브쿼리는 복잡한 JOIN이나 UNION 보다 가독성이 좋다
<특징>
서브쿼리는 SELECT문으로만 작성 할 수 있다
반드시 괄호()안에 존재하여야 한다
괄호가 끝나고 끝에 세미콜론을 쓰지 않는다
ORDER BY를 사용 할 수 없다
SELECT *, (SELECT comm FROM emp WHERE ename = '홍길동')
FROM department;
SELECT profno, p.name
FROM (SELECT DISTINCT profno FROM student) e
JOIN professor p
USING(profno);
SELECT ename, comm
FROM emp
WHERE comm < (SELECT comm FROM emp WHERE ename = 'WARD');
SELECT NAME, weight
FROM student
WHERE weight > (SELECT AVG(weight) FROM student WHERE deptno1 = 201);
-- 서브쿼리 내 join 가능
SELECT NAME, weight
FROM student
WHERE weight > (SELECT AVG(s.weight)
FROM student s JOIN department d ON s.deptno1 = d.deptno
WHERE d.dname = '전자공학과')
SELECT s.studno, s.name, e.total
FROM student s JOIN exam_01 e USING (studno)
WHERE e.total BETWEEN (SELECT min_point FROM hakjum WHERE grade = 'A0')
AND (SELECT max_point FROM hakjum WHERE grade = 'A0');
-- In
SELECT e.EMPNO, e.NAME, e.position, d.DNAME
FROM emp2 e JOIN dept2 d ON E.deptno = d.dcode
WHERE e.DEPTNO IN (SELECT dcode FROM dept2 WHERE AREA = '포항본사');
-- Any : True 결과값이 하나 이상일 때 (||)
SELECT empno, NAME, POSITION, pay FROM emp2
WHERE pay > ANY (SELECT pay FROM emp2 WHERE POSITION = '과장');
-- All : 모든 결과값이 True일 때 (&&)
SELECT NAME, grade, weight FROM student
WHERE weight < ALL (SELECT weight FROM student WHERE grade = 2);
-- Exists : 결과가 하나라도 존재하면 조회
SELECT profno, name
FROM professor p
WHERE EXISTS (SELECT * FROM student WHERE profno = p.profno);
SELECT NAME, grade, height FROM student
WHERE (grade, height) IN (SELECT grade, max(height)
FROM student GROUP BY grade)
ORDER BY 2;