본문 바로가기

배우기/복습노트[oracle sql]

[복습] SQL | Oracle 부정연산자 not equal join 과 exists 연산자 + 복습후기(20231114)

728x90
반응형

먼저 부정연산자 중에 not equal in이 있다.

!= 이것인데, 이 부정연산자 not equal은

  STEP 1) join할 테이블의 모든 카티시안 곱(발생 가능한 모든 조합)을 만든 후에

  STEP 2) 모든 조합에서 조건이 일치하지 않은 데이터만 선택한다

    → 따라서 의도하지 않은 데이터가 출력될 가능성이 높으므로 주의하여야 한다.

 

다음은 exists 연산자이다.

exists 연산자는 서브쿼리의 참/거짓 여부를 참고하여 메인쿼리의 필터링을 하는 연산자이다.

메인쿼리의 비교 컬럽 없이 현업에서는 주로 'X'를 쓴다.

부정연산자로는 not exists가 있다.

 

728x90

 

예를 들어 설명해보겠다.

아래 두 테이블을 사용하여 블랙리스트 고객 정보를 출력하는 쿼리와 블랙리스트가 아닌 고객을 출력하는 쿼리를 각각 작성하여라.

 

블랙리스트를 추출하는 쿼리는 간단하다.

 

 

그 다음은 블랙리스트가 아닌 고객을 추출해보자.

먼저 잘못된 쿼리이다.

위의 부정연산자 사용이 왜 잘못되었냐면,

카티시안 프로덕트로 인하여 모든 조합이 출력된다.

먼저 1번 홍길동은 3번 최길동과 비교하게 되고, 1번 != 3번 이므로 1번이 추출된다.

그 다음 1번 홍길동은 4번 김길동과 비교하고, 1번 != 4번 이므로 1번이 추출된다.

2번도 마찬가지이다. 문제는 3번 최길동이 3번 최길동과 비교하게 될 때이다. 

일단 3번과 3번은 일치하므로 블랙리스트 중 3번이 추출되지 않는다.

그런데 3번과 4번을 비교하게 되면 3번 != 4번 이므로 3번이 추출된다.

4번도 마찬가지로 4번과 비교하게 되면 4번은 추출되지 않으나 3번과 비교하게되면 같지 않으므로 4를 추출하게 된다.

그렇기 때문에 != 연산자를 이용한 추출은 잘못된 정보를 출력해낼 수 있다.

 

아래 세 가지 방법으로 해결할 수 있다.

 

sol3)은 not exists 다음 괄호 안에 select 문에서 where절에서 참, 거짓을 판별하므로 select 절에는 어떤 것이 와도 상관이 없다. 현업에서는 'X' 을 주로 사용하며 * 이 오든 1이 오든 상관은 없다.

 

아래 쿼리를 실행하면 몇 개의 행이 출력될까?

참고로 총 14행이며 10부서 행은 3, 20부서 행은 5, 30부서 행은 6줄이다.

1. 14
2. 0
3. 3
4. 14*14

 

정답은 1번이다.

메인쿼리 결과와 상관 없이 서브쿼리 결과가 항상 참이므로 모든 행이 참의 결과를 갖고 출력되기 때문이다.

 

 

그럼 아래 쿼리를 실행하면 몇 개의 행이 출력될까?

1. 14
2. 0
3. 3
4. 14*14

 

정답은 2번이다.

 

 

복습 후기

오늘은 학원에 있을 때 복습을 다 완료하였다. 실습문제도 다 풀었는데 생각해보니 SQLD 문제를 안 푼 것 같다.

이거 마무리하고 얼른 가서 풀어야지.

오늘은 운동할 수 있겠다.

728x90
반응형