MSSQL 서브 쿼리 EXISTS 작성 방법 예제

조건문에 추가로 검색 조건을 추가해야 하는 경우가 있습니다.

단순히 AND 조건이나 OR 조건이 아닌 서브 쿼리를 추가하고 싶은 경우도 있습니다.

서브 쿼리에서 사용하는 방법으로 EXISTS를 사용하기도 합니다.

EXISTSSELECT 문이나 UPDATE 처리를 할 때 유용하게 사용됩니다.

이번 내용에서는 EXISTS를 사용하여 SELECT 문에서 사용하는 방법을 보도록 하겠습니다.

SELECT 조건문에서 EXISTS를 사용하는 방법을 먼저 보겠습니다.

사용 방법을 보기 전에 테스트 테이블과 테이터를 먼저 만들겠습니다.

 

테이블 정보

STUDENT_GRADE ・・・학생 성적 테이블

STUDENT_INFO    ・・・학생 정보 테이블

 

학생 성적 테이블 작성 (STUDENT_GRADE)

-- 성적 테이블 작성
CREATE TABLE STUDENT_GRADE
(
	STUDENT_ID int NOT NULL,
	STUDENT_NAME nvarchar(20) NOT NULL,
	SCORE int NOT NULL,
	CONSTRAINT [PK_STUDENT_GRADE] PRIMARY KEY CLUSTERED
	(
		STUDENT_ID ASC
	)
) ON [PRIMARY]

 

학생 성적 데이터 작성

-- 학생 성적 데이터 입력
INSERT INTO STUDENT_GRADE (STUDENT_ID, STUDENT_NAME, SCORE) VALUES (1, N'이름 1', 391)
INSERT INTO STUDENT_GRADE (STUDENT_ID, STUDENT_NAME, SCORE) VALUES (2, N'이름 2', 489)
INSERT INTO STUDENT_GRADE (STUDENT_ID, STUDENT_NAME, SCORE) VALUES (3, N'이름 3', 437)
INSERT INTO STUDENT_GRADE (STUDENT_ID, STUDENT_NAME, SCORE) VALUES (4, N'이름 4', 339)
INSERT INTO STUDENT_GRADE (STUDENT_ID, STUDENT_NAME, SCORE) VALUES (5, N'이름 5', 493)
INSERT INTO STUDENT_GRADE (STUDENT_ID, STUDENT_NAME, SCORE) VALUES (6, N'이름 6', 361)
INSERT INTO STUDENT_GRADE (STUDENT_ID, STUDENT_NAME, SCORE) VALUES (7, N'이름 7', 470)
INSERT INTO STUDENT_GRADE (STUDENT_ID, STUDENT_NAME, SCORE) VALUES (8, N'이름 8', 456)
INSERT INTO STUDENT_GRADE (STUDENT_ID, STUDENT_NAME, SCORE) VALUES (9, N'이름 9', 417)
INSERT INTO STUDENT_GRADE (STUDENT_ID, STUDENT_NAME, SCORE) VALUES (10, N'이름 10', 391)

 

학생 정보 테이블 작성 (STUDENT_INFO)

-- 성적 테이블 작성
CREATE TABLE STUDENT_INFO
(
	STUDENT_ID int NOT NULL,
	STUDENT_CLASS nvarchar(10) NULL,

	CONSTRAINT [PK_STUDENT_GRADE] PRIMARY KEY CLUSTERED
	(
		STUDENT_ID ASC
	)
) ON [PRIMARY]

 

학생 정보 데이터 작성

-- 학생 성적 데이터 입력
INSERT INTO STUDENT_INFO (STUDENT_ID, STUDENT_CLASS) VALUES (1, N'이과')
INSERT INTO STUDENT_INFO (STUDENT_ID, STUDENT_CLASS) VALUES (2, N'예체')
INSERT INTO STUDENT_INFO (STUDENT_ID, STUDENT_CLASS) VALUES (3, N'문과')
INSERT INTO STUDENT_INFO (STUDENT_ID, STUDENT_CLASS) VALUES (4, N'이과')
INSERT INTO STUDENT_INFO (STUDENT_ID, STUDENT_CLASS) VALUES (5, N'예체')
INSERT INTO STUDENT_INFO (STUDENT_ID, STUDENT_CLASS) VALUES (6, N'문과')
INSERT INTO STUDENT_INFO (STUDENT_ID, STUDENT_CLASS) VALUES (7, N'이과')

 

 

