본문 바로가기
SQL

SELECT문 & WHERE문

by Notorious Coder 2023. 8. 1.

데이터라는 말은 많이 들어봤을 것이다. 데이터는 쉽게 말해 '자료'라고 생각하면 된다. 그 '자료'를 왕창 모아놓은 것이 '데이터베이스(DB)'이고 그 데이터베이스를 관리하는 친구가 '데이터베이스 관리 시스템(DBMS)'라는 친구이다. 데이터베이스를 배우는 목적은 데이터를 보다 효율적으로 관리하고 필요한 데이터를 쉽고 빠르게 얻어내기 위해서이다. 여기서 우리는 데이터베이스를 관리하기 위해 소통할 언어가 필요한데 그것이 바로 'SQL'이다. 이 SQL을 다루는 것에 능숙해질수록 다양한 곳에 다양한 형태로 저장된 데이터를 직접 추출, 조회하고 그 데이터를 분석할 수 있는 것이다. 

 

 

※마이크로소프트 SQL Server 사용, 'Do it! SQL입문'에서 제공하는 데이터베이스를 사용하였습니다.

 

 

이제 바로 SQL의 기본 문법에 대해 알아보자. 첫 번째로 SELECT 문은 데이터를 검색하는 구문으로 다양한 옵션들과 함께 사용이 가능하다. 일단 SELECT문의 기본 형식을 들여다보자.

 

SELECT
	<col> --테이블에서 조회하고 싶은 데이터 필드
FROM [table] --우리가 관심있는 데이터가 저장되어 있는 테이블 이름
WHERE <col> = [value]
ORDER BY [col]

 

 

 

일단 한눈에 봐도 대충 무슨 말인지 감이 올 것이다. 이제 구체적으로 실제 데이터를 조회해 보자. 

 

 

select
	symbol, company_name 
from nasdaq_company

 

 

이 코드를 보면, "nasdaq_company라는 이름의 테이블에서 symbol과 company_name열을 조회해 줘."라는 뜻이다. 아래는 조회된 데이터 결과들이다. 보는 것과 같이 우리가 요구한 symbol열과 company_name열이 조회된 것을 볼 수 있다. 어느 특정 열 하나를 조회할 수도 있지만, 이처럼 여러 개를 검색할 때에는 쉼표(,)로 구분해 주는 것을 잊지 말자. 

 

 

 

 

또한, 아래와 같이 별표(*)를 이용하여 전체 열을 검색할 수도 있다. 하지만 전체 열을 검색하는 것은 CPU나 네트워크에 많은 부담을 줄 수 있으므로 필요한 열만 검색하는 것이 바람직하다.

 

 

select 
	*
from nasdaq_company

 

 

 

추가로 SQL Server는 테이블의 열 정보를 제공하는 함수도 있다. 다음 코드로 nasdaq_company 테이블에 어떠한 열들이 있는지 확인해 보자.

 

 

EXEC sp_columns @table_name = N'nasdaq_company', @table_owner = N'dbo';

 

 

 

 

다음은 WHERE 문을 이용하여 필요한 데이터만 조회해 보자. 예를 들어, 모든 정보가 필요한 것이 아니고 '애플'이라는 기업만 조회하고 싶을 때 다음과 같이 표현하면 된다.

 

 

select 
	*
from nasdaq_company
where symbol = 'AAPL'

 

원하는 조건에 맞게 행을 검색하면 앞에서 말한 문제인 시스템의 부하를 줄일 수 있다.

 

 

 

where symbol = 'AAPL'에서 ' = ' 연산자는 필터링과 일치하는 값을 검색한다는 뜻이다. 이외에 SQL Server에는 다양한 연산자들이 존재한다. 정리해 보자면 아래와 같다. 

 

 

연산자 의미
< 필터링 조건보다 작은 값을 검색
> 필터링 조건보다 큰 값을 검색
<= 필터링 조건보다 작거나 같은 값을 검색
>= 필터링 조건보다 크거나 같은 값을 검색
<>, != 필터링 조건과 같지 않은 값을 검색
!< 필터링 조건보다 작지 않은 값을 검색
!> 필터링 조건보다 크기 않은 값을 검색

 

 

 

