Database - SQL 심화

Verba volant, scripta manent·2021년 4월 10일

CASE

SQL 에서도 프로그래밍 언어의 if 문과 같은 기능을 사용할 수 있다.

CASE 를 사용하게 되면 정해진 조건에 따라 다르게 결과를 받을 수 있다.

ex)

SELECT CASE
			WHEN CustomerId <= 25 THEN 'GROUP 1'
			WHEN CustomerId <= 50 THEN 'GROUP 2'
			ELSE 'GROUP 3'
		END
	FROM customers

위 쿼리문은 CustomerId 필드값에 따라 'GROUP 1', 'GROUP 2', 'GROUP 3' 으로 나누게 된다.
따라서 25 이하인 경우에는 'GROUP 1', 26부터 50 사이인 경우에는 'GROUP 2', 51 이상은 'GROUP 3' 으로 분류가 된다.

SUBQUERY

쿼리문을 작성할 때 다른 쿼리문을 포함하는 것.
실행되는 쿼리에 중첩으로 위치해 정보를 전달하며 소괄호로 감싸져 있다.

서브쿼리의 결과는 개별값들이나 레코드 리스트를 돌려줄 수 있으며 하나의 칼럼으로 활용할 수 있다.

ex)

SELECT CustomerId, CustomerId = (SELECT CustomerId FROM customers WHERE CustomerId = 2)
FROM customers
WHERE CustomerId < 6

IN, NOT IN

IN 은 특정한 값들이 서브쿼리에 있는지 확인할 수 있다.

ex)

SELECT *
FROM customers
WHERE CustomerId IN (SELECT CustomerId FROM customers WHERE CustomerId < 10)

customers 테이블에서 'CustomerId' 의 값이 서브쿼리에서 돌려받는 값에 속한 결과들만 조회하고 있다.
서브쿼리에서는 'CustomerId' 가 10 이하인 데이터를 돌려주기 때문에 최종 조회된 데이터 또한 'CustomerId' 가 10 이하인 경우가 된다.

만약에 NOT IN 을 사용하게 된다면 서브쿼리에서 조회된 10 미만을 제외한 레코드를 조회하게 된다.

EXISTS

EXISTS 혹은 NOT EXISTS 와 같은 경우에는 돌려받은 서브쿼리의 존재하는 레코드를 확인한다.

만약에 조회된 레코드가 존재한다면 참을, 아닌 경우에는 거짓을 리턴한다.

따라서 아래와 같이 작성할 수 있다.

SELECT EmployeeId
FROM employees e
WHERE EXISTS (
	SELECT 1
	FROM customers c
	WHERE c.SupportRepId = e.EmployeeId
	)
ORDER BY EmployeeId

employees 테이블에서부터 'EmployeeId' 필드를 조회한다.
이 때 서브쿼리로 customers 테이블의 'SupportRepId' 필드값과 employees 테이블의 'EmployeeId' 필드값을 비교해 일치하는 레코드들을 가져온다.

FROM

서브쿼리를 FROM 에도 사용할 수가 있다.

ex)

SELECT *
FROM (
	SELECT CustomerId
	FROM customers
	WHERE CustomerId < 10
	)
profile
말은 사라지지만 기록은 남는다

0개의 댓글