기록

database - 술어 (LIKE, BETWEEN, IS NULL, IN, EXISTS) 본문

[Study]/Database

database - 술어 (LIKE, BETWEEN, IS NULL, IN, EXISTS)

Dannnnnn 2019. 7. 31. 10:22
반응형

술어란 ? 반환값이 진리값인 함수 (TRUE/FALSE/UNKWOUN)

 

대표적인 술어는 다음과 같다

- LIKE

- BETWEEN

- IS NULL, IS NOT NULL

- IN

- EXISTS

 

LIKE 술어 : 문자열 부분 일치 검색

전방일치 - 검색조건이 되는 문자열이 검색 대상 문자열의 가장 앞에 위치하고 있는 레코드만 검색

 

SELECT *

FROM SampleLike

WHERE strcol LIKE 'ddd%';

 

중간일치 - 검색 조건이 되는 문자열이 검색 대상 문자열의 '어딘가'에 포함되어 있으면 레코드가 선택됨 (가장 앞, 가장 뒤, 중간 모두 상관없음)

 

SELECT *

FROM SampleLike

WHERE strcol LIKE '%ddd%';

 

후방일치 - 검색조건이 되는 문자열이 문자열 가장 뒤에 오는 레코드만 검색

 

SELECT *

FROM SampleLike

WHERE strcol LIKE '%ddd';

 

참고로, % 대신에 _ (언더바)를 사용할 수 있지만, %와는 다르게 임의의 1문자을 의미한다.

-- strcol이가 'abc+임의의 2문자'로 구성된 레코드를 선택하는 쿼리 --

SELECT *

FROM SampleLike

WHERE strcol LIKE 'abc_ _';

 

 

BETWEEN 술어 - 범위 검색

-- 판매단가가 100~1000원인 상품 선택 --

SELECT goods_name, sell_price

FROM Goods

WHERE sell_price BETWEEN 100 AND 1000;

-- WHERE sell_price > 100 AND sell_price < 1000; -- 양극단 제외 (101~999)

 

 

IS NULL, IS NOT NULL - NULL 또는 비NULL 판정

특정 열이 NULL인 행을 선택하려면 '='을 사용할 수 없다. 이때는 IS NULL이라는 특수한 술어를 사용할 필요가 있다.

 

SELECT goods_name, buy_price

FROM Goods

WHERE buy_price IS NULL;

 

반대로, NULL이 아닌 행을 선택하려면 IS NOT NULL을 사용하면 된다.

 

SELECT goods_name, buy_price

FROM Goods

WHERE buy_price IS NOT NULL;

 

 

IN 술어 - OR의 간략 버전

-- 매입단가가 320원, 500원, 5000원인 상품만 선택하는 쿼리

SELECT goods_name, buy_price

FROM Goods

WHERE buy_price IN (320, 500, 5000);

 

-- 매입단가가 320원, 500원, 5000원을 제외한 상품만 선택하는 쿼리

SELECT goods_name, buy_price

FROM Goods

WHERE buy_price NOT IN (320, 500, 5000);

 

* IN과 서브쿼리

서브쿼리는 SQL 내부에 생성된 테이블이기 때문에 IN은 서브쿼리를 인수로 지정할 수 있다.

같은 의미로, IN은 뷰를 지정할 수 있다고도 말할 수 있다.

 

-- 부산점에 있는 상품의 판매단가를 구한다

SELECT goods_name, sell_price

FROM Goods

WHERE good_id IN (SELECT goods_id FROM StoreGoods WHERE store_id = '000C');

 

서브쿼리를 인수로 사용할 때 이점

데이터가 변해도 동일한 SELECT문을 사용할 수 있어서 반복 작업을 줄일 수 있다.

이와같이 데이터 변경에 강한 면모를 보이는 프로그램을 '유지보수성이 우수하다' 또는 '정비 작업 프리'라고 한다.

 

* NOT IN과 서브쿼리

IN의 부정형인 NOT IN도 마찬가지로 서브쿼리를 인수로 사용할 수 있다.

 

SELECT goods_name, sell_price

FROM Goods

WHERE goods_id NOT IN (SELECT goods_id FROM StoreGoods WHERE store_id = '000A');

 

 

EXISTS 술어

어떤 조건에 일치하는 레코드가 존재하는지 여부를 조사하는 기능을 한다.

-- EXISTS로 '부산점에 있는 상품의 판매단가'를 구한다

SELECT goods_name, sell_price

FROM Goods AS S

WHERE EXISTS (SELECT *

FROM StoreGoods AS TS

WHERE TS.store_id = '000C'

AND TS.goods_id = S.goods_id);

 

EXISTS는 오른쪽에 하나의 인수만 지정한다.

그리고 그 인수는 항상 서브쿼리이다.

 

NOT EXISTS 예시

-- NOT EXISTS를 이용해서 서울점에 있는 상품 이외의 상품의 판매단가를 검색.

SELECT goods_name, sell_price

FROM Goods AS S

WHERE NOT EXISTS (SELECT *

FROM StoreGoods AS TS

WHERE TS.store_id = '000A' AND TS.goods_id = S.goods_id); 

반응형