[ 살펴보기 ] Sql - 필터링
![[ 살펴보기 ] Sql - 필터링](https://cdn.hashnode.com/res/hashnode/image/upload/v1719909919467/9d20e910-04bd-401e-a267-1c1cd73039d5.jpeg)
SQL에서 where 절을 통해 필터조건을 설정할 수 있고 and 또는 or 연산자로 하나 이상의 조건을 설정할 수 있다.
필터 조건 유형
아래의 예제와 같이 where절와 다양한 연산자를 통해 동등, 부등, 범위와 같은 다양한 조건을 작성할 수 있다.
// 동등 값 검색
SELECT * FROM customers
WHERE joined_date = '2024-01-01';
위의 예제는 동등 값 연산자 ( = )를 통해 joined_date가 2024-01-01와 동일한 데이터를 검색한다
// 부등 값 검색
SELECT * FROM customers
WHERE joined_date <> '2024-01-01';
위의 예제는 부등 값 연산자 ( <> )를 통해 joined_date가 2024-01-01인 데이터를 제외한 데이터를 검색한다
// 범위 검색
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 날짜를 포함한다
// 두 데이터 사이의 범위 검색
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 조건을 추가한다.
SELECT * FROM customers
WHERE joined_date > '2024-01-01' AND first_name = 'Jake';
위의 예제에서는 first_name이 Jake인 데이터를 추가 filter 조건으로 추가하였으므로 결과적으로 두 개의 filter를 모두 만족하는 데이터를 검색한다
만약 여러개의 조건 중 하나라도 만족하는 결과를 검색하고자 할 때는 AND 대신 OR를 사용한다
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인 데이터를 검색해야 하는 경우처럼 여러 조건을 묶어야 할 때는 괄호를 사용한다
SELECT * FROM customers
WHERE (first_name = 'Jake' OR first_name = 'Karl')
AND joined_date > '2024-01-01';
만일 OR로 표현해야 하는 필터가 여러 개라면 IN 연산자를 사용할 수 있다
SELECT * FROM customers
WHERE city IN ('seoul', 'busan', 'sejong');
NOT
필터 조건에서 특정 사항을 제외시키고 싶을 때 NOT을 사용할 수 있다. 다음 예제를 살펴보자
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이 아닌 나머지 데이터를 검색한다
SELECT * from customers
WHERE first_name NOT IN ('Jake', 'Karl')
AND joined_date > '2024-01-01';
위의 예제는 NOT IN을 통해 동일한 역할을 하는 query를 표현하는 방식이다.
부분 일치 검색
부분 일치 검색을 위해 와일드카드 문자와 Like 연산자를 사용한다. 다음 예를 살펴보자
SELECT * from customers
WHERE last_name LIKE 'JA__';
SELECT * from customers
WHERE last_name LIKE 'JA%';
첫 번째 예제에서는 _ 와일드카드 문자가 2개 사용되었고 두 번째 예제에서는 %와일드카드 문자가 사용되었다. 둘 의 차이점은 _와일드카드는 데이터의 길이까지 포함하여 검색한다는 것이다.
위의 예제를 예로 들면 JA라는 문자열 뒤에 _와일드카드 문자가 2개 사용되었으니 JA로 시작하는 4글자 데이터만 검색한다
그리고 두 번째 %와일드 카드가 사용된 예제는 데이터의 길이와 상관없이 JA로 시작하는 데이터를 모두 검색한다. 아래 추가적인 예제를 살펴보자
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인 데이터
*/
![[ 살펴보기 ] RDB - Relationships](https://cdn.hashnode.com/res/hashnode/image/upload/v1739711556668/48dc9e84-a621-42aa-9c9f-5fc5c436f0ec.jpeg)
![[ 살펴보기 ] MySQL - Data types](https://cdn.hashnode.com/res/hashnode/image/upload/v1739593589113/530f8704-4d27-42c9-a451-bb5c63150b99.jpeg)
![[ 살펴보기 ] TypeORM - Transactions, Migration](https://cdn.hashnode.com/res/hashnode/image/upload/v1739106042581/980b8133-61d4-406a-a026-65be9c28eace.jpeg)
![[ 살펴보기 ] TypeORM - Relations](https://cdn.hashnode.com/res/hashnode/image/upload/v1738666874402/b688bd0b-b6bb-4f43-87d8-c1b46b59f1b7.jpeg)
![[ 살펴보기 ] TypeORM - Basics](https://cdn.hashnode.com/res/hashnode/image/upload/v1738666803591/bef5df17-7dc7-4123-ae55-004d5042df39.jpeg)