Search

반응형

'DATABASE'에 해당되는 글 20건

  1. 2020.09.18 [HOW]SQL EXISTS와 LIKE 검색 조건 사용하는 방법
  2. 2020.09.15 [HOW]SQL 집합 연산자(SET OPERATOR) 사용하는 방법, UNION, UNION ALL, INTERSECT, MINUS -오라클(ORACLE)
반응형

안녕하세요. 신기한 연구소입니다.

WHERE절에서 사용하는 조건 중 EXISTS와 LIKE가 있습니다.

EXISTS는 사실 잘못 알고 있는 개발자도 종종 있더군요.

LIKE 또한 ‘%’만 사용하는 경우도 있기에..

다양한 사용법을 알아봅니다.

 

 

먼저 EXISTS에 대해 알아봅니다.

사원 테이블에서 ‘PINGPONG’ 동호회에 가입한 사원들을 조회한다고 했을 경우

사원 테이블과 동호회 테이블을 조인(JOIN)해서 해당 사원들을 조회할 수 있습니다.

 

 

이렇게 조인(JOIN)을 통해서 원하는 데이터를 조회할 수 있습니다.

그럼 EXISTS를 사용해서 조회하는 쿼리를 보겠습니다.

 

 

같은 결과를 얻을 수 있습니다.

SELECT문에서 1을 사용한 것은 아래 따로 설명하겠습니다.

두 쿼리가 다른 점이 있습니다.

조인(JOIN)을 사용하면 FROM절에 해당 테이블을 추가하고

WHERE 절에서 조인 조건을 연결합니다.

하지만 EXISTS는 조인과 비슷하지만 별도의 쿼리를 사용해서

해당 컬럼의 데이터가 존재하는 여부를 확인합니다.

테이블이 많이 조인되어 있는 경우라든지

또는 존재 여부를 확인하는 경우에 여러 개의 테이블을 조인해야 하는 경우에도

단지 존재 여부를 확인하기 위해 FROM절에 테이블(들)을 넣고 조인을 시도한다면

엄청 복잡해질 수 있습니다.

EXISTS를 사용한다면 서브쿼리에 존재 여부 쿼리를 분리해서 사용한다면

가독성도 좋아지고 성능도 IN보다 더 좋습니다.

 

EXISTS의 특징을 확인해봅니다.

EXISTS 뒤에 ( )를 사용하고 서브 쿼리만 사용할 수 있습니다.

서브 쿼리의 결과를 가지고 해당 조건에 맞는 값이 존재한다면

메인 쿼리의 결과값이 조회됩니다.

중요한 사항이 있습니다.

위 쿼리에서 보는 것처럼 값을 확인할 컬럼에 대해

메인 쿼리의 컬럼과 EXISTS 내 서브 쿼리의

컬럼을 WHERE절에서 연결해야 합니다. (WHERE A.CLUBNO = B.CLUBNO)

그 부분이 생략되면 서브 쿼리의 데이터가 1개라도 나오면

EXISTS의 기능은 무의미해지고 전체가 조회됩니다.

선택한 컬럼값이 NULL이면 조건이 성립되지 않아서 조회가 안됩니다.

부정은 NOT EXISTS로 사용하면 됩니다.

 

 

NOT EXISTS는 IN,  != 또는 <>와는 다른 결과를 보여줍니다.

바로 NULL에 대한 부분입니다.

NOT EXISTS는 조건에 맞는 데이터의 부정이 NULL이라도 조회가 됩니다.

WHERE CLUBNO <> '10' OR CLUBNO IS NULL와 같은 결과를 보입니다.

하지만 IN,  != 또는 <>는 NULL을 제외하고 검색이 됩니다.

 

SELECT문에 아무 컬럼을 써도 되고 단순한 어떤 상수값을 넣어도 문제가 되지 않습니다.

이유는 조건에 맞는 결과값이 있는지를 체크만 하기에

SELECT문에 어떤 표현식이 와도 상관 없는 겁니다.

 

LIKE문

 

정확한 값을 모르거나

또는 일부 값을 가지고 검색을 하고 싶다면

LIKE를 사용하면 됩니다.

김씨 성을 가진 사원을 검색하고 싶다면

WHERE 절에 NAME LIKE ‘김%’으로 사용하면 됩니다.

 

 

사용 방법에 대해 설명해봅니다.

우선 원하는 컬럼 뒤에 LIKE 키워드를 사용합니다.

그리고 그 뒤에 싱글 쿼테이션으로 검색단어를 감쌉니다.

검색 단어를 포함한 모든 정보를 찾으려면 %를 원하는 위치에 붙여줍니다.

김씨 성이면 ‘김%’

상품 이름 가운데 ‘매운’이 들어간다면 ‘%매운%’으로 하는데 매운으로 시작하거나 또는

