Oracle DAY6 - SELECT / 연산자와 함수(기타 연산자, 문자열 함수)

어뮤즈온·2020년 12월 11일
0

Oracle

목록 보기
6/8
post-custom-banner

연산자

  • 산술연산자 (+, -, *, /)
  • 관계연산자 (>, <, >=, <=, =, !=(<>)) : 대소 관계를 비교할 때 사용하는 연산자
  • 논리연산자(AND, OR, NOT)

함수(FUNCTION)

  • 특정 기능을 수행하여 하나의 결과를 반환하도록 설계된 모듈
  • 컴파일되어 실행 가능한 상태로 제공
  • 문자열, 숫자, 날짜, 변환, 집계함수의 형태로 제공

기타 연산자

1) IN 연산자

  • 질의 탐색을 위해 2개 이상의 표현식(항목)을 지정
  • OR 연산자로 변환 가능

(사용형식)
컬럼명 IN(표현식1, 표현식2,...)

  • '컬럼명'에 저장된 값이 ( ) 안에 기술된 표현식 중 어느 하나와 일치하면 전체조건이 참

예)사원테이블에서 부서코드가 20, 60, 80번 부서에 속한 사원을 검색하시오.

(IN 연산자를 사용하지 않는 경우)
SELECT EMPLOYEE_ID AS 사원번호,
       EMP_NAME AS 사원명,
       DEPARTMENT_ID AS 부서코드,
       SALARY AS 급여
  FROM EMPLOYEES
 WHERE DEPARTMENT_ID=20 OR DEPARTMENT_ID=60 OR DEPARTMENT_ID=80
 ORDER BY DEPARTMENT_ID ASC;
 
(IN 연산자를 사용하는 경우)
SELECT EMPLOYEE_ID AS 사원번호,
       EMP_NAME AS 사원명,
       DEPARTMENT_ID AS 부서코드,
       SALARY AS 급여
  FROM EMPLOYEES
 WHERE DEPARTMENT_ID IN(20, 60, 80)
 ORDER BY 3; --SELECT 절에 나온 세번째 컬럼

2) SOME, ANY 연산자

  • 기본 기능은 IN 연산자와 동일

(사용형식)
컬럼명 관계연산자 ANY|SOME (표현식1, 표현식2,...)

  • IN 연산자는 동일성만 판단
  • ANY, SOME은 크기 비교도 가능
(ANY 연산자 사용)
SELECT EMPLOYEE_ID AS 사원번호,
       EMP_NAME AS 사원명,
       DEPARTMENT_ID AS 부서코드,
       SALARY AS 급여
  FROM EMPLOYEES
 WHERE DEPARTMENT_ID=ANY(20, 60, 80)
 ORDER BY 3;
 
 (SOME 연산자 사용)
 SELECT EMPLOYEE_ID AS 사원번호,
       EMP_NAME AS 사원명,
       DEPARTMENT_ID AS 부서코드,
       SALARY AS 급여
  FROM EMPLOYEES
 WHERE DEPARTMENT_ID=SOME(20, 60, 80)
 ORDER BY 3;

예)회원테이블에서 직업이 공무원인 회원이 가진 마일리지보다 더 많은 마일리지를 보유한 회원을 조회하시오. Alias 회원번호, 회원명, 직업, 마일리지

(직업이 공무원인 회원의 마일리지)
SELECT MEM_NAME, MEM_MILEAGE
  FROM MEMBER
 WHERE MEM_JOB='공무원'
 ORDER BY MEM_MILEAGE DESC;
 
SELECT MEM_ID AS 회원번호,
       MEM_NAME AS 회원명,
       MEM_JOB AS 직업,
       MEM_MILEAGE AS 마일리지
  FROM MEMBER
 WHERE MEM_MILEAGE > ANY (SELECT MAX(MEM_MILEAGE)
                            FROM MEMBER
 			   WHERE MEM_JOB='공무원')
-- IN : ( )안의 절과 같은 조건일 때 출력
-- ANY : ( )안의 절에서 제일 작은값보다 클때 출력

예)사원테이블에서 부서번호가 30,50,80부서에 속하지 않은 사원을 조회하시오. Alias 사원번호, 사원명, 부서번호, 입사일

SELECT EMPLOYEE_ID AS 사원번호,
       EMP_NAME AS 사원명,
       DEPARTMENT_ID AS 부서번호,
       HIRE_DATE AS 입사일
  FROM EMP
