데이터를 조회하는 방법에 대해 이전 문서에 이어서 설명하도록 하겠습니다.
이번에 설명드릴 내용은 단순한 하나의 조건을 검색하는 것이 아니라 복합적인 조건을 이용해서 검색해야 할 경우에 어떻게 검색을 하는 지에 대한 내용입니다.
NOT을 사용하여 행 제외하기
NOT 연산자는 단일 조건에서도 사용되지만 보통 여러 조건을 이용한 검색을 할 때 많이 사용됩니다. 말 그대로 조건에 맞지 않는 조건을 검색하는 용도로 사용됩니다. 보통 Between, In, Like 및 Is Null 등의 술어와 같이 사용되는 데 의미는 단순하지만 사용상에는 약간의 주의가 필요한 연산자입니다.
1. 주문 테이블에서 주문 날짜가 2017년 10월이 아닌 주문 리스트를 선택하시오.
2. 고객 테이블에서 고객이 사는 곳이 서울과 부산이 아닌 고객리스트를 선택하시오.
3. 회원 테이블에서 회원의 나이를 입력한 회원 리스트를 선택하시오.
NOT 연산자를 사용할 때 다른 술어들(BETWEEN, IN, LIKE)은 모두 술어들 앞에 NOT을 사용하지만 IS NULL에서는 IS NOT NULL과 같이 사용해야 합니다. NOT IS NULL 은 맞지 않는 문법입니다. 초심자들이 실수를 하기 쉬운 부분이니 이 부분은 유의하시기 바랍니다.
AND의 사용
두개 이상의 조건을 결합하여 사용할 수 있는 첫번째 방법은 AND 연산자를 사용하는 것입니다. AND 연산자는 결합하는 모든 조건을 충족해야만 결과를 반환해주는 연산자입니다.
예) 고객 테이블에서 도시가 서울이고 구가 서초구인 고객을 선택하시오.
OR의 사용
두개 이상의 조건을 결합하여 사용할 수 있는 두번째 방법은 OR 연산자를 사용하는 것입니다. OR 연산자는 결합하는 두개 이상의 조건중에서 하나만 만족하면 결과를 반환해주는 연산자입니다.
예) 고객 테이블에서 도시가 서울이거나 부산인 고객을 선택하시오.
만약 다음과 같은 조건을 검색을 해야 한다고 해보겠습니다.
예) 상품의 공급업체가 서울과 부산에 있는 모든 공급업체를 선택하시오.
위와 같은 조건이 있을 경우 단순하게 생각하면 AND 로 연결해서 조회를 하면 되겠구나 생각을 해서
SELECT * FROM Products WHERE 지역='서울' AND 지역='부산'
과 같이 검색을 할 수가 있습니다. 그러나 조금만 더 생각을 해보면 내가 동시에 서울과 부산에 같이 있을 수 없는 것처럼 공급업체의 지역도 서울과 부산에 동시에 존재할 수는 없습니다. 공급업체의 지역은 대부분의 데이터베이스에서는 한 컬럼에 한가지 내용만 입력되도록 되어 있을 겁니다. 그렇기 때문에 검색은 아래와 같이 작성되어야 올바른 검색을 할 수 있습니다.
SELECT * FROM Products WHERE 지역='서울' OR 지역='부산'
이번에는 위의 Customer 테이블을 기준으로 조금 복잡한 조건을 살펴보도록 하겠습니다.
예) ZipCode가 100으로 시작하고, PhoneNumber가 555로 시작하거나 City가 서울인 고객리스트를 선택하시오.
위와 같은 조건은 검색을 할때는 어떤 순서로 접근하는 것이 좋을까요?
위의 검색 조건을 살펴보니 AND와 OR를 이용해서 검색해야 한다는 것을 알 수 있습니다. 이렇게 AND와 OR를 이용해서 검색을 해야 하는데 위의 조건은 AND로 먼저 묶어야 한다는 것을 알 수 있습니다. 왜냐하면 AND로 묶은 조건은 반드시 포함되어야 하는 조건이므로 AND로 먼저 묶은 다음 OR조건을 이용해서 AND의 결과값을 가지고 결합을 해서 범위를 확장해 주어야 하기 때문입니다. 이런 여러 조건을 이용해서 검색을 할때 순서를 바꾸게 되면 원하는 결과값이 출력되지 않을 수가 있습니다. 그리고 마법의 도구인 괄호를 사용해서 우선 순위를 정해주는 것도 한가지 방법입니다.
그러면 묶는 방법을 알아보도록 하겠습니다. AND를 먼저 사용해야 하므로 Zipcode 와 PhoneNumber를 AND로 묶고 이후에 City를 OR를 사용해서 연결해 줍니다.
그러면 완성된 코드를 확인해 보도록 하겠습니다.
다른 예를 하나 더 살펴보도록 하겠습니다.
예) 고객리스트 중에서 PhoneNumber가 555 로 시작하는 모든 김씨 성과 박씨 성을 가진 사람 리스트를 출력하시오.
위의 조건은 조금 살펴보니 OR를 먼저 결합한 다음 AND를 결합하는 것이 순서라는 것을 알 수 있습니다. PhoneNumber가 555로 시작하기만 하면 김씨와 박씨를 다 출력해야 하므로 OR 조건으로 김과 박을 연결하고 이 결과값을 가지고 AND로 연결하면 되겠습니다. 위의 조건은 굳이 괄호를 사용하지 않아도 되긴 하지만 여러 조건을 이용해서 검색을 할때는 되도록이면 괄호를 사용해 주는 것이 좋습니다. 사실 연산자의 우선 순위라는 것이 있기 때문에 이 우선 순위를 모두 꿰차고 있다면 괄호를 사용하지 않고도 우선순위에 따라 연결할 수도 있습니다. 하지만 코드는 항상 예외적인 상황이 발생하지 않도록 조심해서 다루어야 합니다. 그리고 코드는 한번 만들어지면 끝나는 것이 아니라 지속적으로 수정되어야 하는 경우가 많습니다. 이런 경우에도 괄호를 이용해서 알아보기 쉽도록 코드를 작성해 놓아야 나중에 다시 들여볼 때도 도움이 많이 되니 괄호는 아끼지 말고 사용하는 것이 좋습니다.
그러면 완성된 코드를 확인해 보도록 하겠습니다.
우선 순위
SQL 표준은 데이터베이스 시스템이 검색 조건내에서 단일 조건을 평가하는 방법과 이런 평가가 진행되는 순서를 지정합니다. 단순한 조건의 경우 기본적으로 왼쪽에서 오른쪽으로 평가를 합니다. 그리고 우선 순위 시스템에 따라 연산의 결과를 도출해 내도록 구성되어 있습니다.
예를 들어 +(양수) 와 -(음수) 기호는 어떤 연산자보다 먼저 수행됩니다. 그리고 곱셉(*), 나눗셈(/)이 수행되고, 더하기(+), 빼기(-) 가 수행됩니다. 하지만 이런 연산자의 우선 순위는 사실 외울 필요가 없습니다. 마법의 도구인 괄호가 있기 때문이죠. 우선 순위 연산자의 순서는 사실 중등과정에서 배우는 정도의 우선 순위만 알고 있으면 되고, 이후의 우선 순위는 굳이 몰라도 괄호로 묶는 방법을 이용해서 대치할 수 있습니다. 곱셉과 덧셈이 같이 있을 경우 덧셈을 먼저 하기 위해서 3 * (4+5) 를 이용하는 것과 같은 원리입니다.
그래서 결론은 우선 순위는 굳이 알 필요도 없고, 이걸 이용해서 복잡한 로직을 만들어내야 할 하등이 이유도 없습니다.
하지만 검색의 우선 순위는 알고 있는 것이 좋습니다. 보통 단순 검색의 경우 왼쪽에서 오른쪽으로 검색을 수행하게 됩니다. 그렇기 때문에 먼저 수행되는 검색 결과가 많은 데이터를 출력하고, 나중에 검색하는 데이터가 적은 결과를 출력하는 것은 피하는 것이 좋습니다. 여러 조건을 사용해야 하는 경우 결과물은 많은 양의 행을 제외하는 조건이 먼저 처리되는 것이 좋습니다. 그래야 잠재적으로 데이터베이스가 더 빨리 조건을 찾을 수 있게 됩니다.
예를 들어 아래와 같은 검색식을 만들어 보았습니다.
위의 검색식은 좋은 검색식이 아닙니다. 왜냐하면 같은 조건의 검색식이므로 우선 순위와 상관없이 왼쪽에서 오른쪽으로 검색이 이루어 지게 됩니다. 그런데 City='서울'의 검색 조건은 결과물이 많이 출력되는 검색식이고 CustomerID='1001' 검색식은 단일 행만 출력되는 검색식입니다. 그러므로 속도를 빠르게 하기 위해서는 단일 조건의 검색식이 먼저 수행되도록 하는 것이 좋겠죠.
그래서 검색식은 아래와 같이 바꾸는 것이 좋습니다.
조건을 표시하는 여러가지 방법
데이터베이스의 SQL 검색식은 똑같은 데이터가 출력되더라도 이 데이터를 여러가지로 검색하는 방법이 있을 수가 있습니다.
예) 2017년 10월에 주문된 주문 리스트를 출력하시오.
위와 같은 검색을 위해서는 아래와 같이 두가지 방법을 이용해서 검색을 할 수 있습니다.
OrderDate Between '2017-10-01' AND '2017-10-31'
OrderDate >= '2017-10-01' AND OrderDate <= '2017-10-31'
예) 서울, 부산, 인천에 사는 고객리스트를 출력하시오.
City In ('서울', '부산', '인천')
City ='서울' OR City='부산' OR City='인천'
예) 회사명이 B로 시작되는 회사리스트를 출력하시오
Company >= 'B' AND Company <= 'BZ'
Company Between 'B' AND 'BZ'
Company Like 'B%'
예) 서울이나 부산에 살지 않는 모든 고객리스트를 출력하시오.
City <> '서울' AND City <> '부산'
City Not In ('서울', '부산')
Not (City ='서울' OR City='부산')
'IT > SQLD' 카테고리의 다른 글
[MSSQL] DATEDIFF, DATEADD 날짜 비교, 날짜 계산 (0) | 2023.05.22 |
---|---|
[mysql] 월별통계방법!! (데이터 없는 날짜 0 처리 방법) (0) | 2023.05.22 |
[MySQL] A테이블에 있고, B테이블에 없는 데이터 조회 및 삭제 (0) | 2023.05.22 |
[MSSQL] 조인 방법 쉽게 정리 (INNER JOIN, OUTER JOIN) (0) | 2023.05.22 |
[MSSQL] GROUP BY COUNT 그룹으로 묶어 집계하기 (0) | 2023.05.22 |