2021-11-12 SQL 첫걸음 (10주차)

서브쿼리

  • SELECT 명령에 의한 데이터 질의로, 상부가 아닌 하부의 부수적인 질의를 의미한다.
(SELECT 명령)
  • 서브쿼리는 WHERE 구에서 주로 사용
  • WHERE 구는 SELECT, DELETE, UPDATE 구에서 사용할 수 있는데 이들중 어디서도 서브쿼리 사용 가능

DELETE의 WHERE 구에서 서브쿼리

image

  • 위에서 a열의 값이 가장 작은 행을 삭제하려 하고, 가장 작은 행이 어느것인지 모를때
DELETE FROM sample54 WHERE a = (SELECT MIN(a) FROM sample54);
  • 괄호로 둘러싼 서브쿼리 부분을 먼저 실행한 후 delete 실행

스칼라 값

  • 서브쿼리의 패턴
SELECT MIN(a) FROM sample54;
-하나의 값을 반환하는 패턴

SELECT no FROM sample54;
-복수의 행이 반환되지만 열은 하나인 패턴

SELECT MIN(a), MAX(no) FROM sample54;
-하나의 행이 반환되지만 열이 복수인 패턴

SELECT no, a FROM sample54;
-복수의 , 복수의 열이 반환되는 패턴
  • SELECT 명령이 하나의 값만 반환하는 것을 ‘스칼라 값을 반환한다’고 한다.
  • 특별취급하는 이유 = 서브쿼리로서 사용하기 쉽기 때문

SELECT 구에서 서브쿼리

SELECT
	(SELECT COUNT(*) FROM sample51) AS sq1,
	(SELECT COUNT(*) FROM sample54) AS sq2;
  • 서로 다른 테이블의 행 개수를 각 서브쿼리로 구한다.
  • FROM구 생략 가능
  • Oracle의 경우에는 FROM DUAL 사용해야한다.

SET 구에서 서브쿼리

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

FROM 구에서 서브쿼리

  • SELECT나 SET 구에서는 스칼리 서브쿼리를 지정해야 했지만 FROM은 아니여도 괜찮다
SELECT * FROM (SELECT * FROM sample54) sq;
SELECT * FROM (SELECT * FROM (SELECT * FROM sample54) sq1) sq2;
- 중첩구조

SELECT * FROM (
	SELECT * FROM sample54 ORDER BY a DESC
) sq
WHERE ROWNUM <= 2; //정렬후 상위 몇건 추출 가능

INSERT 명령과 서브쿼리

  • VALUES 구의 일부 서브쿼리를 사용, VALUES 구 대신 SELECT 명령 사용하는 2가지 방법
Insert INTO sample541 VALUES (
	(SELECT COUNT(*) FROM sample51),
	(SELECT COUNT(*) FROM sample54)
);
-스칼리 서브쿼리여야하고 자료형도 일치해야 한다.

//INSERT SELECT
INSERT INTO sample541 SELECT 1, 2;
-서브쿼리라 부르기 어려울수도 있다, select 결괏값으로 1,2 반환하므로
- VALUES(1, 2) 같다

EXISTS

  • EXIST 술어를 사용하면 서브쿼리가 반환하는 결괏값이 있는지를 조사할 수 있다.
UPDATE sample551 SET a = '있음' WHERE
	EXISTS (SELECT * FROM sample 552 WHERE no2 = no)
-EXISTS  거짓을 반환

image

image

image


NOT EXISTS

UPDATE sample551 SET a = '없음' WHERE
	NOT EXISTS (SELECT * FROM sample552 no2 = no);
Written on November 12, 2021