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

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

by 영바이트 2023. 1. 2.

 

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

 

검색 조건을 지정하기 위해서 WHERE 구문이 사용된다. WHERE 구문은 SELECT 결과 안에서 조건에 맞는 결과를 골라낸다. 이렇게 특정 조건을 지정하고 해당 조건에 만족하는 데이터들을 골라내는 동작을 하기 때문에 WHERE 구문을 일반적으로 필터링filtering이라고 부른다.

 

● WHERE 구문

WHERE 구문은 SELECT 명령과 함께 사용된다.

- 기본 구조

SELECT <컬럼, 표현식, 함수> FROM <테이블 이름> WHERE <검색 조건>

 

WHERE 구문을 포함한 검색식을 만드는 일반적인 방법을 예를 통해 살펴보자.

예) 성(last name)이 Lee인 학생들의 학번(studentID)을 알고 싶다.

SELECT studentID FROM students WHERE studentLastName='Lee';

검색 조건은 대부분 제한(restriction)으로 표현된다. 이를 위 예의 조건에서 studentLastName='Lee'와 같이 표현할 수 있다. 어떤 조건들이 결과를 걸러낼 수 있는지 찾아보고 이를 검색 조건으로 구성하면 된다.

 

검색 조건으로 사용할 수 있는 다양한 조건 연산에 대해 살펴보자.

 

ⓐ검색 조건: 비교

= 같음, !=(또는 <>) 같지 않음, < 작음, > 큼, <= 작거나 같음, >= 크거나 같음

SELECT firstName, lastName FROM students WHERE dateofbirth >= '1990-01-01';

 

ⓑ검색 조건: 범위(range)

BETWEEN <컬럼, 표현식, 함수> AND <컬럼, 표현식, 함수>

SELECT contractID, startDate, endDate FROM contracts WHERE '2020-10-10' BETWEEN startDate AND endDate;

→ startDate 또는 endDate가 '2020-10-10'과 겹치는 계약을 찾는다.

 

ⓒ검색조건: 소속(membership)

IN <컬럼, 표현식, 함수)

SELECT studentID, firstName, lastName FROM students WHERE homeCity IN ('Seattle', 'LosAngeles', 'Philadelphia');

 

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

<컬럼, 표현식, 함수> LIKE '<패턴>'
패턴에는 두 개의 와일드카드 문자인 %: 0개 이상의 문자들, _: 문자 1개가 쓰인다. 아래 예를 보자.

SELECT CustLastName, CustFirstName FROM customers WHERE CustLastName LIKE 'Mar%';

→ 성이 'Mar'로 시작하는 고객을 찾는다. Result set = {Marks, Marshall, Martinez, Marx, ...}

 

SELECT VendName FROM vendors WHERE VendStreetAddress LIKE '%Forest%';

→ 주소에 Forest가 들어가는 제조사를 찾는다. Result set = {Forest Park Place, Evergreen Forest Drive, ...}

 

_ 기호는 문자 1개를 의미한다. 예를 들어 'ab_'라고 하면 aba, abb, abc ...  등이 매칭된다.

 

만약 와일드 카드 문자 자체를 패턴 매칭의 대상으로 한다면 escape 문자를 지정하고 이를 붙여준다.

SELECT productCode FROM products WHERE productCode LIKE 'GA\_00_' ESCAPE '\';

→ 'GA_00문자 하나'인 제품의 제품 코드(예, GA_00A, GA_00B, ...)를 찾는다. ESCAPE 옵션은 특정 문자를 escape 문자로 지정할 수 있도록 해준다. ESCAPE 명령으로 지정된 문자의 escaping 기능은 와일드 카드 문자들(% 또는 _)에만 적용된다.

 

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

IS NULL

SELECT custName FROM customers WHERE state IS NULL

→ 살고 있는 주(state)를 기재하지 않는 고객

 

* Null은 unknown을 의미하는 것으로 비교의 대상이 될 수 없다. 하지만 Null이 정보가 없다는 것, 즉 잘못된 것임을 의미하지는 않는다. 예를 들어 협상 중인 계약은 계약 금액이 미정(unknown)인 것이 올바른 정보이다. SELECT 명령의 결과로 기대하지 못했던 결과가 출력 된다면 오류를 의심하기 전에 출력하고자 하는 데이터의 성질이 무엇인지 생각해 볼 필요가 있다.

 

● 검색 조건을 구성할 때 주의를 기울여야 하는 몇 가지 상황들

· WHERE 구문에 포함되어 있는 검색 조건들에서 사용되는 값, 컬럼 이름 등은 FROM 구문에 포함되어 있는 참조 테이블에 포함되어 있는 값, 컬럼이어야 한다. SQL 요청식의 처리는 'FROM 구문 → WHERE 구문 → SELECT 구문' 순서로 진행되기 때문이다. 따라서 FROM 구문에 포함되어 있지 않는 데이터는 WHERE 구문에서 참조할 수 없다.

· 문자를 비교할 때는 DBMS의 종류에 따라 대, 소문자를 구분하거나 또는 그렇지 않는 경우가 나뉘어 지므로 주의를 기울여야 한다.

· 범위를 지정할 때는 'value1 BETWEEN value2 AND value3' 형태로 구성한다. 구문을 구성할 때 반드시 value2 ≤ value3가 되도록 구성하여야 한다. SQL 표준은 value2 ≤ value1 ≤ value3로 해석하기 때문이다.
예) targetColumn BETWEEN 5 AND 10 ○, targetColumn BETWEEN 10 AND 5 X

· 문자(알파벳)을 BETWEEN 조건의 값으로 사용할 때는 알파벳 코드(숫자+소문자+대문자)의 우선 순위를 먼저 알아야 한다. 문자 코드의 순서는 DBMS마다 다르므로 DBMS의 매뉴얼을 참고한다.

 

● 여러 개의 검색 조건 결합하기

검색 조건이 2개 이상이 되면 각 검색 조건을 AND와 OR 연산자를 이용해서 연결할 수 있다. AND 연산자는 결합 대상이 되는 모든 조건들이 참(true)인 행(row)들 만 검색 결과에 포함시키고, OR 연산자는 연결되는 조건들 중 하나 이상이 참인 행을 검색식의 결과 셋에 포함시킨다.

 

예) 시애틀(Seatle)에 거주하고 성(last name)이 H로 시작하는 고객 이름을 알고 싶다.

SELECT custLastName FROM customers WHERE homeCity='Seatle' AND custLastName LIKES 'H%';

 

예) 시애틀 또는 오레곤(Oregon)주에 거주하는 직원들의 이름, 거주 도시, 그리고 거주하는 주를 알고 싶다.

SELECT firstName, lastName, homeCity, homeState FROM employees WHERE homeCity='Seatle' OR homeState='Oregon';

 

AND와 OR를 조합해서 사용할 수도 있다. 이 때는 괄호 (와 )를 사용하여 연산의 순서를 명확하게 기술할 필요가 있다.

예) 정교수(professor) 혹은 부교수(associate professor) 중 임용 날짜(dateHired)가 1999년 5월 17일인 교수들의 이름과 직함(title)을 알고 싶다.

SELECT fitstName, lastName, title FROM professors WHERE (title='professor' OR title='associate professor') AND dateHired='1999-05-17';

 

댓글