--WHERE DEPARARTMENT_ID NOT IN(30, 50, 80) --IN
 WHERE NOT DEPARTMENT_ID = ANY(30, 50, 80) --ANY
 ORDER BY 3;

3) ALL 연산자

  • 질의 탐색을 위해 2개 이상의 표현식(항목)을 지정
  • 모든 표현식의 평가 결과가 참이어야 WHERE 절이 참이되는 연산자(거의 사용되는 경우가 없다)
  • AND 연산자로 변환 가능

(사용형식)
컬럼명 ALL(표현식1, 표현식2,...)

4) EXISTS 연산자

  • 반드시 뒤에 서브쿼리가 나와야 함
  • 서브 쿼리의 결과가 한 건이라도 존재하면 참

(사용형식)
WHERE EXISTS (서브쿼리)

예)사원테이블에서 전체 사원의 평균급여보다 많은 급여를 수령하는 사원이 근무하는 부서코드를 조회하시오.

(전체 사원의 평균급여)
SELECT ROUND(AVG(SALARY))
  FROM EMPLOYEES;

SELECT DISTINCT DEPARTMENT_ID --DISTINCT 중복제거
  FROM EMPLOYEES
 WHERE EXISTS(SELECT 1
                FROM EMPLOYEES
               WHERE SALARY > (SELECT ROUND(AVG(SALARY))
                                 FROM EMPLOYEES))
 ORDER BY 1; 

5) BETWEEN 연산자

  • 범위를 지정하여 조건을 구성하는 경우 사용

(사용형식)
컬럼명 BETWEEN 값1 AND 값2

  • 컬럼명의 값이 값1에서 값2 사이의 값이면 참을 반환

예)회원테이블에서 마일리지가 1000~3000사이인 회원정보를 조회하시오. Alias 회원번호, 회원명, 마일리지

(AND 연산자 사용)
SELECT MEM_ID AS 회원번호,
	   MEM_NAME AS 회원명,
       MEM_MILEAGE AS 마일리지
  FROM MEMBER
 WHERE MEM_MILEAGE >= 1000 AND MEM_MILEAGE <= 3000;
 
 (BETWEEN 연산자 사용)
SELECT MEM_ID AS 회원번호,
	   MEM_NAME AS 회원명,
       MEM_MILEAGE AS 마일리지
  FROM MEMBER
 WHERE MEM_MILEAGE BETWEEN 1000 AND 3000;

6) LIKE 연산자 **문자열에만 사용**

  • 패턴을 비교하는 경우 사용하는 연산자
  • 와일드카드(패턴문자열)로 '%'와 '_'가 사용
  • '%' : '%'가 사용된 위치에서 그 이후에 나오는 모든 문자열과 대응
    ex) '김%' : '김'으로 시작하는 모든 문자열과 대응
    ㅤㅤ'%김' : '김'으로 끝나는 모든 문자열과 대응
    ㅤㅤ'%김%' : '김'이 존재하는 모든 문자열과 대응
  • ' _ ' : ' _ '가 사용된 위치에서 하나의 문자와 대응
    ex) '김_' : '김'으로 시작하고 2글자로 구성되며 두번째 글자는 어느글자든 상관없음
    ㅤㅤ'_김' : '김'으로 끝나는 2글자로 구성된 문자열과 대응

문자열 함수

  • 문자열 조작한 결과를 반환
    * 문자열 연산자 '||' : 자바의 문자열 연산자 '+'와 같이 두 문자열을 결합하여 하나의 문자열을 반환

예)회원테이블에서 회원번호, 회원명, 주민번호를 조회하시오. 단, 주민번호는 'xxxxxx-xxxxxxx' 형식으로 출력하시오.

SELECT MEM_ID AS 회원번호,
       MEM_NAME AS 회원명,
       MEM_REGNO1 || '-' || MEM_REGNO2 AS 주민번호
  FROM MEMBER;

1) CONCAT

  • 주어진 두 개의 문자얄을 결합하여 하나의 문자열을 반환
  • '||' 연산자와 같은 기능

(사용형식)
CONCAT(C1, C2)

  • C1과 C2를 결합하여 결과를 반환

예)회원테이블에서 회원번호, 회원명, 주민번호를 조회하시오. 단, 주민번호는 'XXXXXX-XXXXXXX' 형식으로 출시하되, CONCAT 함수 사용

 SELECT MEM_ID AS 회원번호,
        MEM_NAME AS 회원명,
        CONCAT(CONCAT(MEM_REGNO1, '-'), MEM_REGNO2) AS 주민번호
   FROM MEMBER; --위의 결과와 동일

