CS/데이타베이스

[SQL] SubQuery 중첩질의문

코딩하는 포메라니안 2022. 3. 16. 17:56

1. SubQuery란?

- Query문 안에 또 다른 Query문이 있는 것

- 중첩될 수 있는 Query문은 Select문만 가능하므로 SubSelect라 부르기도 함

- 소괄호 안에 표기

 

 

 

2. SubQuery 활용

1. 검색

1) 단일 값을 반환하는 경우

/* 학생 김철수와 같은 학과에 속하는 학생의 성명을 검색하라*/
SELECT 성명
FROM 학생
WHERE 학과 = (SELECT 학과 FROM 학생 WHERE 성명 = '김철수');
/*괄호에서 반환되는 결과는 '컴퓨터' 단일 값임*/

 

2) 2개 이상의 값을 반환하는 경우(1) - 1개의 열로 이루어진 테이블을 반환

- 외부 질의문의 WHERE절에 (NOT) IN, ANY, ALL, EXISTS와 같은 연산자가 사용됨

연산자 설명
IN '=ANY'와 같은 의미
NOT IN '<>ALL'과 같은 의미
ALL 왼쪽 애트리뷰트 값이 오른쪽 값을 모두 만족해야 되는 AND의 의미
ANY 하나 이상 만족해도 되는 OR의 의미
EXISTS 중첩질의문 결과에 해당 레코드와 동일한 레코드가 하나 이상 있으면 선택

*<> = 다르다

 

/*과목코드 ‘CO123’을 수강한 학생의 성명을 검색하라*/
SELECT 성명
FROM 학생
WHERE 학번 IN (SELECT 학번 FROM 수강 WHERE 과목코드 = 'CO123');

/*수강 테이블에서 학번 20181234의 점수보다 좋은 점수를 받은 학생의 학번과 과목코드를 검색하라*/
SELECT 학번, 과목코드
FROM 수강
WHERE 점수 > ALL (SELECT 점수 FROM 수강 WHERE 학번 = 20181234);

 

 

3) 2개 이상의 값을 반환하는 경우(2) -  2개 이상의 열로 이루어진 테이블을 반환

/*과목 ‘CO123’에 수강한 학생의 성명을 검색하라*/
SELECT 성명
FROM 학생
WHERE EXISTS (SELECT * FROM 수강 WHERE 수강.학번 = 학생.학번 AND 과목코드 = 'CO123');

 

 

2. 삭제

/*과목 CO123의 점수가 85점 이상인 ‘컴퓨터’과 학생을 수강테이블에서 삭제하라*/
DELETE FROM 수강
WHERE 과목코드 = 'CO123' AND 점수 >= 85 
AND 수강.학번 IN (SELECT 학번 FROM 학생 WHERE 학과 = '컴퓨터');

 

 

3. 갱신

/*‘컴퓨터’과 학생의 점수를 2점씩 증가시켜라*/
UPDATE 수강
SET 점수 = 점수 + 2
WHERE 학번 IN (SELECT 학번 FROM 학생 WHERE 학과 = '컴퓨터');

 

'CS > 데이타베이스' 카테고리의 다른 글

[MySQL] Error Code: 1175. Safe Update Mode  (0) 2022.03.17
[SQL] 조인  (0) 2022.03.16
[SQL] 데이터 조작어(DML) 활용  (0) 2022.03.16
[SQL] 데이터 정의어(DDL) 활용  (0) 2022.03.16
[실습] 트리거  (0) 2021.12.15