본문 바로가기
데이터 모델과 SQL

[데이터 모델과 SQL] 5. 검색 조건 지정하기 - 2/2

by 영바이트 2023. 1. 2.

 

이전 포스팅에서 검색 조건 구성을 위한 아래와 같은 기본적인 방법들에 대해 알아보았다. 

· WHERE 구문의 기본 구조

· 검색 조건: 비교

· 검색 조건: 범위(range)

· 검색조건: 소속(membership)

· 검색조건: 패턴(pattern match)

· 검색조건: 데이터 없음(Null)

· 여러 검색 조건 결합하기

2023.01.02 - [데이터 모델과 SQL] - [데이터 모델과 SQL] 5. 검색 조건 지정하기 - 1/2

 

[데이터 모델과 SQL] 5. 검색 조건 지정하기 - 1/2

앞서 SELECT 요청식의 기본적인 문법에 대해 살펴보았다. 앞에서 살펴본 요청식에서는 따로 검색 조건을 지정하지 않고 테이블의 모든 데이터를 가져오도록 하였다. 하지만 실무에서는 거의 모든

youngbyte.tistory.com

 

지금까지 지정한 조건을 만족(포함)시키는 방법을 알아보았다. 이와 반대되는, 지정한 조건을 제외시키는 조건을 지정하는 방법에 대해 알아보자.

 

 

● 제외(exclusion) 조건

제외 조건을 위한 기본적인 문법은 NOT BETWEEN, NOT IN, NOT LIKE, IS NOT NULL와 같이 조건을 나타내는 키워드 앞에 NOT을 추가하는 것이다. 예를 들면 아래와 같다.

SELECT phoneNumber FROM faculty WHERE title NOT IN ('Professor', 'Associate Professor')

→ 정교수(Professor) 또는 부교수 혹은 조교수(Associate Professor)가 아닌 교수진(예, 강사, 겸임교수 등)의 전화 번호를 얻는다.

 

제외 조건에는 두 가지가 있다. 첫 번째는 개별 조건 부정이고 두 번째는 전체 조건 부정이다. 이들 각각이 무엇인지 예를 통해 살펴보자.

 

- 개별 조건 부정
문법: NOT <검색 조건 1> AND | OR NOT <검색 조건 2> ...

예) 볼레로Bolero, 임페리얼Imperial, 썬더버드Thunderbird 경기장이 아닌 곳에서 열리는 경기를 알고 싶다.

SELECT tourneyName, tourneyLocation FROM tourney WHERE tourneyLocation NOT IN ('Bolero Lanes', 'Imperial Lanes', 'Thunderbird Lanes');

 

- 전체 조건 부정
문법: NOT (<검색 조건 1> AND | OR NOT <검색 조건 2> ...)
예) 직함이 교사(teacher) 또는 보조 교사(aide)가 아닌 직원들의 이름을 알고 싶다.

SELECT firstName, lastName FROM staffs WHERE NOT(title='teacher' OR title='aide');
SELECT firstName, lastName FROM staffs WHERE title NOT IN('teacher', 'aide');

 

제외 조건을 사용할 때는 위의 개별 조건 부정 또는 전체 조건 부정 문법 중 하나만 사용해야 한다. 만약 둘 다 사용하게 되면 부정의 부정이 되어서 원하지 않는 결과를 얻을 수도 있다.

 

 

● WHERE 구문 안 조건들의 연산 순서

WHERE 구문의 조건식에는 조건을 지정하는 다양한 연산자들이 사용된다. 조건식이 여러 개인 경우 연산의 순서가 어떻게 되는지 살펴보자.

 

· 기본적으로 왼쪽 조건식 → 오른쪽 조건식 순서로 계산된다.
· 괄호가 사용된 계산식이 그렇지 않는 계산식들보다 우선 순위가 높다.
· 연산자(operator)에는 기본적으로 아래와 같은 우선 순위가 적용된다.

  • 1 음수(-) 또는 양수(+) 기호
  • 2 곱셈 및 나눗셈
  • 3 덧셈, 뺄셈
  • 4 비교, 범위(BETWEEN), 소속(IN), 패턴(LIKE), Null 조건 연산자(IS NULL)
  • 5 NOT
  • 6 AND
  • 7 OR

조건식을 작성할 때 연산 순서가 모호하다면 괄호를 사용해서 연산의 순서를 명확하게 해준다.

연산 순서를 이해하고 있으면 더 빨리 검색을 수행할 수 있다.
예) 주문 당일 출고(shipDate = orderDate)된 주문 건 중 고객 ID가 1001인 주문의 고객 ID, 주문일 및 출고일을 알고 싶다.

△ SELECT customerID, orderDate, shipDate FROM orders WHERE shipDate=orderDate AND customerID=1001;
○ SELECT customerID, orderDate, shipDate FROM orders WHERE customerID=1001 AND shipDate=orderDate;

위 예에서 customerID=1001이 shipDate=orderDate 조건보다 빨리 계산된다. 따라서 추가적인 조건(AND 뒤 조건) 계산이 필요한지 빨리 판단할 수 있고 전체적인 검색식 처리 속도도 빨라진다.

 

 

● Null 값을 갖는 조건식과 AND, OR 연산자

★ 다시 한번 강조하지만 Null의 논리값은 unknown이다. 따라서 AND, OR로 연결된 전체 조건식의 어느 하나의 항이 Null 값을 반환한다면 전체 조건식의 값이 unknown이 될 수 있다 .이 경우 조건식으로 원하는 결과를 얻을 수 없기 때문에 WHERE 구문의 조건식에 사용된 항목이 Null을 반환하는지 여부를 다시 한번 확인할 필요가 있다.

예) WHERE custHomeCity='Madison'
∵ custHomeCity 항목이 선택적으로 입력 가능한 항목이라면 null 값이 반환될 수 있다. 따라서 custHomeCity='Madison' 값이 참, 거짓도 아닌 unknown이 될 수 있기 때문에 WHERE custHomeCity IS NOT NULL AND custHomeCity='Madison'이 더 정확한 조건식이 된다.

 

● 결과 셋이 같은 여러 가지 검색식들

같은 결과 셋을 얻기 위해 여러가지 검색식들이 사용될 수 있다. SQL 문법에 맞는다면 이 중 어떤 검색식도 틀린 것이 아니다. 오히려 다양한 표현 방식을 알고 있는 것이 다양한 상황에서 다양한 검색식을 만들 수 있도록 해준다.
예) H로 시작하는 성(custLastName)을 가진 고객을 알고 싶다.

SELECT custFirstName, custLastName FROM customers WHERE custLastName LIKE 'H%';
SELECT custFirstName, custLastName FROM customers WHERE custLastName BETWEEN 'H' AND 'HZ';
SELECT custFirstName, custLastName FROM customers WHERE custLastName >= 'H' AND custLastName <= 'HZ';

 

댓글