데이터베이스 SQL 구문 기초03(||, CONCAT(), LIKE, BETWEEN, IN, SUBSTR())
컬럼 값이 문자열인 컬럼의 값을 합치는 방법
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절을 사용할 때
가장 크게 분류 가능한 범위부터 (탐색 범위를 줄일 수 있는 조건부터)
사용하는 것이 좋다.
아웃풋이 우선..!
댓글남기기