[SQL] 23. 서브 쿼리

uuuu.jini·2023년 1월 30일
1

SQL 첫걸음

목록 보기
23/36
post-thumbnail

서브쿼리는 SELECT 명령에 의한 데이터 질의로, 상부가 아닌 하부의 부수적인 질의를 의미한다.

(SELECT 명령)

서브쿼리는 SQL 명령문 안에 지정하는 하부 SELECT 명령으로 괄호로 묶어 지정한다. 특히, SQL 명령의 WHERE 구에서 주로 사용된다. (SELECT구, DELETE구, UPDATE구)

1. DELETE의 WHERE 구에서 서브쿼리 사용하기


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;

2. 스칼라값


서브쿼리 사용시 해당 명령이 어떤 값을 반환하는지 주의할 필요가 있다.

  1. 하나의 값을 반환하는 패턴
    SELECT MIN(a) FROM sample54;
  2. 복수의 행이 반환되지만 열은 하나인 패턴
    SELECT no FROM sample54;
  3. 하나의 행이 반환되지만 열이 복수인 패턴
    SELECT MIN(a), MAX(no) FROM sample54;
  4. 복수의 행, 복수의 열이 반환되는 패턴
    SELECT no,a FROM sample54;

1번 패턴만 다른 패턴과 다르다. 이는 다른 패터놔 달리 하나의 값을 반환하기 때문이다. 단일 값으로도 통용, 데이터베이스 업계에서는 스칼라 값이라 불림

SELECT 명령이 하나의 값만 반환하는 것을 스칼라 값을 반환한다고 한다.

스칼라 값 반환하는 SELECT 명령은 서브쿼리로서 사용 하기 쉽다.

  • SELECT 구에서 단일 열을 지정
  • GROUP BY를 지정하지 않은 채 집계 함수 사용
  • WHERE 조건으로 하나의 행만 검색

WHERE구에서 스칼라 값을 반환하는 서브쿼리는 = 연산자로 비교할 수 있다.

=연산자를 사용하여 비교할 경우에는 스칼라 값끼리 비교할 필요가 있다.

  • 스칼라 서브쿼리: 스칼라 값을 반환하는 서브쿼리, WHERE 구에 사용할 수 있으므로 집계함수를 사용해 집계한 결과를 조건식으로 사용할 수 있다. (원래는 집계함수는 WHERE 구에 사용하지 못한다.)

3. SELECT 구에서 서브쿼리 사용하기


서브쿼리를 사용할 때는 스칼라 서브쿼리로 되어있는 확인해야 한다.

SELECT 구에서 서브쿼리를 지정할 때는 스칼라 서브쿼리가 필요하다.

SELECT
	(SELECT COUNT(*) FROM sample51) As sq1,
    (SELECT COUNT(*) FROM sample54) AS sq2;

상부의 SELECT 명령에는 FROM구가 없다. (MySQL에서는 실제로 FROM구의 생략이 가능하다.,Oracle: FROM DUAL 사용 필요)

4. SET 구에서 서브쿼리 사용하기


UPDATE의 SET 구에서도 서브쿼리 사용 가능

  • UPDATE sample54 SET a = (SELECT MAX(a) FROM sample54);

SET 구에서 서브쿼리 사용시 스칼라 서브쿼리 지정

5. FROM 구에서 서브쿼리 사용하기


FROM 구에 서브쿼리 기술 방법

괄호로 SELECT 명령을 묶는다. 스칼라 서브쿼리가 아니어도 상관없다.

  • SELECT * FROM (SELECT * FROM Sample54) sq;
  • 네스티드 구조 , 중첩구조, 내포구조
  • sq: 테이블의 별명
  • FROM 구에서는 테이블이나 서브쿼리에 별명을 붙일 수 있다.

테이블 별명

AS 키워드 사용 지정 , Oracle에서는 AS 사용시 에러

  • SELECT * FROM (SELECT * FROM sample54) as sq;

- 실제 업무에서 FROM 구에 서브쿼리르 지정하여 사용하는 경우

FROM구에서 서브쿼리를 사용하는 것으로 Orcle에서도 정렬 후 상위 몇 건을 추출한다는 행 제한을 할 수 있다.

SELECT * FROM (
	SELECT * FROM sample54 ORDER BY a DESC
) sq
WHERE ROWNUM <=2;

6. INSERT 명령과 서브쿼리


  • VALUES 구의 일부로 서브쿼리 사용
  • VALUES 구 대신 SELECT 명령을 사용

VALUES 구의 값으로 서브쿼리 사용 예

  • 스칼라 서브쿼리 일 필요 없음, 자료형 일치
INSERT INTO sample541 VALUES (
	(SELECT COUNT(*) FROM sample51),
    (SELECT COUNT(*) FROM sample54)
);

- INSERT SELECT (VALUES 구 대신 SELECT 명령 사용 예)

INSERT INTO sample541 SELECT 1,2;
  • 결괏값으로 1과 2라는 상수 반환
  • INSERT INTO sample541 VALUES(1,2); 와 동일
  • SELECT가 반환하는 열의 수와 자료형이 INSERT할 테이블과 일치하여야 한다.

INSERT SELECT 명령은 SELECT 명령의 결과를 INSERT INTO로 지정한 테이블에 전부 추가한다.

  • INSERT INTO sample542 SELECT * FROM sample543;
profile
멋쟁이 토마토

0개의 댓글