서브쿼리는 SELECT 명령에 의한 데이터 질의로, 상부가 아닌 하부의 부수적인 질의를 의미한다.
(SELECT 명령)
서브쿼리는 SQL 명령문 안에 지정하는 하부 SELECT 명령으로 괄호로 묶어 지정한다. 특히, SQL 명령의 WHERE 구에서 주로 사용된다. (SELECT구, DELETE구, UPDATE구)
sample52 테이블에서 a의 최솟값 삭제하기
테이블에서 a의 최솟값 검색
SELECT MIN(a) FROM sample54;
위의 select 명령을 DELETE 명령의 WHERE구에서 사용
DELECT FROM sample54 WHERE a=(SELECT MIN(a) FROM sample54);
괄호로 둘러싼 서브쿼리 부분을 먼저 실행한 후 DELETE 명령을 실행한다.
변수사용
변수 = (SELECT MIN(a) FROM sample54); DELETE FROM sample54 WHERE a = 변수;
- MySQL 클라이언트 변수
SET @a = (SELECT MIN(a) FROM sample54); DELETE FROM sample54 WHERE a = @a;
서브쿼리 사용시 해당 명령이 어떤 값을 반환하는지 주의할 필요가 있다.
SELECT MIN(a) FROM sample54;
SELECT no FROM sample54;
SELECT MIN(a), MAX(no) FROM sample54;
SELECT no,a FROM sample54;
1번 패턴만 다른 패턴과 다르다. 이는 다른 패터놔 달리 하나의 값을 반환하기 때문이다. 단일 값으로도 통용, 데이터베이스 업계에서는 스칼라 값이라 불림
SELECT 명령이 하나의 값만 반환하는 것을
스칼라 값을 반환한다
고 한다.
스칼라 값 반환하는 SELECT 명령은 서브쿼리로서 사용 하기 쉽다.
WHERE구에서 스칼라 값을 반환하는 서브쿼리는 =
연산자로 비교할 수 있다.
=
연산자를 사용하여 비교할 경우에는 스칼라 값끼리 비교할 필요가 있다.
서브쿼리를 사용할 때는 스칼라 서브쿼리로 되어있는 확인해야 한다.
SELECT 구에서 서브쿼리를 지정할 때는 스칼라 서브쿼리가 필요하다.
SELECT
(SELECT COUNT(*) FROM sample51) As sq1,
(SELECT COUNT(*) FROM sample54) AS sq2;
상부의 SELECT 명령에는 FROM구가 없다. (MySQL에서는 실제로 FROM구의 생략이 가능하다.,Oracle: FROM DUAL
사용 필요)
UPDATE의 SET 구에서도 서브쿼리 사용 가능
UPDATE sample54 SET a = (SELECT MAX(a) FROM sample54);
SET 구에서 서브쿼리 사용시 스칼라 서브쿼리 지정
괄호로 SELECT 명령을 묶는다. 스칼라 서브쿼리가 아니어도 상관없다.
SELECT * FROM (SELECT * FROM Sample54) sq;
sq
: 테이블의 별명 AS
키워드 사용 지정 , Oracle에서는 AS 사용시 에러
SELECT * FROM (SELECT * FROM sample54) as sq;
FROM구에서 서브쿼리를 사용하는 것으로 Orcle에서도 정렬 후 상위 몇 건을 추출한다는 행 제한을 할 수 있다.
SELECT * FROM (
SELECT * FROM sample54 ORDER BY a DESC
) sq
WHERE ROWNUM <=2;
INSERT INTO sample541 VALUES (
(SELECT COUNT(*) FROM sample51),
(SELECT COUNT(*) FROM sample54)
);
INSERT INTO sample541 SELECT 1,2;
INSERT INTO sample541 VALUES(1,2);
와 동일 INSERT SELECT 명령은 SELECT 명령의 결과를 INSERT INTO로 지정한 테이블에 전부 추가한다.
INSERT INTO sample542 SELECT * FROM sample543;