# Coding/SQL

MySQL 기본 문법 - WHERE 절과 필터링

hxodoo.cookie 2024. 1. 3. 00:23

데이터베이스 쿼리의 핵심 부분 중 하나는 WHERE 절입니다. WHERE 절은 데이터를 필터링하고 원하는 조건에 맞는 행만 선택하는 데 사용됩니다. 이 글에서는 MySQL의 WHERE 절과 필터링에 대해 자세히 알아보겠습니다.

 

 

 

 

MySQL WHERE 절과 필터링

 

 

 

 

MySQL 데이터 필터링의 필요성

 

데이터가 많아짐에 따라 그 데이터에서 원하는 정보를 추출하고 특정 조건에 부합하는 데이터를 찾는 것이 중요해졌습니다. 여기에서 MySQL의 WHERE 절이 등장하며, 데이터 필터링은 아래와 같이 다양한 측면에서 핵심 역할을 수행합니다.

 

 

1.  정확한 정보 검색
데이터베이스에 저장된 방대한 양의 정보 중에서 특정 조건을 만족하는 데이터를 찾는 것은 중요합니다. WHERE 절을 사용하여 정확한 정보를 검색함으로써 의사 결정에 필요한 정확한 데이터를 얻을 수 있습니다.


2. 데이터 일관성 유지
데이터베이스에 저장된 정보는 다양한 상황에서 사용됩니다. 필터링을 통해 특정 기준을 충족하는 데이터를 가져와 활용함으로써 데이터 일관성을 유지할 수 있습니다.


3. 효율적인 자원 활용
데이터베이스는 많은 자원을 사용하는데, 불필요한 데이터까지 모두 가져오면 자원 낭비가 발생할 수 있습니다. WHERE 절을 사용하여 필요한 데이터만 가져오면 데이터베이스와 시스템 자원을 효율적으로 활용할 수 있습니다.


4. 보안 강화
WHERE 절은 데이터베이스에서 민감한 정보를 보호하는 데에도 중요한 역할을 합니다. 특정 권한이 없는 사용자에게 필요한 데이터만을 제공함으로써 보안을 강화할 수 있습니다.

 

 

 

 

 


WHERE 절의 기본 구문

WHERE 절은 SELECT 문의 일부로 사용되며, 조건을 지정하여 그 조건을 만족하는 행만을 검색합니다. 기본적인 WHERE 절의 구문은 다음과 같습니다.

 

 

SELECT * FROM 테이블명 WHERE 조건;

 

 

여기서 테이블명은 데이터를 조회할 테이블의 이름이고, 조건은 선택할 행을 결정하는 조건입니다. 예를 들어, "employees" 테이블에서 급여가 50000 이상인 행을 선택하고 싶다면 다음과 같은 쿼리를 작성할 수 있습니다.

 

 

 

SELECT * FROM employees WHERE salary >= 50000;

 

 

이렇게 하면 급여가 50000 이상인 모든 직원의 정보를 가져올 수 있습니다.

 

 

 

 

WHERE 절의 중첩

WHERE 절은 중첩하여 사용할 수 있습니다. 이를 통해 복잡한 조건을 효과적으로 다룰 수 있습니다.

 

 

SELECT * FROM products
WHERE (category = 'Electronics' OR category = 'Appliances')
AND price > 100;

 

 

이렇게 하면 Electronics 또는 Appliances 카테고리에 속하면서 가격이 100보다 높은 제품을 선택합니다.

 

 

 

 


비교 연산자 활용

비교 연산자는 WHERE 절에서 주로 활용되며, 등호(=), 부등호(<, >), 그리고 BETWEEN 연산자는 다양한 조건을 지정하여 데이터를 검색하는 데에 사용됩니다. 

 

 

 

1. 등호(=): 값 일치 조건

 

등호 연산자는 특정 값과 정확히 일치하는 행을 선택하는 데에 사용됩니다. 이는 데이터베이스에서 특정 값에 대한 정확한 일치 검색에 활용됩니다.

 

예를 들어, "products" 테이블에서 카테고리가 'Electronics'인 제품을 찾고자 한다면 다음과 같은 쿼리를 사용할 수 있습니다.

 

 

SELECT * FROM products WHERE category = 'Electronics';

 

 

이렇게 하면 'Electronics' 카테고리에 속하는 제품들만을 선택할 수 있습니다.

 

 

 

 

2. 부등호(<, >): 값 비교 조건

 

부등호 연산자는 특정 값보다 작거나 큰 행을 선택하는 데에 사용됩니다. 이를 통해 데이터베이스에서 특정 기준보다 낮거나 높은 값을 가진 행들을 선택할 수 있습니다.

 

