SELECT name, position
FROM professor
WHERE position = (SELECT position
FROM professor
WHERE name = '전은지');
WHERE절에서 WHERE절에서방법 1
SELECT studno, name, grade
FROM student
WHERE grade = (SELECT grade
FROM student
WHERE userid = 'jun123');
이 구문을 보면, 서브쿼리에서 조건절을 통해 하나의 행으로 제약 => 그 행(grade)와 같은 grade를 출력
방법 2
SELECT studno, name, weight
FROM student
WHERE weight < (SELECT avg(weight)
FROM student
WHERE deptno = 101)
AND height > (SELECT avg(height)
FROM student
WHERE deptno = 101)
이 구문을 보면, 서브쿼리에서 그룹함수로 하나의 행(값)을 반환 => 그 값보다 작은 weight를 출력
그리고 2개의 조건을 이렇게 전달 가능
SELECT name, grade, deptno
FROM student
WHERE deptno IN (SELECT deptno
FROM department
WHERE college in (100, 102));
SELECT name, grade, deptno
FROM student
WHERE deptno = 101
OR deptno = 102;
SELECT studno, name, height
FROM student
WHERE height > ANY (SELECT height
FROM student
WHERE grade = 4);
SELECT studno, name, height
FROM student
WHERE height > (SELECT min(height)
FROM student
WHERE grade = 4);
이 둘은 같다. 이유는 서브쿼리의 height에서 출력되는 다중 행 중 하나라도 조건을 만족하면 참이 된다, 즉 가장 작은 값보다 크기만 하면 참이 되기 때문.
SELECT studno, name, height
FROM student
WHERE height > ALL (SELECT height
FROM student
WHERE grade = 4);
SELECT studno, name, height
FROM student
WHERE height > (SELECT max(height)
FROM student
WHERE grade = 4);
여기서는 max(height)과 같다. 왜냐하면 모든 조건을 만족하려면, 최댓값보다 크면 되기 때문.
EXISTS: 서브쿼리에서 검색된 결과가 하나라도 존재하면 메인쿼리 조건절이 참이 된다(즉, 서브쿼리 검색 결과가 존재하지 않을 때만 거짓)NOT EXISTS: 반대로, 서브쿼리의 검색 결과가 존재하지 않을 때, 메인쿼리의 조건절이 참이 된다. SELECT profno, name, sal, comm
FROM professor
WHERE EXISTS (SELECT position
FROM professor
WHERE comm IS NOT NULL);
여기서 position에 NOT NULL이 하나라도 있으면 => 메인 쿼리를 전체 출력. subquery에서 not null인 행만 출력하는 게 아니라!!
position이 모두 NULL이면 => 메인 쿼리는 출력 아예 출력 X
SELECT 1 userid_exist
FROM dual
WHERE NOT EXISTS (SELECT userid
FROM student
where userid = 'goodstudent');
여기서 dual은 1열 1행으로 1개의 스칼라값을 넣을 수 있는 공간. 그냥 값 확인하는 용도로 이용.
1 userid_exist는 1 AS userid_exist로, WHERE절이 TRUE면 그냥 1을 출력한다는 뜻이고, 그 칼럼의 이름이 userid_exist.
서브쿼리에 저 아이디가 없으면 => WHERE절이 TRUE이므로 => 1 출력
서브쿼리에 저 아이디가 있으면 => WHERE절이 FALSE이므로 => 출력 안됨
PAIRWISE: 비교대상 칼럼을 쌍으로 묶어서 행별로 비교UNPAIRWISE: 비교대상 칼럼을 각각 분리해서 개별적으로 비교 후 AND 연산PAIRWISE
SELECT name, grade, weight
FROM student
WHERE (grade, weight) IN (SELECT grade, MIN(weight)
FROM student
GROUP BY grade);
UNPAIRWISE
SELECT name, grade, weight
FROM student
WHERE grade IN (SELECT grade
FROM student
GROUP BY grade)
AND weight IN (SELECT MIN(weight)
FROM student
GROUP BY grade);
SELECT name, deptno, height
FROM student s1
WHERE height > (SELECT AVG(height)
FROM student s2
WHERE s2.deptno = s1.deptno)
이처럼 서브쿼리의 조건절에 메인쿼리의 s1을 들고오기
SELECT employee_id, last_name,
(SELECT department_name
FROM department d
WHERE e.department_id = d.department_id
) AS department_name
FROM employees e
ORDER BY department;
SELECT e.employee_id, e.last_name, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id
ORDER BY department;
SQL 함수 여러 개 처리 시: 맨 안쪽 함수부터 처리 => 처리 결과를 바깥쪽 함수로 넘김