관리 메뉴

Bull

[SQL] 서브 쿼리 본문

DataBase/SQL

[SQL] 서브 쿼리

Bull_ 2024. 8. 27. 02:14

서브쿼리(Subquery)는 다른 SQL 쿼리문 내에 포함되는 쿼리문을 말한다. 데이터베이스에서 데이터를 선택, 삽입, 수정, 삭제하는 데 사용되며, 주로 복잡한 데이터 추출 요구를 충족시키기 위해 사용된다. 서브쿼리는 메인 쿼리의 WHERE 절, SELECT 절, FROM 절 등에 위치할 수 있다.

 

  1. 단일 행 서브쿼리: 결과로 단일 행을 반환한다. 이 서브쿼리는 일반적으로 연산자와 함께 사용되며, 예를 들어 =<> 같은 비교 연산자를 사용할 때 사용된다.
  2. 다중 행 서브쿼리: 결과로 여러 행을 반환한다. 이 경우에는 IN, ANY, ALL과 같은 연산자를 사용해야 한다. 예를 들어, 주어진 목록 중 하나와 일치하는 모든 레코드를 찾을 때 IN을 사용할 수 있다.
  3. 상호 연관 서브쿼리: 메인 쿼리의 결과에 따라 실행 결과가 달라지는 서브쿼리다. 이들은 보통 메인 쿼리의 컬럼을 참조하며, 각 행에 대해 다시 계산이 이루어진다.

단일 서브쿼리와 다중 행 서브 쿼리를 실습해보겠다.

-- 학생 테이블 생성
CREATE TABLE 학생 (
    학번 INT PRIMARY KEY,
    이름 VARCHAR(50),
    성적 INT
);

-- 학생 테이블에 데이터 삽입
INSERT INTO 학생 (학번, 이름, 성적) VALUES (1, '김학생', 85);
INSERT INTO 학생 (학번, 이름, 성적) VALUES (2, '이학생', 92);
INSERT INTO 학생 (학번, 이름, 성적) VALUES (3, '박학생', 78);
INSERT INTO 학생 (학번, 이름, 성적) VALUES (4, '최학생', 95);

-- 서브쿼리를 사용하여 최고 성적을 받은 학생의 이름 조회
SELECT 이름 
FROM 학생 
WHERE 성적 = (SELECT MAX(성적) FROM 학생);

-- 서브쿼리를 사용하여 90점 이상의 성적을 받은 학생들의 학번을 조회하고, 그 학번에 해당하는 이름을 조회
SELECT 이름 
FROM 학생 
WHERE 학번 IN (SELECT 학번 FROM 학생 WHERE 성적 >= 90);

첫 번째 단일 서브쿼리 예제는 학생 중에 MAX 성적인 95를 가져오고 다시 메인 쿼리에서 그 95인 성적인 이름을 가져오는 것이다.

두 번째 다중 서브쿼리 예제는 학생 중에  90 이상인 학생을 가져온다. 그러면 [이학생,최학생]의 학번이 불러와지는데, 이 조건의 학번의 이름을 다시 메인쿼리에서 가져오는 것이다. 단일 서브쿼리와 차이점은 WHERE 조건에 조건의 개수가 여러 개라는 것이다. 말이 좀 이상하긴한데 직관적으로 보자면 그렇다. 그 조건에 포함된 것을 가져오는 것을 IN이라 칭하여 가져올 수 있다.