예를 들어, "orders" 테이블에서 주문 금액이 1000보다 큰 주문을 찾고자 한다면 다음과 같은 쿼리를 사용할 수 있습니다.

 

 

SELECT * FROM orders WHERE total_amount > 1000;

 

 

이렇게 하면 주문 금액이 1000보다 큰 주문들만을 선택할 수 있습니다.

 

 

 

 

3. BETWEEN: 값 범위 조건

 

BETWEEN 연산자는 특정 범위 내의 값에 해당하는 행을 선택하는 데에 사용됩니다. 이를 통해 데이터베이스에서 특정 범위의 값을 가진 행들을 효과적으로 검색할 수 있습니다.

 

예를 들어, "sales" 테이블에서 특정 기간의 판매 내역을 찾고자 한다면 다음과 같은 쿼리를 사용할 수 있습니다.

 

 

SELECT * FROM sales WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31';

 

 

이렇게 하면 '2023-01-01'부터 '2023-12-31'까지의 주문 내역을 선택할 수 있습니다.

 

 

 

 

4. 비교 연산자의 조합 활용

 

비교 연산자는 필요에 따라 조합하여 사용할 수 있습니다. 예를 들어, "products" 테이블에서 가격이 100보다 크면서 카테고리가 'Electronics'인 제품을 찾고자 한다면 다음과 같은 쿼리를 작성할 수 있습니다.

 

 

SELECT * FROM products WHERE price > 100 AND category = 'Electronics';

 

 

이렇게 하면 가격이 100보다 크면서 'Electronics' 카테고리에 속하는 제품들을 선택할 수 있습니다. 이처럼 비교 연산자를 조합하여 보다 복잡한 조건을 표현할 수 있습니다.

 

 

 

 


논리 연산자 활용

논리 연산자인 AND, OR, NOT은 여러 조건을 결합하거나 부정하여 더 복잡한 조건을 표현하는 데에 사용됩니다.

 

 

 

1. AND 연산자: 여러 조건의 동시 충족

 

AND 연산자는 여러 개의 조건이 동시에 충족되어야 행이 선택되는 데에 사용됩니다. 즉, 모든 조건이 참일 때 해당 행이 선택됩니다.

 

예를 들어, "customers" 테이블에서 나이가 30세 이상이면서 도시가 'New York'인 고객을 찾고자 한다면 다음과 같은 쿼리를 작성할 수 있습니다.

 

 

SELECT * FROM customers WHERE age >= 30 AND city = 'New York';

 

 

이렇게 하면 나이가 30세 이상이면서 도시가 'New York'인 고객들만을 선택할 수 있습니다.

 

 

 

 

2. OR 연산자: 여러 조건 중 하나만 충족

 

OR 연산자는 여러 개의 조건 중 하나만 충족되어도 행이 선택되는 데에 사용됩니다. 최소한 하나의 조건이 참이면 해당 행이 선택됩니다.

 

예를 들어, "orders" 테이블에서 주문 상태가 'shipped'이거나 주문 금액이 1000 이상인 주문을 찾고자 한다면 다음과 같은 쿼리를 작성할 수 있습니다.

 

 

SELECT * FROM orders WHERE status = 'shipped' OR total_amount >= 1000;

 

 

이렇게 하면 주문 상태가 'shipped'인 주문이거나 주문 금액이 1000 이상인 주문들을 선택할 수 있습니다.

 

 

 

 

3. NOT 연산자: 조건 부정

 

NOT 연산자는 조건을 부정하여 해당 조건을 만족하지 않는 행을 선택하는 데에 사용됩니다.

 

예를 들어, "employees" 테이블에서 부서가 'HR'이 아닌 직원을 찾고자 한다면 다음과 같은 쿼리를 작성할 수 있습니다.

 

 

SELECT * FROM employees WHERE NOT department = 'HR';

 

 

이렇게 하면 부서가 'HR'이 아닌 모든 직원들을 선택할 수 있습니다.

 

 

 

 

4. 논리 연산자의 조합 활용

 

논리 연산자는 필요에 따라 조합하여 사용할 수 있습니다. 예를 들어, "products" 테이블에서 가격이 100보다 크면서 카테고리가 'Electronics'이거나 'Appliances'인 제품을 찾고자 한다면 다음과 같은 쿼리를 작성할 수 있습니다.

 

 

SELECT * FROM products WHERE price > 100 AND (category = 'Electronics' OR category = 'Appliances');

 

 

이렇게 하면 가격이 100보다 크면서 'Electronics' 또는 'Appliances' 카테고리에 속하는 제품들을 선택할 수 있습니다.

 

 

 

 


