일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 정렬
- SQL
- db
- kmu
- 머신 러닝
- 프로그래머스
- 운영체제
- C++
- machine learning
- GIT
- 스택
- gan
- Seq2Seq
- instaloader
- LSTM
- googleapiclient
- PANDAS
- python3
- Python
- 파이썬
- 국민대
- 재귀
- Heap
- 국민대학교
- 데이터베이스
- Regression
- programmers
- OS
- Stack
- 회귀
- Today
- Total
정리 노트
SELECT문 WHERE절 본문
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;
'개념 정리 > 데이터베이스' 카테고리의 다른 글
집계 함수 (0) | 2024.06.25 |
---|---|
SQL 단일 행 내장 함수들 (0) | 2024.04.18 |
SELECT문 (2) | 2024.02.08 |
관계 데이터 연산 - 확장된 관계 연산자 (0) | 2023.11.07 |
관계 데이터 연산 - 순수 관계 연산자 (0) | 2023.10.20 |