: SELECT 명령에 의한 데이터 질의. 하부의 부수적 질의를 의미
DELETE FROM sample1
WHERE a = (
SELECT MIN(a) FROM sample1
);
스칼라 서브쿼리
: 1번 패턴 (SELECT 명령이 하나의 값을 반환)을 '스칼라 값 반환'이라고 표현한다.
하나의 그룹에 다른 값이 여러 개 존재한다면 스칼라 값이 아니다!
스칼라 서브쿼리가 필요하다.
SELECT
(SELECT COUNT(*) FROM sample1) AS sq1,
(SELECT COUNT(*) FROM sample2) AS sq2;
스칼라 서브쿼리가 필요하다.
UPDATE sample1 SET a = (SELECT MAX(a) FROM sample1);
스칼라 값이어도, 아니어도 상관 없다.
SELECT * FROM ( SELECT * FROM sample1 ) sq;
네스티드(nested) 구조 (=중첩구조 = 내포구조)
: SELECT 명령 안에 SELECT 명령이 들어있는 구조
: 별명을 붙여 서브쿼리의 이름을 지정한다. AS는 생략 가능
: 중첩구조는 몇 단계로든 구성 가능!
Oracle에서 LIMIT 구의 대체 명령으로 사용 가능
INSERT INTO sample1 VALUES (
(SELECT COUNT(*) FROM sample1),
(SELECT COUNT(*) FROM sample2)
);
INSERT INTO sample1 SELECT 1, 2;
: 서브쿼리의 일종. EXISTS 술어로 조합하여 서브쿼리를 사용하는 방법
데이터가 존재하는지 아닌지를 판별
UPDATE sample1 SET a='있음' WHERE
EXISTS (SELECT * FROM sample2 WHERE no2=no);
데이터가 존재하지않는지 하는지를 판별
UPDATE sample1 SET a='없음' WHERE
NOT EXISTS (SELECT * FROM sample2 WHERE no2=no);
부모 명령과 자식인 서브쿼리가 특정 관계를 맺는 것
UPDATE sample1 SET a='있음' WHERE
EXISTS (SELECT * FROM sample2 WHERE no2=no);
SELECT * FROM sample2 WHERE no2=no // no2가 불명확. 에러!
UPDATE sample1 SET a='있음' WHERE
EXISTS (SELECT * FROM sample2 WHERE sample2.no2=sample1.no);
집합 안의 값이 존재하는지 조사하는 술어
SELECT * FROM sample1 WHERE no IN (3,5);
// 서브쿼리로 집합 부분 지정 가능
SELECT * FROM sample1 WHERE no IN (
SELECT no2 FROM sample2
);