2) INITCAP

  • 단어의 선두문자만 대문자로 출력
  • 보통 이름 출력시 사용

(사용형식)
INITCAP(C1)

  • C1에 포함된 단어의 첫 글자를 대문자로 변환
SELECT EMP_NAME FROM EMPLOYEES;

SLECT INITCAP(EMP_NAME) FROM EMPLOYEES;

3) UPPER, LOWER

  • 주어진 문자열에 포함된 글자를 대문자(UPPER) 또는 소문자(LOWER)로 변환하여 반환

(사용형식)
UPPER(col), LOWER(col)

4) ASCII, CHR

  • ASCII : 주어진 문자자료를 ASCII 코드값으로 변환
  • CHR : 주어진 숫자(정수, 1~65535)에 대응하는 문자 반환

(사용형식)
ASCII(col), CHR(col)

5) LPAD, RPAD

  • 특정문자열(패턴)을 삽입할 때 사용

(사용형식)
LPAD(c, n [,pattern])
RPAD(c, n [,pattern])

  • 주어진 문자열 'c'를 길이 'n'의 기억공간에 왼쪽부터 채우고(RPAD) | 오른쪽부터 채우고(LPAD) 남는공간에 'pattern'으로 정의된 문자열을 채움
  • 'pattern'이 생략되면 공백으로 채워짐

예)매입테이블에서 2005년 2월 매입현황을 조회하시오. 단, 매입단가는 9자리에 출력하되 남은 왼쪽공간에 '*'을 삽입하여 출력하시오. Alias 날짜, 매입상품코드, 수량, 단가

SELECT BUY_DATE AS 날짜,
       BUY_PROD AS 매입상품코드,
       RPAD(BUY_QTY,5) AS 수량, --뒤에 패턴이 공백이고 싶으면 생략하면 된다.
       LPAD(BUY_COST,9,'*') AS 단가
  FROM BUYPROD
 WHERE BUY_DATE BETWEEN '20050201' AND '20050228';

6) LTRIM, RTRIM, TRIM

  • 주어진 문자열에서 왼쪽(LTRIM) 또는 오른쪽(RTRIM)에 존재하는 문자열을 찾아 삭제할 때 사용
  • 양쪽에 존재하는 공백을 제거할때는 TRIM 사용

(사용형식)
LTRIM(c1 [,c2]), RTRIM(c1 [,c2]), TRIM(c1)
-c2가 생략되면 공백을 삭제

예)상품테이블에서 '대우'로 시작하는 상품명중 '대우'를 삭제하고 출력하시오. Alias 상품코드, 상품명, 분류코드, 거래처코드

SELECT PROD_ID AS 상품코드,
       PROD_NAME AS 상품명1,
       LTRIM(PROD_NAME,'대우 ') AS 상품명2,
       PROD_LGU AS 분류코드,
       PROD_BUYER AS 거래처코드
  FROM PROD
 WHERE PROD_NAME LIKE '대우%';

7) SUBSTR(c, n1[,n2])

  • 주어진 문자열에서 n1에서 시작하여 n2(갯수)만큼의 부분 문자열을 추출하여 반환
  • n2가 생략되면 n1 이후의 모든 문자열을 추출하여 반환
  • n1이 음수이면 뒤에서 부터 처리됨
  • n1은 1부터 counting
SELECT SUBSTR('IL POSTINO', 3, 4),
       SUBSTR('IL POSTINO', 3),
       SUBSTR('IL POSTINO', -3, 4)
  FROM DUAL;

8) REPLACE(c1, c2[,c3])

  • 주어진 문자열 c1에서 c2를 c3으로 대치(치환) 시킴
  • c3가 생략되면 c2를 제거함

예)상품테이블에서 상품명 중 '대우'를 찾아 'Apple'로 변경하시오.

SELECT PROD_ID,
       PROD_NAME,
       REPLACE(PROD_NAME, '대우','Apple')
  FROM PROD
 WHERE PROD_NAME LIKE '%대우%';

9) LENGTH(c), LENGTHB(c)

  • 주어진 문자열에서 글자수(LENGTH) 또는 기억공간의 크기(BYTE수, LENGTHB)를 반환
profile
Hello, world!
post-custom-banner

0개의 댓글