컬럼 값이 문자열인 컬럼의 값을 합치는 방법

SELECT EMPNO + ENAME FROM EMP;

->에러 발생

문자열의 경우 + 로 연산할 경우 오류 발생

SELECT EMPNO || ENAME AS EE FROM EMP;

문자열의 경우 ||를 사용해서 컬럼의 값을 결합할 수 있다.

다음과 같이 할 수도 있다.

SELECT EMPNO || '-' || ENAME AS EEE FROM EMP;

 


CONCAT()

문자열을 합치는 다른 방법으로 CONCAT()함수를 사용할 수 있다.

SELECT CONCAT(EMPNO, '-') FROM EMP;

CONCAT()의 사용 예시는 위와 같다.

중첩도 사용 가능

SELECT CONCAT(CONCAT(EMPNO, '-'), ENAME) AS EE FROM EMP;

 


LIKE

특정 문자가 들어있는 문자열을 찾을 때 사용한다.

예시

컬럼 LIKE '%값%', 컬럼 LIKE '_값_', NOT LIKE '%값%'

 

%: 특정 글자 들어간 컬럼 값 찾을 때 사용

SELECT ENAME FROM EMP

WHERE ENAME LIKE 'B%' OR ENAME LIKE 'C%';

like 되도록 쓰지 말 것: index 못씀

full scan하기 때문에

like는 조건에 사용

_ : 한 글자 뒤에 찾는 특정 값이 있는 지 찾을 때 사용.

SELECT ENANE FROM EMP

WHERE ENAME LIKE '_L%'

위의 쿼리문은 두 번째 글자가 ‘L’인 값을 찾는다.


BETWEEN

BETWEEN A AND B

A<= X <=B를 만족하는 컬럼 값 X를 찾는다.

SELECT SAL FROM EMP

WHERE SAL BETWEEN 2000 AND 3000;

 

이름 찾기

SELECT ENAME FROM EMP

WHERE ENAME BETWEEN 'B' AND 'D';

B~부터 D~까지 사전 순 조회

더 엄밀하게 하기 위해선

SELECT ENAME FROM EMP

WHERE ENAME >= 'B' AND ENAME < 'D'

 

한글 이름 찾는 법

SELECT ENAME FROM EMP

WHERE ENAME >= '가' AND ENAME < '힣'

 

특정 날짜 구간 조회

81년도, 82년도 입사자 조회

SELECT ENAME, HIREDATE FROM EMP

WHERE HIREDATE BETWEEN '1981-01-01' AND '1982-12-31';

이건 오라클 옵티마이저가 허용해줘서 결과가 출력되는 것.

좀 더 엄밀한 조회 방식은 아래와 같다.

SELECT ENAME, HIREDATE FROM EMP

WHERE HIREDATE BETWEEN TO_DATE('1981-01-01', 'YYYY-MM-DD')

AND TO_DATE('1992-12-31', 'YYYY-MM-DD');

 

NLS의 날짜 인식

SELECT ENAME, HIREDATE FROM EMP

WHERE HIREDATE BETWEEN TO_DATE('1981', 'YYYY')

AND TO_DATE('1992', 'YYYY');

이렇게 작성할 경우 1981년도 일부만 출력이 되는데,

NLS가 1981년을 11월 1일 이후로 인식해서 81년도 정보가 11월 이후부터 나온다. 즉 한정되게 출력된다.

CREATE TABLE DATE_TEST(
    MY_DATE DATE
);

로 테이블을 생성한 후에

INSERT INTO DATE_TEST VALUES(TO_DATE('2024', 'YYYY'));

로 테스트를 해 본 결과,

2024-11-01 00:00:00으로 출력이 되었다.

SQL 문법 상 맞지만, 이렇게 출력되는 현상은 좀 더 깊은 차원의 설정에서 다루어야 할 문제라고 생각한다.

 


IN

사용 예시

컬럼 IN(A,B,C), 컬럼 NOT IN(A,B,C)

()안에 있는 값 중에 하나만 있어도 조회 가능.

SELECT ENAME, DEPTNO

FROM EMP

WHERE DEPTNO IN (10, 20);

 

부정 : NOT IN

SELECT ENAME, DEPTNO

FROM EMP

WHERE DEPTNO NOT IN (10, 20);

 

조건 연산자로 아래와 같이 작성이 가능하다.

SELECT ENAME, DEPTNO

FROM EMP

WHERE DEPTNO != AND DEPTNO != 20;

 

COMM을 받는 사원 정보 출력

SELECT ENAME, COMM

FROM EMP

WHERE COMM IS NOT NULL AND COMM > 0;

또는 NVL을 사용해서

SELECT ENAME, COMM

FROM EMP

WHERE NVL(COMM, 0) > 0;

 

SELECT ENAME, COMM

FROM EMP

WHERE COMM NOT IN (0);

이것도 정상적으로 출력이 되지만,

SQL ‘IN’ 쿼리에서 Null 값의 영향을 보면 IN 쿼리가 NULL 값을 인식하지 못한다는 것을 알 수 있다.


SUBSTR

SUBSTR() 함수를 사용하면, 문자열에서 원하는 구간 만큼을 잘라서 확인할 수 있다.

SELECT HIREDATE, SUBSTR(HIREDATE, 1, 4) AS SS FROM EMP

WHERE SUBSTR(HIREDATE, 1, 4) IN ('1980', '1981');

 

SELECT ENAME

FROM EMP

WHERE SUBSTR(ENAME, 1, 1) = 'C' OR SUBSTR(ENAME, 1, 1) = 'B';

이것보다

SELECT ENAME

FROM EMP

WHERE SUBSTR(ENAME, 1, 1) IN ('B', 'C');

이 그나마 더 낫다.


기타 메모

원본 컬럼에 변형을 가하지 않는게 좋다.

그래서 성능적으로는 NVL()을 쓰지 않는게 좋다.

인덱스 사용 불가. 검색이 느려질 수 있다.

ANSI는 가장 기본적인 표준. 함수에 대해서는 적용되는 부분이 적다.

오라클에선 예약어로 컬럼명을 만들면 오류 발생

SQL은 수학 문제와 비슷하다.

기본 공식으로 응용과 창작을 하는 것

성능 측면에서 WHERE절을 사용할 때

가장 크게 분류 가능한 범위부터 (탐색 범위를 줄일 수 있는 조건부터)

사용하는 것이 좋다.

아웃풋이 우선..!

댓글남기기