패턴 매칭: LIKE 연산자와 와일드카드 활용

LIKE 연산자는 와일드카드 '%'와 '_'를 사용한 문자열의 패턴 매칭을 통해 데이터를 검색하는 데에 사용됩니다. 

 

 

 

1. LIKE 연산자: 문자열 패턴 매칭

 

LIKE 연산자는 문자열을 비교하여 특정 패턴을 가진 행을 선택하는 데에 사용됩니다. 이는 특정 문자나 문자열을 포함하거나 특정 패턴을 가진 데이터를 검색할 때 유용합니다.

 

예를 들어, "products" 테이블에서 제품명에 'Laptop'이 포함된 제품을 찾고자 한다면 다음과 같은 쿼리를 작성할 수 있습니다.

 

 

SELECT * FROM products WHERE product_name LIKE 'Laptop';

 

 

이렇게 하면 제품명이 'Laptop'과 정확히 일치하는 제품들이 선택됩니다.

 

 

 

 

2. 와일드카드 '%' (퍼센트): 임의의 문자열을 나타냄

 

와일드카드 '%'는 임의의 문자열을 나타냅니다. 이를 사용하여 특정 패턴에 일치하는 문자열을 검색할 수 있습니다.

 

예를 들어, "customers" 테이블에서 성이 'Smith'로 시작하는 고객을 찾고자 한다면 다음과 같은 쿼리를 작성할 수 있습니다.

 

 

SELECT * FROM customers WHERE last_name LIKE 'Smith%';

 

 

이렇게 하면 성이 'Smith'로 시작하는 모든 고객들이 선택됩니다.

 

 

 

 

3. 와일드카드 '_' (언더스코어): 임의의 한 문자를 나타냄

 

와일드카드 '_'는 임의의 한 문자를 나타냅니다. 이를 사용하여 특정 위치에 어떤 문자가 들어가도 되는 패턴을 지정할 수 있습니다.

 

예를 들어, "employees" 테이블에서 이니셜이 'J'로 시작하고 두 번째 문자가 어떤 문자든 상관없는 직원을 찾고자 한다면 다음과 같은 쿼리를 작성할 수 있습니다.

 

 

SELECT * FROM employees WHERE first_name LIKE 'J_';

 

 

이렇게 하면 이니셜이 'J'로 시작하고 두 번째 문자가 어떤 문자든 상관없는 모든 직원들이 선택됩니다.

 

 

 

와일드카드 설명
% 0개 이상의 문자를 대체합니다.
_ 1개의 문자를 대체합니다.

 

 

 

 

4. 패턴 매칭의 다양한 활용

 

와일드카드를 활용한 패턴 매칭은 다양한 상황에서 유용하게 사용될 수 있습니다. 예를 들어, 이메일 주소에서 특정 도메인을 가진 이메일을 찾거나, 특정한 규칙을 가진 제품명을 검색하는 등 다양한 용도로 활용할 수 있습니다. 이를 통해 정확한 패턴을 가진 데이터를 효과적으로 추출할 수 있습니다.

 

 

 

 


NULL 값 다루기: IS NULL과 IS NOT NULL

NULL 값은 데이터의 부재를 나타내는 중요한 개념 중 하나입니다. IS NULL과 IS NOT NULL 연산자를 통해 데이터베이스에서 값이 없는 경우 또는 값이 있는 경우를 정확하게 처리할 수 있습니다.

 

 

 

1. IS NULL: NULL 값 처리

 

NULL은 데이터베이스에서 값이 없음을 나타냅니다. 때로는 특정 열이나 필드에 값이 없는 경우를 찾아야 할 때가 있습니다. 이때 IS NULL 연산자를 사용하여 NULL 값을 가진 행을 선택할 수 있습니다.

 

예를 들어, "employees" 테이블에서 담당 매니저가 지정되지 않은 경우를 찾고자 한다면 다음과 같은 쿼리를 사용할 수 있습니다.

 

 

SELECT * FROM employees WHERE manager_id IS NULL;

 

 

이렇게 하면 담당 매니저가 지정되지 않은 모든 직원들이 선택됩니다.

 

 

 

 

2. IS NOT NULL: NULL 값이 아닌 경우 처리

 

반대로, IS NOT NULL 연산자는 특정 열이나 필드에 값이 있는 경우를 찾을 때 사용됩니다.

 

예를 들어, "orders" 테이블에서 배송 주소가 NULL이 아닌 주문을 찾고자 한다면 다음과 같은 쿼리를 사용할 수 있습니다.

 

 

SELECT * FROM orders WHERE shipping_address IS NOT NULL;

 

 

