본문 바로가기

Database/SQL

[코테를 위한 Oracle 정리] 3. 필터링 : WHERE

손에 잡히는 10분 SQL 4,5,6장 참고

 
WHERE절로 검색 조건을 지정하여 필요한 데이터로 필터링할 수 있다.

SELECT PROD_NAME, PROD_PRICE
FROM PRODUCTS
WHERE PROD_PRICE = 3.49;
  • WHEREFROMORDER BY 사이에 온다.
  • 가격이 3.49인 행만 출력된다.
  • 클라이언트 프로그램에서 물론 이를 필터링할 수 있지만 DBMS는 데이터를 빠르고 효율적으로 필터링하는되 최적화되어 있기에 쿼리로 필터링하는 것이 더 좋다.

연산자

  • = : 같다
  • <> : 같지 않다
  • != : 같지않다 (위와 같은 역할을 한다. ORACLE에서 둘 다 사용 가능하다)
  • BETWEEN a AND b: 두 값의 사이(시작 값과 종료 값을 포함한다)
  • IS NULL : 값이 NULL 이다
    나머지는 여타 프로그래밍에서 사용하는 연산자와 비슷해서 가져오지 않았다

작은 따옴표의 사용

문자열을 지정할 때 사용한다

WHERE NAME = 'BEN'
  • 문자일 경우 위와 같이 작은 따옴표로 묶어주어야만 한다.
  • 수치형일 경우 필요없다

NULL값 확인하기

값이 들어있지 않은 상태를 NULL이라한다. 공백이나 0, ''(빈 문자열)과는 다른 값이다

SELECT CUST_NAME
FROM CUSTOMERS
WHERE CUST_EMAIL IS NULL;
--WHERE CUST_EMAIL = NULL;
  • 값이 NULL 인지를 확인할 때는 IS NULL을 사용하면 된다.
  • = NULL을 사용하면 아무 일도 일어나지 않는다.
  • 하지만 NULL 이 아닌 것을 확인할 때는 != 대신 IS NOT NULL을 사용해야한다.
  • != NULL 을 하면 아무 일도 일어나지 않는다.
  • 또한 NULL은 일치하는 값이나 일치하지 않는 값을 찾을 때 검색되지 않는다.

AND, OR 연산자

WHERE 절에는 AND나 OR로 여러 조건을 지정할 수 있다.

SELECT PROD_ID, PROD_PRICE, PROD_NAME
FROM PRODUCTS
WHERE VEND_ID = 'DLL01' AND PROD_PRICE<=4;
  • AND : 조건을 모두 만족하는 행을 가져온다
  • OR : 하나만 조건에 충족해도 그 행을 가져온다.

우선순위

WHERE 절에 AND나 OR을 무한대로 사용할 수 있다. 그렇기에 우선순위가 중요하다.
결론적으로 AND 가 OR 보다 우선순위가 더 높다.
그래서 괄호를 사용하여 먼저 필터링 될 수 있도록 조절할 수 있다

SELECT PROD_ID, PROD_PRICE, PROD_NAME
FROM PRODUCTS
WHERE (VEND_ID = 'DLL01' OR VEND_ID = 'BRS01')
AND PROD_PRICE>=10;
  • 괄호로 연산자를 묶으면 원하는 결과를 가져올 수도 있지만 모호함을 줄일 수도 있다.

IN 연산자

IN은 조건의 범위를 지정할 수 있다.

SELECT PROD_PRICE, PROD_NAME
FROM PRODUCTS
WHERE
--[1] VEND_ID = 'DLL01' OR VEND_ID = 'BRS01'
--[2] VEND_ID IN ('DLL01', 'BRS01')
ORDER BY PROD_NAME;
  • IN 연산자의 괄호 안에는 조건들이 나열된다. 2개 이상 사용할 수 있다!
  • IN연산자는 OR과 역할이 같다. 그래서 위의 [1]과 [2]는 같은 역할을 한다
  • 조건이 많다면 OR보다 IN이 빠르다

NOT 연산자

NOT은 뒤에 오는 조건을 역으로 만든다. 그래서 NOT은 앞에 적는다.

SELECT PROD_NAME
FROM PRODUCTS
WHERE
--[1] NOT VEND_ID = 'DLL01'
--[2] VEND_ID <> 'DLL01'
ORDER BY PROD_NAME;
  • 위의 경우 VEND_ID가 'DLL01'가 아닌 제품을 가져온다.
  • <>도 NOT과 같은 역할을 하기 때문에 [1]과 [2]는 같은 결과를 가져온다

LIKE 연산자

문자열이 포함된 행을 찾는 경우 단순 비교 연산자로는 부족하다.
이럴 때 와일드카드(Wildcard) 문자를 이용하면 된다. 와일드카드라는 특수문자를 사용해 검색패턴을 만들고 이를 통해 검색이 가능하다.
와일드카드는 WHERE 절에서 LIKE 연산자로 사용할 수 있다. (엄연히 LIKE는 연산자가 아니라 술어(predicate)라고 한다.)

% 와일드카드

: 임의의 수의 문자

SELECT PROD_ID, PROD_NAME
FROM PRODUCTS
WHERE PROD_NAME LIKE 'Fish%'
  • Fish로 시작하는 문자열을 가진 모든 행이 검색된다
  • 임의의 수의 문자라는 것은 Fish뒤에 어떤 길이의 문자열이 더 와도 괜찮다는 것이다 (심지어 길이가 0이어도 된다.)
  • Oracle은 LIKE 연산 시 대소문자를 구분한다.
  • 다양한 활용예시
    • '%fish%'
    • '%fish'
    • 'f%h' : 문자열의 시작은 f 끝은 h 이어야 한다.
  • NULL 인 행은 '%'로 검색되지 않는다.

후행공백

  • 전체 문자열을 저장할 수 있는 공간이 남았다면 그 공간을 공백으로 추가해서 DBMS가 채울 수도 있다.
  • Oracle은 'no fish'가 있다면 'n%h'로 검색되지 않고 'n%h%'로 검색해야할 수도 있다

_ 와일드카드

%와 달리 단 한 개의 문자를 대신한다.

SELECT PROD_ID, PROD_NAME
FROM PRODUCTS
WHERE PROD_NAME LIKE '__ inch teddy bear%'; -- (후행공백)
  • '_ _'이기 때문에 2개의 문자열만 대신할 수 있는 것이다

[] (집합) 와일드카드

oracle은 지원하지 않는다

^ (캐럿) 와일드카드

oracle은 지원하지 않는다
(참고로 NOT 과 같은 의미이다)