# [ 살펴보기 ] Sql - 필터링

SQL에서 where 절을 통해 필터조건을 설정할 수 있고 and 또는 or 연산자로 하나 이상의 조건을 설정할 수 있다.

## 필터 조건 유형

아래의 예제와 같이 where절와 다양한 연산자를 통해 동등, 부등, 범위와 같은 다양한 조건을 작성할 수 있다.

```sql
// 동등 값 검색
SELECT * FROM customers 
WHERE joined_date = '2024-01-01';
```

위의 예제는 동등 값 연산자 ( = )를 통해 joined\_date가 2024-01-01와 동일한 데이터를 검색한다

```sql
// 부등 값 검색
SELECT * FROM customers 
WHERE joined_date <> '2024-01-01';
```

위의 예제는 부등 값 연산자 ( &lt;&gt; )를 통해 joined\_date가 2024-01-01인 데이터를 제외한 데이터를 검색한다

```sql
// 범위 검색
SELECT * FROM customers 
WHERE joined_date > '2024-01-01';

SELECT * FROM customers 
WHERE joined_date >= '2024-01-01';
```

위의 예제와 같이 범위 연사자를 통해 where절을 적용하면 customers라는 table이 가진 데이터 중에 joined\_date가 2024-01-01 이후 데이터만 검색할 수 있다. 첫 번째 예제의 검색 결과는 2024-01-01 날짜를 포함하지 않고 두 번째 검색 결과는 2024-01-01 날짜를 포함한다

```sql
// 두 데이터 사이의 범위 검색
SELECT * FROM customers 
WHERE joined_date >= '2024-01-01' 
AND joined_date <= '2024-01-30';

SELECT * FROM customers 
WHERE joined_date BETWEEN '2024-01-01' AND '2024-01-30';
```

만일 두 개의 범위안에 있는 데이터를 검색해야 하는 상황에선 위의 예제와 같이 처리할 수 있다. BETWEEN을 사용해 검색하면 검색에 기반이 되는 조건 데이터 역시 포함을 시켜 검색한다 ( 위의 예제를 기준으로 2024-01-01, 그리고 2024-01-30 데이터를 포함하여 검색 ) 다만 BETWEEN을 쓸 때 주의해야 할 점은 검색하는 조건의 더 낮은 값을 첫 번째로 지정해 주어야 한다 ( AND 구문의 왼쪽 )

## 다중 필터 검색

만약 joined\_date에 더불어 추가적인 필터를 걸고 싶다면 아래의 예제처럼 AND을 추가하여 추가 filter 조건을 추가한다.

```sql
SELECT * FROM customers
WHERE joined_date > '2024-01-01' AND first_name = 'Jake';
```

위의 예제에서는 first\_name이 Jake인 데이터를 추가 filter 조건으로 추가하였으므로 결과적으로 두 개의 filter를 모두 만족하는 데이터를 검색한다

만약 여러개의 조건 중 하나라도 만족하는 결과를 검색하고자 할 때는 AND 대신 OR를 사용한다

```sql
SELECT * FROM customers
WHERE joined_date > '2024-01-01' OR first_name = 'Jake';
```

위의 query는 joined\_date가 '2024-01-01' 이거나 first\_name이 Jake인 데이터를 검색한다

하지만 필터 조건을 여러 개 사용할 때는 어떻게 처리해야 할까? 만약 joined\_date는 그대로 두고 first\_name을 Jake이거나 Karl인 데이터를 검색해야 하는 경우처럼 여러 조건을 묶어야 할 때는 괄호를 사용한다

```sql
SELECT * FROM customers
WHERE (first_name = 'Jake' OR first_name = 'Karl') 
AND joined_date > '2024-01-01';
```

만일 OR로 표현해야 하는 필터가 여러 개라면 IN 연산자를 사용할 수 있다

```sql
SELECT * FROM customers
WHERE city IN ('seoul', 'busan', 'sejong');
```

## NOT

필터 조건에서 특정 사항을 제외시키고 싶을 때 NOT을 사용할 수 있다. 다음 예제를 살펴보자

```sql
SELECT * from customers
WHERE NOT (first_name = 'Jake' OR first_name = 'Karl') 
AND joined_date > '2024-01-01';
```

이전 예제에서 살펴본 바와는 달리 위의 예제에서는 NOT을 추가했으므로 검색하는 결과는 joined\_date는 2024-01-01 이후 데이터 그리고 first\_name이 Jake 또는 Karl이 아닌 나머지 데이터를 검색한다

```sql
SELECT * from customers
WHERE first_name NOT IN ('Jake', 'Karl') 
AND joined_date > '2024-01-01';
```

위의 예제는 NOT IN을 통해 동일한 역할을 하는 query를 표현하는 방식이다.

## 부분 일치 검색

부분 일치 검색을 위해 와일드카드 문자와 Like 연산자를 사용한다. 다음 예를 살펴보자

```sql
SELECT * from customers
WHERE last_name LIKE 'JA__';

SELECT * from customers
WHERE last_name LIKE 'JA%';
```

첫 번째 예제에서는 \_ 와일드카드 문자가 2개 사용되었고 두 번째 예제에서는 %와일드카드 문자가 사용되었다. 둘 의 차이점은 \_와일드카드는 데이터의 길이까지 포함하여 검색한다는 것이다.

위의 예제를 예로 들면 JA라는 문자열 뒤에 \_와일드카드 문자가 2개 사용되었으니 JA로 시작하는 4글자 데이터만 검색한다

그리고 두 번째 %와일드 카드가 사용된 예제는 데이터의 길이와 상관없이 JA로 시작하는 데이터를 모두 검색한다. 아래 추가적인 예제를 살펴보자

```sql
SELECT * from customers
WHERE last_name LIKE '%A';
/*
  last name이 A로 끝나는 데이터
*/

SELECT * from customers
WHERE last_name LIKE '%AK%';
/*
  last name에 AK라는 문자열을 포함하는 데이터
*/

SELECT * from customers
WHERE last_name LIKE '_K_';
/*
  last name이 3글자이며 중간이 K인 데이터
*/
```
