컬럼간 연결, 문자/날짜 함수, BETWEEN, LIKE

유동현·2022년 10월 9일
0

오라클

목록 보기
4/18

컬럼 연결

--○TBL_EMP 테이블의 데이터를 활용하여
-- 다음과 같은 결과를 얻을 수 있도록 쿼리문을 구성한다.
-- SMITH's 의 입사일은 1980-12-17이다 그리고 급여는 800이다. 처럼 나오게
-- ALLEN's 의 입사일은 1980-12-17이다 그리고 급여는 1600이다.

SELECT ENAME
       ||'''s 입사일은'
       ||HIREDATE
       ||'이다. 그리고 급여는 '
       ||SAL
       ||'이다.'
FROM TBL_EMP;
--※문자열을 나타내는 홀따옴표 사이의 홀따옴표 2개가 홀따옴표 한개를 의미하게 된다.
--홀따옴표 ' 한개는 문자열의 시작을 나타내고
--홀타옴표 ''두개는 문자열 영역 안에서 ' 한개를 나타낸다.

🧐문자 함수

  • UPPER()
    전체 대문자로 변환
  • LOWER()
    전체소문자로 변환
  • INITCAP()
    첫글자만 대문자로 변환후 나머지는 소문자로 변환 하고 반환

사용법

--○TBL_EMP 테이블을 대상으로 검색값이 'saLeSmAN'인 조건으로
-- 영업사월(세일즈맨)의 사원번호,사원명,직종명을 조회

SELECT EMPNO "사원번호", ENAME "사원명", INITCAP(JOB) "직종명" 
FROM TBL_EMP
WHERE INITCAP('saLeSmAN') = INITCAP(JOB);

--WHERE LOWER(JOB) = LOWER('saLeSmAN')

날짜 함수

  • TO_DATE()
    이렇게 만들어낸 DATE형 값은 >= 와같이 크기비교가 가능
--※오라클에서는 날짜 데이터의 크기 비교가 가능하다.
--비교기준으로 미래가 더 큰값

SELECT ENAME "사원명", JOB "직종명", HIREDATE "입사일"
FROM TBL_EMP
WHERE HIREDATE = TO_DATE('1981-09-28','YYYY-MM-DD');

# 비교 함수

BETWEEN A AND B

--○Between A AND B

SELECT ENAME, JOB, HIREDATE
FROM TBL_EMP
WHERE HIREDATE BETWEEN TO_DATE('1981-04-02','YYYY-MM-DD') 
      AND TO_DATE('1981-09-28','YYYY-MM-DD');

--○TBL_EMP 테이블에서 급여가 2450에서 3000사이의 직원들을 모두 조회

SELECT *
FROM TBL_EMP
WHERE SAL BETWEEN 2450 AND 3000;

--○TBL_EMP 테이블에서 'C'로 시작하는 이름부터 'S'로 시작하는 이름인경우
SELECT*
FROM TBL_EMP
WHERE ENAME BETWEEN 'C' AND 's';

단 마지막 예제에서 소문자 's' 가 아닌 대문자'S'를 넣고 결과를 출력하면 's' or 'S' 로 시작하는 이름은 나오지 않는다.

SMITH 나 SCOTT가 안나오는 이유는 둘다 사전적으로 S보다 뒤에 있기때문이고 CLARK는 사전적으로 C보다 뒤에있기에 나온것

문자형일 경우 아스키코드 순서를 따르기 때문에(사전식 배열)
대문자가 앞쪽에 위치하고 소문자가 뒤쪽에 위치한다.
또한 BETWEEN A AND B는 해당 구문이 수행되는 시점에서
오라클 내부적으로는 부등호 연산자의 형태로 바뀌어 연산 처리된다.

아스키 코드에 따르면 소문자는 대문자보다 이후에 있으므로
이름이 대문자로 구성되있을경우 S로 시작하는 모든 이름을 나오게 하고싶다면
아스키 코드에 따라 소문자 s 로 BETWEEN 'C' AND 's' 로 두면
S로 시작하는 이름들이 나오게 된다.

✏️BETWEEN A AND B 는 날짜형 숫자형, 문자형 데이터 모두에 적용된다.


IN, OR, =ANY

SELECT ENAME, JOB, SAL
FROM TBL_EMP
WHERE JOB = 'SALESMAN'
    OR JOB = 'CLERK';

SELECT ENAME, JOB, SAL
FROM TBL_EMP
WHERE JOB IN ('SALESMAN','CLERK');

SELECT ENAME, JOB, SAL
FROM TBL_EMP
WHERE JOB =ANY ('SALESMAN','CLERK');

위 세가지의 결과는 같다.
단 세개중 OR 쿼리문이 가장 빠르게 처리된다.
물론 메모리에 대한 내용이 아닌 CPU에 대한 내용일뿐
이 부분까지 감안해 쿼리문을 구성하는경우는 거의없고
INT = ANY 모두 OR로 변경되어 연산처리됨

이중 가장 중요한 LIKE 의 사용법

--WILD CARD(CHARACTER) -> %
-- LIKE와 함께 사용되는 % 는 모든 글자를 의미한다.
-- LIKE와 함께 사용되는 _ 는 아무글자 한개를 의미한다.

--※TBL_SAWON에서 성씨가 고 씨인 사원의 
-- 사원명 주민번호 급여 항목을 조회한다.
SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '고__';
--끝이 고 인 사람을 찾고싶다면 __고 로 하면된다.

SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '고%';
--글자가 뒤에 없어도 몇글자가 되도 상관없다는 %

--○TBL_SAWON 테이블에서 사원의 이름에 이라는 글자가
-- 하나라도 포함되어 있다면 그 사원의 
-- 사원번호,사원명,급여항목 조회

SELECT SANO,SANAME,SAL
FROM TBL_SAWON
WHERE SANAME LIKE '%이%';
/*
1005	이정재	1000
1006	아이유	3000
1007	이하이	4000
1008	인순이	1500
1016	이이경	1500
*/

--○TBL_SAWON 테이블에서 사원의 이름에 이 라는 글자가 두번 들어있는 사원의
-- 사원번호,사원명,급여 항목 조회
SELECT SANO,SANAME,SAL
FROM TBL_SAWON
WHERE SANAME LIKE '%이%이%';
/*
1007	이하이	4000
1016	이이경	1500
*/

--○TBL_SAWON 테이블에서 사원의 이름에 이 라는 글자가
--연속으로 두번 들어있는 사원의
--사원번호,사원명,급여 항목을 조회한다.
SELECT SANO,SANAME,SAL
FROM TBL_SAWON
WHERE SANAME LIKE '%이이%';

이렇게 쓸수도있다.

SELECT SANO,SANAME,SAL
FROM TBL_SAWON
WHERE SANAME LIKE '_보%'; --외자 세글자 전부 가능

주민번호와 같은 숫자형에서는

SELECT SANAME,JUBUN,SAL
FROM TBL_SAWON
WHERE JUBUN LIKE '______2%' 
     OR JUBUN LIKE '______4%';

SELECT SANAME,JUBUN,SAL
FROM TBL_SAWON
WHERE JUBUN NOT LIKE '______1______' 
AND NOT JUBUN LIKE '______3______';

INSERT INTO TBL_WATCH(WATCH_NAME,BIGO)
VALUES('금시계','순금 99.99% 함유된 최고급 시계');

INSERT INTO TBL_WATCH(WATCH_NAME,BIGO)
VALUES('은시계','고객 만족도 99.99점을 획득한 최고의 시계');

-- 99.99% 라는 글자가 포함된 행의 데이터를 조회

SELECT *
FROM TBL_WATCH
WHERE BIGO LIKE '%99.99\%%' ESCAPE '\';
--\다음에 오는문자를 wild card에서 탈출시켜라 라는 의미
--$,@ 등 대부분의 특수문자 뭐로든 가능하다. 다만 쿼리문에서
--사용하지 않는 특수문자를 쓰는게 좋다.

--※ESCAPE로 정한 문자의 다음 한글자를 와일드 카드에서 탈출시켜라..
--일반적으로 사용 빈도가 낮은 특수문자(특수기호)를 사용한다.

💡참고: 함수앞에 NOT 을쓰면 ~가 아닌것들과 같은 식으로 올라가게된다.

0개의 댓글