비교 연산자(!=)와 NULL, 발생 가능한 실수

비교 연산자에서는 NULL이 배제된다.
(반면 논리 연산자에서는 NULL이 배제되지 않는다.)

 

가령,

Query 1.

SELECT *
FROM A FULL OUTER JOIN B ON ~
WHERE A.컬럼1 = ‘값1’ OR B.컬럼2 = ‘값2’

 

위 Query 1. 결과는 아래 Query 2.  결과와 일치하지 않는다.

 

Query 2.

SELECT *
FROM A FULL OUTER JOIN B ON ~
WHERE A.컬럼1 != ‘값1’ AND B.컬럼2 = ‘값2’

UNION

SELECT *
FROM A FULL OUTER JOIN B ON ~
WHERE A.컬럼1 = ‘값1’ AND B.컬럼2 != ‘값2’

(A, B의 컬럼 차수 및 데이터형은 일치한다고 가정한다)

 

A.컬럼1 과 B.컬럼2 의 NULL 값이 결과에서 배제되기 때문에
해당 컬럼의 NULL 존재 여부에 따라서 Query 2. 의 결과 수가 Query 1.보다 적을 수도 있다.

비교 연산자에서 NULL이 배제된다는 점을 고려했을 때,
Query1 과 동일한 결과를 도출하기 위해서 올바른 Query는 다음과 같다.

 

Query 3.

SELECT *
FROM A FULL OUTER JOIN B ON ~
WHERE A.컬럼1 = ‘값1’ AND (B.컬럼2 != ‘값2’ OR B.컬럼2 IS NULL)

UNION

SELECT *
FROM A FULL OUTER JOIN B ON ~
WHERE (A.컬럼1! = ‘값1’ OR A.컬럼1 IS NULL) AND B.컬럼2 = ‘값2’

(A, B의 컬럼 차수 및 데이터형은 일치한다고 가정한다)

 

결론 : 비교 연산자와 논리 연산자를 함께 사용할 경우, NULL 처리에 유의하자!

광고

Oracle FETCH 함수

1. TOP-N (12c 이전)

SELECT *
FROM ( SELECT prod_id, amount_sold
FROM sales
ORDER BY amount_sold)
WHERE rownum <= 5;

2. FETCH (12c)

SELECT prod_id, amount_sold
FROM sales
ORDER BY amount_sold
FETCH FIRST 5 ROWS ONLY;


응용 case 1. amount_sold 높은 순, 순위 중복 허용

SELECT prod_id, amount_sold
FROM sales
ORDER BY amount_sold DESC
FETCH FIRST 5 ROWS WITH TIES;


응용 case 2. 특정 구간

SELECT prod_id, amount_sold
FROM sales
ORDER BY amount_sold
OFFSET 5
FETCH NEXT 5 ROWS ONLY;


cf. FETCH 함수 SYNTAX

[ OFFSET offset { ROW | ROWS } ]
[ FETCH { FIRST | NEXT }[ { rowcount | percent PERCENT } ] { ROW | ROWS } { ONLY | WITH TIES } ]

편.안.
출처: https://oracle-base.com/articles/12c/row-limiting-clause-for-top-n-queries-12cr1

Oracle SQL #01 중복 값 추출

요구사항

테이블에서 컬럼의 중복된 값만 추출

1. GROUP BY 미 사용

SELECT *
FROM 테이블
WHERE 컬럼 IN(
SELECT 컬럼
FROM (
SELECT 컬럼, ROW_NUMBER() OVER(PARTITION BY 컬럼 ORDER BY NULL) AS 행번호
FROM 테이블
WHERE 행번호=’2′
)
ORDER BY 컬럼

2. GROUP BY 사용

SELECT *
FROM 테이블
WHERE 컬럼 IN(
SELECT 컬럼
FROM 테이블
GROUP BY 컬럼
HAVING COUNT(컬럼)>1
)
ORDER BY 컬럼

 

성능을 고려했을 때 GROUP BY를 사용하지 않는 것이 권고된다.

Oracle DB 12c Client 설치 및 DB 접속

1. Oracle DB version 확인

Oracle DB 12c

2. 다운로드

link

3. 설치

*INS-30131 에러 발생 시
ins-30131
cmd 에서 다음과 같이 실행
‘client 설치 경로’\setup.exe -ignorePrereq -J”-Doracle.install.client.validate.clientSupportedOSCheck=false”

4. 개발 DB 접속정보 수령 (tnsnames.oRA 파일)

– 접속계정(사용자 이름)
– 비밀번호
– tnsnames.oRA 파일

*tnsnames.oRA 파일 내에 IP, Port, DB Name (SID) 정보가 있음.***=
(DESCRIPTION=
(ADDRESS=
(PROTOCOL=TCP)
(HOST=**.**.**.**)
(PORT=****)
)
(CONNECT_DATA=
(SERVICE_NAME=***)
)
)

 

5. tnsnames.oRA 파일 복사/붙여넣기

C:\app\client\Admin\product\12.1.0\client_1\network\admin\sample

위 경로에 tnsnames.oRA 파일 복사/붙여넣기

6. tnsnames 디렉토리 설정

도구 – 환경설정 – 데이터베이스 – 고급 – Tnsnames 디렉토리
C:\app\client\Admin\product\12.1.0\client_1\network\admin\sample 해당 경로 설정
tnsoraconfigure


7. SQL Developer 실행

 

8. DB 접속 정보 입력

dbaccess.png
– 접속 이름: 임의
– 사용자 이름 : 접속 계정 입력
– 비밀번호 : 비밀번호 입력
-Oracle : 접속 유형 – TNS – 네트워크 별칭 선택 – 테스트 – 접속

*접속 유형을 기본으로 설정 후 일일히 입력하는 방법도 가능
– 호스트 이름 : IP 주소
– 포트 : 포트
– SID : DB Names (SID)