[SQL] 서브쿼리

아임펭·2024년 5월 20일

SQL

목록 보기
9/9

1. 서브쿼리

서브쿼리는 쿼리문 안에 또 다른 쿼리문이 중첩된 형태입니다. 단발적인 질문이 아닌 '복합적이고 단계적인 질문을 할 때는 여러 개의 쿼리를 중첩해서 사용'할 때 서브쿼리를 사용합니다.

단일행 : 하나의 값만 리턴(열 1개) / 하나의 행에 하나의 열만 나오는 결과
다중행 : 여러 개의 행을 리턴(열 1개) / 여러 개의 행과 하나의 열만 나오는 결과
다중행열 : 여러 개의 열로 구성된 여러 개의 행인 테이블을 리턴, 외부 쿼리와의 관계에 따라 독립 서브쿼리와 연관 서브쿼리로도 구분

1) 단일행

(1) 단일행 서브쿼리

두 가지 문장을 합친 형태의 서브쿼리입니다.
단일 값이므로 조건절에서 =, <, > 등의 비교 연산자와 함께 사용이 가능합니다.
(비교연산자는 필드 값과 비교하기 때문에 '우변이 반드시 하나의 확정된 값'이어야 합니다)

SELECT name FROM tcity WHERE popu = (SELECT MAX (popu) FROM tcity);

✔ ( )를 통해 묶어주며, ( ) 문장을 우선 실행합니다.

(2) 서브쿼리 중첩

서브쿼리는 독립적인 하나의 명령이기 때문에 외부쿼리와는 다른 테이블을 읽을 수도 있습니다.
순차적으로 실행되므로 두 쿼리문의 FROM 절에 각각 다른 테이블을 지정해도 상관없습니다.

SELECT age FROM tmember
		   WHERE member = (SELECT member FROM torder
           WHERE item = (SELECT item FROM titem WHERE price = 7000));

서브쿼리 안에 ...WHERE (...WHERE (...))으로 중첩해서 사용이 가능합니다.

✔ 가장 안쪽에 있는 (...)부터 순서대로 실행하여 최종적으로 원하는 값을 구해 출력합니다.
✔ 조회된 값이 없는 경우에는 결과셋이 없고, 중복된 값이 조회되면 에러가 뜹니다.
→ 중복된 값에서 1개만 받으려면 TOP 1(LIMIT 1)을 넣어 첫 번째 값을 찾으면 됩니다.

📌 단일행 결과 값이 2개 이상 나올 시 에러발생
해결 1. LIMIT 1을 사용해 첫 번째 값만 불러오기

SELECT price FROM titem 
			 WHERE item = 
             (SELECT item FROM torder 
             WHERE MEMBER = '향단' ORDER BY item LIMIT 0,1);

해결 2. IN을 사용해 값을 호출하기

SELECT item, price FROM titem 
				   WHERE item IN 
                   (SELECT item FROM torder 
                   WHERE MEMBER = '향단');

2) 다중행 / 다중열

(1) 다중행 서브쿼리

여러 개의 결과를 리턴하는 것으로, 단일 값이 아닌 목록을 리턴하기 때문에 값끼지 비교하는 비교연산자를 함께 사용할 수 없습니다.

SELECT item, price FROM titem 
				   WHERE item IN 
                   (SELECT item FROM torder 
                    WHERE MEMBER = '향단'); 

(2) 다중열 서브쿼리

결과셋의 칼럼이 여러 개이며, 한꺼번에 여러 값과 비교가 가능합니다.

SELECT * FROM tstaff 
		 WHERE (depart, gender) = 
         (SELECT depart, gender FROM tstaff 
         WHERE NAME = '홍길동');

✔ 단일행이면서 다중열인 경우 : = 으로 비교 가능

SELECT * FROM tstaff 
		 WHERE (depart, salary) IN 
         (SELECT depart, MAX(salary) FROM tstaff 
         GROUP BY depart);

✔ 다중행이면서 다중행인 경우 : IN 으로 비교 가능

profile
I'm peng

0개의 댓글