이렇게 하면 배송 주소가 NULL이 아닌 모든 주문들이 선택됩니다.

 

 

 

 

3. NULL 값과 비교 연산자의 함께 사용

 

NULL 값 처리 시 주의해야 할 점 중 하나는 일반적인 비교 연산자와 함께 사용할 때입니다. NULL 값과의 비교에서는 일반적인 연산자를 사용하면 예상치 못한 결과가 발생할 수 있습니다. 따라서 비교 시에는 IS NULL이나 IS NOT NULL을 사용하는 것이 안전합니다.

 

예를 들어, "products" 테이블에서 가격이 NULL이 아니고 100보다 큰 제품을 찾고자 한다면 다음과 같이 작성할 수 있습니다.

 

 

SELECT * FROM products WHERE price IS NOT NULL AND price > 100;

 

 

이렇게 하면 가격이 NULL이 아니고 100보다 큰 제품들이 선택됩니다.

 

 

 

 

4. NULL 값 다루기의 활용

 

NULL 값 다루기는 데이터베이스에서 중요한 부분 중 하나로, 특히 데이터의 부재를 나타내는 경우에 해당합니다. 이를 활용하여 데이터베이스에서 누락된 정보를 찾거나, 특정 조건을 충족하는 행을 선택하는 등 다양한 상황에서 유용하게 사용됩니다. 특히 조인된 테이블에서 NULL 값 처리는 데이터의 일관성을 유지하는 데에 큰 도움이 됩니다.

 

 

 

 


WHERE 절 최적화

 

 

인덱스 활용

 

인덱스는 데이터베이스 성능 최적화에서 핵심적인 역할을 합니다. WHERE 절에서 자주 사용되는 컬럼에 인덱스를 생성함으로써 조회 속도를 향상시킬 수 있습니다. 특히, 대용량 데이터베이스에서는 인덱스의 중요성이 더 커집니다.

 

예를 들어, "products" 테이블의 'product_name' 컬럼에 인덱스를 생성하면 특정 제품명을 검색할 때 빠른 속도를 기대할 수 있습니다.

 

 

CREATE INDEX idx_product_name ON products (product_name);

 

 

 

 

최적한 연산자 선택

 

WHERE 절에서 사용하는 연산자의 선택도 성능에 큰 영향을 미칩니다. 등호 연산자(=)는 일반적으로 빠른 성능을 보여주지만, 범위 비교나 LIKE 연산자는 성능 저하의 원인이 될 수 있습니다. 연산자를 선택할 때는 해당 컬럼의 데이터 형식과 비교 조건을 고려하여 적절한 연산자를 선택하는 것이 중요합니다.

 

 

-- 좋은 예: 등호 연산자 사용
SELECT * FROM employees WHERE department = 'HR';

-- 나쁜 예: LIKE 연산자 사용 (성능 저하 가능)
SELECT * FROM products WHERE product_name LIKE 'Laptop%';

 

 

 

 

중복 조건 회피

 

WHERE 절에 중복된 조건이 포함되어 있을 경우, 이는 불필요한 연산을 유발하고 성능을 저하시킬 수 있습니다. 중복된 조건을 피하고, 필요한 경우 논리적인 그룹화를 통해 최적화할 수 있습니다.

 

 

-- 좋은 예: 중복된 조건 회피
SELECT * FROM orders WHERE status = 'shipped' AND total_amount > 1000;

-- 나쁜 예: 중복된 조건 사용 (불필요한 연산)
SELECT * FROM orders WHERE status = 'shipped' AND total_amount > 1000 AND status = 'shipped';

 

 

 

 

서브쿼리 최적화

 

서브쿼리를 사용할 때에는 해당 서브쿼리가 빠르게 실행될 수 있도록 최적화해야 합니다. 서브쿼리가 반복적으로 실행되는 것을 피하고, 필요한 경우 JOIN 등을 통해 효과적인 방법으로 데이터를 가져오도록 합니다.

 

 

-- 좋은 예: EXISTS를 통한 최적화
SELECT * FROM customers WHERE EXISTS (SELECT 1 FROM orders WHERE orders.customer_id = customers.customer_id);

-- 나쁜 예: 비효율적인 서브쿼리
SELECT * FROM customers WHERE customer_id IN (SELECT customer_id FROM orders);

 

 

 

 

 


MySQL의 WHERE 절을 사용하여 데이터를 정확하게 필터링하기 위해서는 비교 연산자, 논리 연산자, 패턴 매칭, NULL 값 다루기 등 WHERE 절에서는 제공하는 연산자를  잘 활용해야 합니다. WHERE 절을 올바르게 사용하면 정확하고 효율적인 데이터 검색이 가능해집니다.