기록
database - 술어 (LIKE, BETWEEN, IS NULL, IN, EXISTS) 본문
술어란 ? 반환값이 진리값인 함수 (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);
'[Study] > Database' 카테고리의 다른 글
database - 집합 연산(UNION, INTERSECT, EXCEPT) (0) | 2019.08.02 |
---|---|
database - CASE 식 (CASE WHEN , ELSE , END) (0) | 2019.08.02 |
database - 다양한 함수 (날짜함수, 변환함수) (0) | 2019.07.30 |
database - 다양한 함수 (산술함수, 문자열함수) (0) | 2019.07.30 |
database - 상관 서브쿼리 (0) | 2019.07.29 |