Notice
Recent Posts
Recent Comments
«   2024/11   »
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
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

04 WHERE 문에서 논리 연산자 사용 본문

MSSQL/SQL 시작하기

04 WHERE 문에서 논리 연산자 사용

빌드이너프 2024. 9. 29. 10:04

논리 연산자는 조건의 참, 거짓을 판단하며, 더 복잡한 조건문이 필요한 경우 비교 연산자와 조합해 많이 사용한다.

 

논리 연산자의 종류

 

BETWEEN을 이용한 데이터 검색

BETWEEN은 WHERE 문과 함께 사용하며 검색하는 값의 범위를 지정할 수 있다.

날짜형 데이터에 보통 사용하지만 문자열형이나 숫자형 데이터에도 사용할 수 있다.

 

ipo_year 열의 2010~2011 범위에 해당하는 값을 검색

SELECT * FROM nasdaq_company
WHERE ipo_year BETWEEN 2010 AND 2011;

 

last_crawel_date 열에서 2021년 3월 17일부터 2021년 3월 19일까지의 데이터 검색

SELECT * FROM nasdaq_company
WHERE last_crawel_date BETWEEN '2021-03-17' AND '2021-03-19';

날짜형 데이터를 검색할 때는 밀리초를 고려해야한다.

2021-03-17을 조건값으로 사용하면 2021-03-17 00:00:00.000이 조건문에 사용된다.

 

날짜형에 정확한 값을 사용하여 검색

SELECT * FROM nasdaq_company
WHERE last_crawel_date = '2021-03-17 00:00:00.000';

 

BETWEEN을 사용하여 symbol 열에서 A와 B를 포함한 값을 검색

SELECT * FROM nasdaq_company
WHERE symbol BETWEEN 'A' AND 'B';

 

BETWEEN을 사용하되 범위를 포함하지 않은 데이터 검색

SELECT * FROM nasdaq_company
WHERE symbol NOT BETWEEN 'A' AND 'B';

 

AND와 OR를 이용한 데이터 검색

실제로 데이터를 검색할 때 매우 다양한 조건을 적용해야 하는 경우가 많은데

논리 연산자인 AND와 OR를 사용해 여러 조건을 결합한다.

AND: 입력한 2개의 조건이 모두 만족하는 데이터만 검색

OR: 입력한 두 조건 중 하나라도 만족하는 데이터를 모두 검색

sector가 'Finance'이면서 industry가 'Major Banks'인 데이터를 검색

SELECT * FROM nasdaq_company
WHERE sector = 'Finance' AND industry = 'Major Banks';

 

symbol이 'MSFT' 또는 'XXXX'인 데이터를 검색

SELECT * FROM nasdaq_company
WHERE symbol = 'MSFT' OR symbol = 'XXXX';

 

만약 여러 데이터를 검색하고 OR을 여러 번 사용하면 계속해서 같은 연산자를 반복 작성해야 하므로 비효율적이다.

OR을 2개 이상 사용한 데이터 검색

SELECT * FROM nasdaq_company
WHERE symbol = 'MSFT' OR symbol = 'AMD' OR symbol = 'AMZN';

이런 경우 OR을 반복해 쓰는 것이 아니라 IN을 사용하면 된다.

IN은 OR과 같은 역할을 하지만 쉼표를 사용한다는 점에서 사용 방법만 다르다

IN을 사용해 OR 반복 사용을 대체한 데이터 검색

SELECT * FROM nasdaq_company
WHERE symbol IN('MSFT', 'AMD', 'AMZN');


AND, OR. IN을 조합해 데이터 검색

요구사항: sector이 'Technology' 또는 'Consumer Services' 이면서 symbol이 'MSFT', 'AMD', 'AMZN'인 데이터 검색

그냥 쿼리를 작성했다면 밑의 쿼리가 나올 것이다.

요구 사항대로라면 3개의 데이터가 나와야 하는데 그렇지 않다.

SELECT * FROM nasdaq_company
WHERE sector = 'Technology' OR sector = 'Consumer Services'
AND symbol IN ('MSFT', 'AMD', 'AMZN');

문제 발생 이유 : 논리 연산자의 우선순위

 

앞서 작성한 쿼리는 다음과 같은 순서로 풀이되었다

SELECT * FROM nasdaq_company
WHERE sector = 'Technology';
SELECT * FROM nasdaq_company
WHERE sector = 'Consumer Services'
AND symbol IN ('MSFT', 'AMD', 'AMZN');

sector이 'Technology'인 전체 데이터와, sector이 'Consumber Services'인 전체 데이터 중

symbol이 'MSFT', 'AMD', 'AMZN'인 데이터가 검색되었다.

 

요구사항이 원하는 쿼리를 도출하기 위해 소괄호()를 사용해야 한다.

SELECT * FROM nasdaq_company
WHERE (sector = 'technology' OR sector = 'Consumer Services')
AND symbol IN ('MSFT', 'AMD', 'AMZN');

 

해당 결과는 sector 조건을 IN으로 묶은 다음 AND로 결합해도 같은 결과를 얻을 수 있다.

SELECT * FROM nasdaq_company
WHERE sector IN('technology', 'Consumer Services')
AND symbol IN ('MSFT', 'AMD', 'AMZN');


경험

어떤 결과를 얻는 코드에는 정답이 없다.

좋은 쿼리란 가독성을 포함해 요구 사항을 정확히 반영하면서 성능도 효율적인 코드를 말한다.