매운으로 끝나는 단어도 같이 검색됩니다.

상품 이름 끝부분이 ‘라면’이라면 ‘%라면’을 사용합니다.

 

 

‘%’ 외에도 ‘_’를 사용할 수 있는데

%가 범위 관계없이 길이 전체에 대해 검색하는 조건이라면

_는 한 글자에 대해 검색합니다.

예를 들어 홍 씨 성을 가지면서 준으로 끝나는 3글자 이름에 대해 검색한다면

‘홍%준’으로 했을 경우 이름이 2글자나 4글자 이상인 경우도 검색될 수 있습니다.

하지만 원하는 데이터는 3글자가 기준이므로

_를 사용해서 ‘홍_준’으로 하면 됩니다.

총 아이디 길이는 10자리지만 아이디가 6자이면서 a로 시작한다면

‘a_____’으로 사용하면 되겠네요.

 

 

LIKE도 NOT을 사용할 수 있습니다.

 

 

NOT LIKE도 NULL값은 조회가 안됩니다.

WHERE CLUBNO NOT LIKE '1%' AND CLUBNO IS NULL

이렇게 해야 '1%' 값이 아니면서 NULL 포함해서 조회가 가능합니다.

이전 부분에 대해 잘 확인하시고

사용해야 합니다.

 

항상 NULL이 문제네요. ㅎㅎ

 

잘못된 내용이나 수정이 필요하면 댓글 주세요

아래 하트(공감) 버튼을 눌러서 더 다양한 글을 쓸 수 있게 응원 부탁드립니다. 감사합니다.

반응형
반응형

안녕하세요. 신기한 연구소입니다.

조인(JOIN)을 사용하지 않고 두 개의 테이블을 사용해서 조회하는 방법으로

집합 연산자를 사용할 수 있습니다.

 

 

수학에서도 배웠던 합집합, 교집합 등과 같은 개념인데요.

총 4가지 연산자가 있으니 각각의 특징을 같이 살펴보도록 합니다.

 

UNOIN

두 개 이상의 쿼리를 작성해서 합집합을 만드는 연산자입니다.

두 개의 쿼리를 합친다면 SELECT 문의 컬럼도 같아야 합니다. 합쳐야 하니까요.

그리고 두 쿼리 사이에 UNION을 넣고 합치면 됩니다.

UNION은 중복된 데이터가 있다면 하나로 표현합니다.

 

 

 

첫 번째 쿼리와 두 번째 쿼리 둘 다 7건이 나옵니다.

UNION으로 결합하면 14건이 아닌 중복된 데이터를 제거하고 9건만

조회됩니다.

 

UNION ALL

 

같은 쿼리를 UNION ALL로 합쳤습니다.

UNION ALL도 합집합이지만 중복된 행도 조회됩니다.

 

 

조회를 하면 각각 7건씩 총 14건이 조회됨을 확인할 수 있습니다.

 

INTERSECT

이 연산자는 교집합을 나타냅니다.

두 쿼리간 같은 값들만 추출해서 보여주는데

SELECT문의 컬럼들 모두가 일치해야 합니다.

 

 

5건이 조회되었습니다.

 

MINUS

이 연산자는 차집합을 나타냅니다.

먼저 조회된 쿼리에서 다음 쿼리의 결과값을 뺀 나머지를 보여줍니다.

 

 

2건이 조회되었습니다.

 

이렇게 4가지 집합 연산자에 대해 알아봤습니다

주의할 점이 있습니다.

 

우선 정렬하는 방법에 주의해야 합니다.

각 쿼리에서 ORDER BY를 사용할 수 없고

SET 연산을 한 마지막 쿼리 뒤로 ORDER BY를 사용할 수 있습니다.

어짜피 여러 개의 쿼리를 합쳐서 하나의 결과를 얻는 게 목적이고

그 결과에 대해 정렬(ORDER BY)를 하는 게 맞겠지요?

미리 ORDER BY 해도 합치는 과정에 의미가 없어지기 때문입니다.

 

 

그리고 BLOB, CLOB 등의 타입의 컬럼은 SELECT문에서 사용할 수 없으며

LONG 타입은 UNION ALL만 SELECT문에서 사용이 가능합니다.

나머지 연산자는 LONG 타입을 사용하면 오류가 납니다.

 

조인(JOIN)해서 데이터를 구하기 힘들거나

두 가지 쿼리에 대해 대사를 하는 과정에서

데이터가 안 맞을 때 교집합, 차집합을 이용해서

잘못된 데이터를 찾는데 활용하곤 했습니다.

 

잘못된 정보나 수정이 필요한 부분이 있으면 댓글 주세요.

아래 하트(공감) 버튼을 눌러서 더 다양한 글을 쓸 수 있게 응원 부탁드립니다. 감사합니다.

반응형