정리 노트

SELECT문 WHERE절 본문

개념 정리/데이터베이스

SELECT문 WHERE절

꿈만 꾸는 학부생 2024. 2. 28. 20:24
728x90

DML 문을 연습할 데이터 베이스는 아래의 사이트에서 스크립트를 다운로드하여 실행해 생성했습니다.

 

MySQL Sample Database

This page provides you with a MySQL sample database that helps you to practice with MySQL effectively and quickly.

www.mysqltutorial.org


WHERE 절

WHERE 절에서는 tuple 조건 식을 사용해 조건에 맞는 tuple만 선택합니다. 하지만 조건 식에서 집단 함수를 사용할 수 없습니다.(ex. SUM, AVG, MIN, MAX, ...)

WHERE절 없이 SQL 문을 실행하면 모든 tuple을 반환합니다(Full Table Scan: FTS). 이는 시스템에 큰 부담을 주기 때문에 SQL tuning의 1차적 검토 대상입니다.

WHERE 절에서 사용하는 연산자의 종류는 아래와 같습니다.

  • 비교 연산자(>, >=, <, <=, =, <>(같지 않음))
  • SQL 연산자((NOT) BETWEEN a AND b, (NOT) IN (list), (NOT) LIKE (string), IS (NOT) NULL)
  • 논리 연산자(() > NOT > AND > OR 순서로 처리)

이 중 SQL 연산자들에 좀 더 집중해서 살펴보겠습니다.

[NOT] IN (list)

IN 연산자를 사용하면 SQL 문장 길이를 줄일 수 있고, 성능 측면에도 장점을 가지고 있습니다.

예를 들어, products 테이블의 productScale 열에서 scale이 '1:10' 또는 '1:12'인 행을 가져오는 SQL을 아래와 같이 작성할 수 있습니다.

// IN 사용 안 한 경우
SELECT * FROM products WHERE productScale = '1:10' OR productScale = '1:12';

// IN 사용한 경우
SELECT * FROM products WHERE productScale IN ('1:10', '1:12');

두 SQL 문의 결과는 동일합니다. 하지만 두 번째 SQL의 길이가 짧고 성능 측면에 장점을 가지고 있기 때문에 IN 연산자를 사용하기를 권장하고 있습니다.

IN 연산자에서 여러 속성의 조합으로도 표현할 수 있습니다.

// IN 연산자 미사용
SELECT * FROM products WHERE (productLine = 'Motorcycles' AND productScale = '1:10') OR (productLine = 'Classic Cars' AND productScale = '1:12');

// IN 연산자 사용
SELECT * FROM products WHERE (productLine, productScale) IN (('Motorcycles', '1:10'), ('Classic Cars', '1:12'));

위 SQL은 아래 조건들 중 하나 이상을 만족하는 행들을 반환합니다.

  • productLine이 'Motorcycles'이고 productScale이 '1:10'
  • productLine이 'Classic Cars'이고 productScale이 '1:12'

[NOT] LIKE

LIKE 연산자로 문자열 패턴 매치를 진행할 수 있습니다. 이 연산자에서도 와일드 카드를 사용할 수 있습니다.

  • %: 0개 이상의 임의 문자열
  • _: 1개 단일 문자

예를 들어, products 테이블의 productCode 열에서 'S10'으로 시작하는 값을 가진 행을 가져오는 SQL을 아래와 같이 작성할 수 있습니다.

SELECT * FROM products WHERE productCode LIKE 'S10%';

이번에는 payments 테이블의 checkNumber 열에서 'HQ33633' 뒤에 아무 문자 하나만 오는 값을 가진 행을 가져오는 SQL을 아래와 같이 작성할 수 있습니다.

SELECT * FROM payments WHERE checkNumber LIKE 'HQ33633_';

[NOT] BETWEEN a AND b

BETWEEN 연산자를 통해 a와 b 사이의 값을 가진 행들을 탐색할 수 있습니다.

예를 들어, payments 테이블의 amount 열에서 6000과 10000 사이의 값을 가진 행을 가져오는 SQL을 아래와 같이 작성할 수 있습니다.

SELECT * FROM payments WHERE amount BETWEEN 6000 AND 10000;

IS [NOT] NULL

NULL은 아무 값도 없는 것을 의미하기 때문에 어떤 값과도 비교를 할 수 없습니다. 만약 숫자와 NULL값 사이의 계산을 진행하면 NULL을 반환하고, 어떤 열의 값을 NULL값과 비교하면 항상 FALSE를 반환합니다.

에러가 일어나지 않기 때문에 놓칠 수 있는 부분이라 주의해야 합니다.

 

따라서 열의 값이 NULL인 행을 찾을 때 IS NULL 연산자를 사용합니다.

예를 들어, customers 테이블에서 addressLine2 열의 값이 NULL인 행을 가져오는 SQL을 아래와 같이 작성할 수 있습니다.

SELECT * FROM customers WHERE addressLine2 IS NULL;
728x90

'개념 정리 > 데이터베이스' 카테고리의 다른 글

집계 함수  (0) 2024.06.25
SQL 단일 행 내장 함수들  (0) 2024.04.18
SELECT문  (2) 2024.02.08
관계 데이터 연산 - 확장된 관계 연산자  (0) 2023.11.07
관계 데이터 연산 - 순수 관계 연산자  (0) 2023.10.20