비교 연산자와 더불어 조건의 참과 거짓을 판별하는 논리 연산자라는 것도 있다. 개념만 보면 전혀 와닿지 않지만 실제로 구문에 적용해 보면 직관적으로 알 수 있으니 가볍게 보고 넘어가자. 

 

 

 

연산자 의미
ALL 모든 비교 집합이 참이면 참
AND 두 부울 표현식이 모두 참이면 참
ANY 비교 집합 중 하나라도 참이면 참
BETWEEN 피연산자가 범위 내에 있으면 참
EXISTS 하위 쿼리에 행이 포함되면 참
IN 피연산자가 리스트 중 하나라도 포함되면 참
LIKE 피연산자가 패턴과 일치하면 참
NOT 부울 연산자를 반대로 실행
OR 하나의 부울식이 참이면 참
SOME 비교 집합 중 일부가 참이면 참

 

 

--ex) nasdaq_company 테이블에서 symbol열의 a~b 범위의 값을 검색
select 
	*
from nasdaq_company
where symbol between 'a' and 'b'

 

--ex) 테이블에서 symbol이 AAPL, MSFT, AMZN인 것 검색
select 
	*
from nasdaq_company
where symbol = 'AAPL'
	or symbol = 'MSFT'
	or symbol = 'AMZN'

 

 

 

만약 두 번째 코드와 같이 OR가 여러 번 반복된다면 IN을 사용하여도 무방하다. 아래의 코드는 방금의 코드와 정확히 같은 작업을 수행한다. 

 

 

select 
	*
from nasdaq_company
where symbol in (
'AAPL', 'MSFT', 'TSLA'
)

 

 

다음으로 sector가 'Technology' 또는 'Consumer Services'이면서 symbol이 'MSFT', 'NVDA', 'WMT'인 데이터를 검색해 보자. 

 

 

select 
	*
from nasdaq_company
where sector = 'Technology' or 
sector = 'Consumer Services' and symbol in (
'MSFT', 'NVDA', 'WMT'
)

 

 

위의 코드로는 안타깝게도 우리가 원하는 결과를 얻을 수 없다. 왜냐하면 논리 연산자의 우선순위 문제 때문이다. 위 코드의 의미는 nasdaq_company 테이블에서 sector가 Technology인 데이터와 sector가 Consumer Services이면서 symbol이 MSFT, NVDA, WMT 인 데이터를 검색하라는 의미이다. 따라서 원하는 결과를 얻기 위해서는 아래와 같이 괄호를 사용하여 조건을 수정해야 한다. 

 

 

select 
	*
from nasdaq_company
where (sector = 'Technology' or 
sector = 'Consumer Services') and symbol in (
'MSFT', 'NVDA', 'WMT'
)


--아예 IN으로 묶어서 표현할 수도 있다.
select
	*
from nasdaq_company
where sector in ('Technology', 'Consumer Services')
and symbol in ('MSFT', 'NVDA', 'WMT')

 

 

마지막으로, 데이터를 검색하다가 중간중간에 NULL이라는 것을 봤을 것이다. 이는 데이터가 존재하지 않는 상태를 말한다. 그렇다면 NULL도 예를 들어, WHERE sector = null처럼 필터링하면 될 것 같은 생각이 들지만 아쉽게도 null은 일반적인 연산자로 해석할 수 없다. 따라서 IS NULL 혹은 IS NOT NULL을 사용해야 한다. 

 

 

--ex) sector 데이터 값이 null이 아닌 데이터 검색
select 
	*
from nasdaq_company
where sector IS NOT NULL

 

 

 

 

SQL에 관한 내용은 '이지스 퍼블리싱'의 'Do it! SQL 입문'이라는 책을 참고하여 정리하였습니다.

'SQL' 카테고리의 다른 글

데이터 그룹화  (0) 2023.08.06
ORDER BY 문 & 와일드 카드  (0) 2023.08.01