EXISTS 사용 방법

기본적으로 EXISTSWHERE문 안에서 사용됩니다.

SELECT
	컬럼
FROM
	테이블 이름
WHERE EXISTS (
	SELECT 문
)

 

위에서 만든 테이블을 이용해 사용방법을 보도록 하겠습니다.

테스트용 테이블로 학생 성적 데이터가 저장된 테이블과 학생 정보 데이터가 저장된 테이블을 만들었습니다.

학생들중 이과 학생 성적만 취득 하도록 하겠습니다.

EXISTS 예제

SELECT
	*
FROM
	STUDENT_GRADE
WHERE EXISTS (
	SELECT
		*
	FROM
		STUDENT_INFO
	WHERE STUDENT_GRADE.STUDENT_ID = STUDENT_INFO.STUDENT_ID
		  AND STUDENT_INFO.STUDENT_CLASS = N'이과'
)

 

결과

 

이과 학생들 성적만 출력되고 있습니다.

예제에서 사용한 쿼리 내용을 보겠습니다.

STUDENT_GRADE.STUDENT_ID = STUDENT_INFO.STUDENT_ID

 

서브 쿼리에 작성한 WHERE에 검색 조건으로 사용된 부분입니다.

JOIN을 사용하거나 공부를 하셨다면 이미 알고 계실 겁니다.

[테이블명.컬럼명]을 의미합니다.

STUDENT_GRADE와 STUDENT_INFO 테이블에는 컬럼 STUDENT_ID가 기본키로 양쪽 테이블 모두 존재합니다.

두 테이블에 동일한 데이터가 있는지 조건을 설정해줘야 합니다.

그리고 STUDENT_ID 컬럼은 두 테이블 모두 컬럼 이름이 같기 때문에 컬럼 이름 앞에 테이블명도 지정해야 합니다.

만약 기본키로 조건을 지정하지 않으면 원하는 값을 취득할 수 없습니다.

 

기본키 없이 취득 예제

SELECT
	*
FROM
	STUDENT_GRADE
WHERE EXISTS (
	SELECT
		*
	FROM
		STUDENT_INFO
	WHERE STUDENT_INFO.STUDENT_CLASS = N'이과'
)

 

결과

 

클래스와 상관없이 모든 데이터가 출력되었습니다.

JOIN을 사용하는 것처럼 공통된 값을 가진 컬럼으로 묶어줘야 합니다.

AND STUDENT_INFO.STUDENT_CLASS = ‘이과’

 

두 테이블을 공통된 키로 연결하고 원하는 검색 조건을 설정합니다.

이과 학생들 성적만 출력하고 싶기 때문에 STUDENT_CLASS 컬럼에서 이과인 학생만 출력하도록 지정했습니다.

SELECT *

 

EXISTS 안에서 사용한 SELECT 문에서 *를 사용해 모든 항목을 취득하도록 하고 있습니다.

하지만 *이나 일부 컬럼을 설정해도 결과는 같습니다.

이유는 EXISTS 결과는 TRUE 또는 FALSE를 반환하기 때문입니다.

즉, SELECT 뒤에는 어떤 것을 설정하든 결과는 같습니다.

 

NOT EXISTS 사용 방법

이번에는 반대로 이과가 아닌 모든 학생을 취득하는 방법을 보겠습니다.

검색 조건에 STUDENT_CLASS 컬럼이 이과와 같지 않은 학생을 출력하도록 지정해도 되지만 NOT EXISTS를 사용 해서도 가능합니다.

NOT EXISTS 예제

SELECT
	*
FROM
	STUDENT_GRADE
WHERE NOT EXISTS (
	SELECT
		*
	FROM
		STUDENT_INFO
	WHERE STUDENT_GRADE.STUDENT_ID = STUDENT_INFO.STUDENT_ID
		  AND STUDENT_INFO.STUDENT_CLASS = N'이과'
)

 

결과

 

정리

EXISTS를 사용하여 서브 쿼리를 작성하는 방법을 알아봤습니다.

다른 테이블을 참조하여 검색해야 하는 경우 유용하게 사용됩니다.

EXISTS로 작성한 서브 쿼리는 대부분 JOIN 문으로도 작성 가능하지만, 데이터를 취득하지 않고 존재 여부만 확인하는 경우에는 EXISTS만으로도 심플하게 작성할 수 있습니다.

댓글