SUB QUERY 란 ?

QUERY 안의 QUERY
한 개의 행(ROW, RECORD, 한 사람에 해당하는 데이터)에서 결과 값이 반환되는 QUERY

서브 칼럼이 *이 아닌 이상 서브 칼럼이랑 외부 칼럼이 같아야 한다.
사용 : 테이블이 있는데 걸러내서 산출하고 싶을 때

 

 

현재까지 배운 종류

- SELECT  단일 ROW 단일 COLUMN (산출되는 데이터는 한 개, 컬럼도 한 개)
- FROM    다중 ROW 다중 COLUMN
- WHERE   다중 ROW 다중 COLUMN(제일 많이 사용)


SELECT절 

-- hr 스키마

SELECT employee_id, first_name,
    (SELECT first_name -- 단일 COLUMN
        FROM employees
            WHERE employee_id = 100) -- 단일 ROW
FROM employees;


SELECT first_name,
    (SELECT SUM(salary) FROM employees),
    (SELECT AVG(salary) FROM employees)
FROM employees;


-- 평균월급에 내 월급이 얼마인지 비교

SELECT first_name, salary,  (SELECT AVG(salary) FROM employees)
FROM employees
WHERE department_id = 30;

 

 

 

FROM절

-- 100번 부서에 있는 사람만 걸러내서 테이블을 만듯 것
-- 그테이블의 값을 받아낸 것
-- 별칭으로도 내보낼 수 있다.

SELECT EMPNO, NAME ,SAL
FROM ( SELECT employee_id EMPNO, first_name NAME ,salary SAL
        FROM employees
         WHERE department_id = 100)
WHERE SAL > 8000;     


-- 부서번호가 50번, 급여가 6000이상인 사원

SELECT  employee_id, first_name, last_name, salary
FROM ( SELECT *
        FROM employees
        WHERE department_id = 50)
WHERE salary >= 6000;  


-- 업무별 급여의 합계, 인원수, 사원명, 월급

SELECT e.employee_id, e.first_name,j.급여합계, j.인원수
FROM employees e, (SELECT job_id, SUM(salary) 급여합계, COUNT(*) 인원수                   
                    FROM employees
                    GROUP BY job_id) j;




WHERE절

-- 평균 급여보다 많은 사원

SELECT employee_id, first_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary)
                FROM employees);


-- 부서 90인 사원의 업무명 

SELECT job_id, first_name, department_id
FROM employees
WHERE job_id IN (SELECT job_id
                FROM employees
                WHERE department_id = 90);


-- 부서별로 가장 급여를 적게 받는 사월의 급여와 같은 급여를 받는 사원

SELECT first_name, salary, department_id
FROM employees
WHERE salary IN (SELECT MIN(salary)
                    FROM employees
                        GROUP BY department_id);
                        
                        
-- 부서별로 가장 급여를 적게 받는 사원과 급여
-- GROUP으로만 못구할 때 서브쿼리 사용
SELECT first_name, employee_id, salary, department_id
FROM employees
WHERE (department_id, salary) IN (SELECT department_id, MIN(salary)
                                  FROM employees
                                  GROUP BY department_id);

JOIN(만나다)

두 개 이상의 테이블을 연결해서 데이터를 검색하는 방법
보통 두개이상의 행(ROW)들의 공통된 값 기본키(PRIMARY KEY), 외래키를 사용해서 JOIN 한다.
    
현재 테이블의 외래키(model F)를 통해 상대 테이블의 기본키(model P & U)에 연결
    
목적 : 현재 테이블에 없는 값을 상대 테이블의 정보(칼럼)에서 산출하기 위한 것.
      
기본키(Primary key) : 테이블에서 중복되지 않는 키 (model P)
외래키(Foreign key) : 다른 테이블에서 기본키이거나 고유키인 경우가 많다. (model F)


    

 

JOIN 종류

inner join = 교집합  ★★★★★ (basic)

full outer join = 합집합

cross join      
outer join ★★★   
        left
        right
self join ★★★★★   

 

 

형식

ANSI문법

 SELECT 검색컬럼명

 FROM 테이블명1 별명1 JOIN 테이블명2 별명2

 ON 별명1.외래키 = 별명2.기본키(OR 고유키);

 

오라클문법

 SELECT 검색컬럼명

 FROM 테이블명1 별명1, 테이블명2 별명2

 WHERE 별명1.외래키 = 별명2.기본키(OR 고유키);

 

 

inner join : 기준테이블과 대상 테이블에 매칭하는 필드값이 있는 경우에 검색한다.

참고

 2개이상의 테이블도 JOIN 가능하다.

 ANSI문법 사용시 FROM절에 INNER 생략 가능하다.

 별명은 양쪽 다 가지고 있지 않는 컬럼일 경우 생략가능하다.

 

예시

-- hr 스키마

-- ansi SQL (표준, MySQL도 가능)
-- 목적 : 부서명 얻기(d.department_name )

SELECT e.employee_id, e.first_name, e.department_id,
       d.department_id, d.department_name 
FROM employees e INNER JOIN departments d
    ON e.department_id = d.department_id; -- 연결
    
    
-- oracle   (위와 결과값이 같음)

SELECT e.employee_id, e.first_name, e.department_id,
       d.department_id, d.department_name 
FROM employees e, departments d
WHERE e.department_id = d.department_id; -- 같을때 연결하라


-- 목적 : JOB_ID == IT_PROG 업무명을 꺼내고 싶다
-- 데이터를 가지고 가서 맞춰보고 상대방의 정보를 가져올 수 있다.

SELECT e.employee_id, e.first_name, e.job_id,
       j.job_id, j.job_title 
FROM employees e, jobs j
WHERE e.job_id = j.job_id
AND e.job_id = 'IT_PROG';


-- 3개 테이블을 조인
-- NULL은 JOIN 불가!

SELECT e.employee_id, e.first_name,
       d.department_name , j.job_title
FROM employees e, departments d, jobs j
WHERE e.department_id = d.department_id
AND e.job_id = j.job_id
AND e.employee_id = 101;

 

 

 

cross join : 2개의 테이블을 아무 조건없이 연결시키는 방법(ALL JOIN)

참고

 실행시 1번테이블 * 2번테이블 결과값을 가져온다.

 거의 사용하지 않는다.

 

예시

-- ansi

SELECT e.employee_id, e.first_name, e.department_id,
       d.department_id, d.department_name 
FROM employees e CROSS JOIN departments d;


-- oracle

SELECT e.employee_id, e.first_name, e.department_id,
       d.department_id, d.department_name
FROM employees e, departments d;

 

 

 

full outer join : 기준테이블과 대상 테이블에 매칭하는 필드값이 있는 경우 모든 필드값으로 테이블을 만들어서 데이터를 검색하는 방법

참고

 data 전체를 뽑을 때 (간혹 사용)

 결과값 : left outer join + right outer join

 

예시

-- ansi

SELECT e.employee_id, e.first_name, e.department_id,
       d.department_id, d.department_name
FROM employees e FULL OUTER JOIN departments d
ON e.department_id = d.department_id;

/* oracle : 결론적으론 안됨 == error.
SELECT e.employee_id, e.first_name, e.department_id,
       d.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id(+); -- left
*/

-- 굳이 사용하겠다면 UNION 사용.
SELECT e.employee_id, e.first_name, e.department_id,
       d.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id(+) -- left join
UNION
SELECT e.employee_id, e.first_name, e.department_id,
       d.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id; -- right join


-- e.department_id, d.department_id null 가져와라
-- ansi

SELECT e.employee_id, e.first_name, e.department_id,
       d.department_id, d.department_name
FROM employees e FULL OUTER JOIN departments d
ON e.department_id = d.department_id
WHERE e.department_id IS NULL
OR d.department_id IS NULL;


-- oracle

SELECT e.employee_id, e.first_name, e.department_id,
       d.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id(+)
AND e.department_id IS NULL
UNION
SELECT e.employee_id, e.first_name, e.department_id,
       d.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id
AND e.department_id IS NULL;

 

 

 

outer(외부) join : 기준테이블과 대상 테이블에 매칭하는 필드값이 있는 경우 동일한 필드값이 없는 행도 검색하는 방법

 

left join(left outer join) : 좌측  테이블(기준 테이블)의 모든 필드값을 가져온다.

참고

 실행시 e.department_id의 null의 값도 가져오게 된다.

 

예시

-- ansi

SELECT e.employee_id, e.first_name, e.department_id,
       d.department_id, d.department_name
FROM employees e LEFT OUTER JOIN departments d
ON e.department_id = d.department_id;


-- oracle

SELECT e.employee_id, e.first_name, e.department_id,
       d.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id(+);


-- 차집합 (e.department_id의 NULL을 가져와라)

SELECT e.employee_id, e.first_name, e.department_id,
       d.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id(+)
AND e.department_id IS NULL;

 

right join(right outer join) : 우측 테이블(대상 테이블)의 모든 필드값을 가져온다.

참고

 실행시 d.department_id의 null의 값도 가져오게 된다.

 

예시

-- ansi

SELECT e.employee_id, e.first_name, e.department_id,
       d.department_id, d.department_name
FROM employees e RIGHT OUTER JOIN departments d
ON e.department_id = d.department_id;


-- oracle

SELECT e.employee_id, e.first_name, e.department_id,
       d.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id;


-- 차집합 (d.department_id NULL을 가져와라)

SELECT e.employee_id, e.first_name, e.department_id,
       d.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id
AND e.department_id IS NULL;

 

 

 

self join : 자기 자신과 join 한다.

참고

 테이블 내 동일한 값이 다른 의미를 가지는 즉, 다른 컬럼에 존재하는 경우 

 

예시

SELECT emp.employee_id, emp.first_name, emp.manager_id, 
       mgr.employee_id, mgr.first_name
FROM employees emp, employees mgr -- emp:사원, mgr:상사
WHERE emp.manager_id = mgr.employee_id;


-- null값까지 뽑기(self join + left outer join)

SELECT emp.employee_id, emp.first_name, emp.manager_id, 
       mgr.employee_id, mgr.first_name
FROM employees emp, employees mgr -- emp:사원, mgr:상사
WHERE emp.manager_id = mgr.employee_id(+);

ORDER BY : 컬럼 정렬하기

형식

 SELECT 컬럼명1, 컬럼명2

 FROM 테이블명

 WHERE 조건식

 ORDER BY 컬럼명1 [ASC/DESC], 컬럼명2 [ASC/DESC];

 

 SELECT 컬럼명1, 컬럼명2

 FROM 테이블명

 WHERE 조건식

 ORDER BY 컬럼번호1 [ASC/DESC], 컬럼번호2 [ASC/DESC];

 

참고

 ASC : 오름차순, ASC는 생략가능하다.

 DESC : 내림차순

 

예시

-- scott 스키마

-- ASC : 올림차순

SELECT ename, sal FROM emp
ORDER BY sal ASC;


-- DESC : 내림차순 

SELECT ename, sal FROM emp
ORDER BY sal DESC;


-- NULL 먼저 나오도록 하는법

SELECT ename, comm FROM  emp 
ORDER BY comm NULLS FIRST;


-- NULL 나중에 나오도록 하는법 

SELECT ename, comm FROM  emp 
ORDER BY comm NULLS LAST;

-- 위와 동일 : NULLS LAST = default 값

SELECT ename, comm FROM  emp 
ORDER BY comm;


-- hr 스키마

-- 두가지 정렬 가능

SELECT employee_id, job_id, salary FROM employees
ORDER BY job_id ASC, salary DESC;

 

 

 

GROUP BY : 통계를 내기 위한 그룹화

형식

 SELECT 컬럼명

 FROM 테이블명

 WHERE 조건식

 GROUP BY 필드명1, 필드명2,.. 필드명n

 HAVING 그룹 내 조건식;

 

참고

 GROUP FUNCTION : COUNT() , SUM(), AVG(), MAX(), MIN()

 

예시

-- hr 스키마

-- COUNT : 얼마나 있느냐?

SELECT COUNT(salary) FROM employees
WHERE job_id = 'IT_PROG';
 
SELECT COUNT(salary), COUNT(*), SUM(salary), AVG(salary), MAX(salary), MIN(salary) 
FROM employees
WHERE job_id = 'IT_PROG'; 


SELECT job_id
FROM employees
GROUP BY job_id
ORDER BY job_id;
 
 
/* 묶은 다음에는 일반 컬럼은 사용할 수 없다. 

SELECT job_id, first_name 
FROM employees
GROUP BY job_id
ORDER BY job_id;

*/


SELECT job_id, COUNT(*), SUM(salary), AVG(salary)
FROM employees
GROUP BY job_id
ORDER BY job_id;


-- 업무별로 급여의 합계가 100000이상인 업무만 출력하라.
-- 1. GROUP 2. HAVING

SELECT job_id, SUM(salary)
FROM employees
GROUP BY job_id              
HAVING SUM(salary) >= 100000;


-- 급여가 5000이상 받는 사원으로 합계를 내서 업무로 그룹화하여
-- 급여의 합계가 20000을 초과하는 업무명을 구하라
-- 1. WHERE절 2. GROUP 3. HAVING 4. ORDER

SELECT job_id, SUM(salary) AS 합계
FROM employees
WHERE salary >= 5000
GROUP BY job_id
HAVING SUM(salary) > 20000
ORDER BY 합계 DESC;

 

 

 

DISTINCT :  출력 컬럼의 중복 없애기

형식

 SELECT DISTINCT 컬럼명 FROM 테이블명;

 

예시

-- emp 스키마
-- job의 중복행 제거

SELECT DISTINCT job FROM emp;

 

 

 

DESC : 테이블의 구조 보기

형식

 DESC 테이블명;

 

예시

-- emp 스키마
-- emp테이블의 구조 확인

DESC emp;

WHERE (조건절)

형식

 SELECT 컬럼명
 FROM 테이블명
 WHERE 조건식; 
   

비교연산자 

같다 : =

다르다 : <>, !=, ^=

크다 : >

작다 : <

크거나 같다 : >=

작거나 같다 : <=

 

형식

 SELECT 컬럼명 FROM 테이블명 WHERE 컬럼명 비교연산자 검색값;

 

예시

-- hr 스키마

-- 이름 -> Julia

SELECT first_name, last_name FROM employees WHERE first_name = 'Julia';



-- 급여가 $9000 이상인 사원

SELECT first_name, salary FROM employees WHERE salary >= 9000;



-- 이름이 Shanta 보다 큰 이름 (이름도 비교가능)

SELECT first_name FROM employees WHERE first_name > 'Shanta';



-- 이름의 첫 스팰링이 J보다 큰 이름

SELECT first_name FROM employees WHERE first_name >= 'J';



-- 2007년 12월 31일 이후에 입사한 사원을 출력
-- 날짜 형식 비교시 날짜 -> '07/12/31' 이런식으로 써줘야 한다.

SELECT first_name, hire_date FROM employees WHERE hire_date > '07/12/31';


-- TO_DATE -> DATE -> String으로 변환

SELECT first_name, hire_date FROM employees WHERE hire_date > TO_DATE( '071231', 'yymmdd');

 

 

 

IS NULL( = NULL ), IS NOT NULL( != NULL ) : 값이 없는 상태 검색하기

형식

 SELECT 컬럼명 FROM 테이블명 WHERE 컬럼명 IS NULL;

 SELECT 컬럼명 FROM 테이블명 WHERE 컬럼명 IS NOT NULL;

 

예시

-- 매니저가 없는 사원

SELECT first_name FROM employees WHERE manager_id IS NULL;


--  = , '' 사용할 수 없다!!! 
-- SELECT first_name FROM employees WHERE manager_id = NULL;
-- SELECT first_name FROM employees WHERE manager_id = '';


-- 매니저가 있는 사원

SELECT first_name FROM employees WHERE manager_id IS NOT NULL;

 

 

 

AND : 모두 만족하면 검색하기

형식

 SELECT 컬럼명 FROM 테이블명 WHERE 컬럼명 = 검색값 AND 컬럼명 = 검색값;

 

예시

-- 이름 John, 월급은 5000이상

SELECT first_name, salary FROM employees WHERE first_name = 'John' AND salary >= 5000;


-- 입사일자가 06/01/01 ~ 06/12/31 사이인 사원

SELECT first_name, hire_date FROM employees 
WHERE hire_date >= '06/01/01' AND  hire_date <= '06/12/31';

 

 

 

OR : 하나라도 만족하면 검색하기

형식

 SELECT 컬럼명 FROM 테이블명 WHERE 컬럼명 = 검색값 OR 컬럼명 = 검색값;

 

예시

-- 이름이 Shanta이거나 Vollman인 사원 검색

SELECT first_name FROM employees WHERE first_name = 'Shanta' OR first_name = 'Vollman';

 

 

 

IN : 여러 데이터로 검색하기

형식

 SELECT 컬럼명 FROM 테이블명 WHERE 컬럼명 IN (검색값, 검색값);

 SELECT 컬럼명 FROM 테이블명 WHERE 컬럼명 NOT IN (검색값, 검색값);

 

예시

-- 급여가 8000, 3200, 6000 인 직원들

SELECT first_name, salary FROM employees WHERE salary IN (8000, 3200, 6000);


-- 급여가 8000, 3200, 6000 아닌 직원들

SELECT first_name, salary FROM employees WHERE salary NOT IN (8000, 3200, 6000);

 

 

 

ANY : 여러 데이터로 검색하기(=OR, =IN)

형식

 SELECT 컬럼명 FROM 테이블명 WHERE 컬럼명 = ANY(검색값, 검색값);

 

예시

-- 급여가 8000, 3200, 6000인 직원들

SELECT first_name, salary FROM employees WHERE salary = ANY(8000, 3200, 6000);

 

 

 

BETWEEN .. AND(범위 연산자) : 범위에 만족하면 검색하기

형식

 SELECT 컬럼명 FROM 테이블명 WHERE 컬럼명 BETWEEN 검색값 AND 검색값;

 SELECT 컬럼명 FROM 테이블명 WHERE 컬럼명 NOT BETWEEN 검색값 AND 검색값;

 

예시

-- 월급이 3200에서 9000사이인 사원 검색

SELECT first_name, salary FROM employees  -- WHERE salary >= 3200 AND salary <= 9000;
                                             WHERE salary BETWEEN 3200 AND 9000; -- 위와 동일


-- 월급이 3200에서 9000사이인 사원을 제외한 사원 검색

SELECT first_name, salary FROM employees WHERE salary NOT BETWEEN 3200 AND 9000;   

 

 

 

LIKE : 포함된 문자로 검색하기 ★★★★★

형식

 SELECT 컬럼명 FROM 테이블명 WHERE 컬럼명 LIKE '%검색값&';

 

참고

 '문자%' : 문자로 시작하는 값

 '%문자' : 문자로 끝나는 값

 '%문자%' : 문자가 포함된 값

 '_' : 지정한 위치에 1자리 문자면 무엇이든 가능

 

예시

-- _ 한글자가 어떠한 문자든 허용

SELECT first_name FROM employees WHERE first_name LIKE 'G_ra_d';


-- % 글자수에 제한없이 모두 허용

SELECT first_name FROM employees WHERE first_name LIKE 'K%y'; 


-- 이름의 시작이 K인 이름 모두 허용

SELECT first_name FROM employees WHERE first_name LIKE 'K%'; 


-- a 들어있는 이름 모두 허용

SELECT first_name FROM employees WHERE first_name LIKE '%a%'; 

 

주요 데이터 형식


NUMBER

수치 데이터 저장 (정수, 실수)
형식 : NUMBER(전체 자릿수, 소수점 이하 자릿수)

DATE

날짜(시간 포함) 데이터를 저장

CHAR

고정 문자열 저장
형식 : CHAR(크기)


예시 

CHAR(10) 

     입력 - 7자리

     저장 - 10자리 


VARCHAR2
가변 문자열 저장
형식 : VARCHAR2(크기)


예시

VARCHAR2(10)

     입력 - 7자리

     저장 - 7자리 

문자열 저장 시 입력한 만큼만 저장하는 가변 문자열 형식이 고정 문자열 형식보다 저장 공간을 적게 차지한다.

 

 

 

 CREATE : TABLE(데이터를 집어넣을 수 있는 자료형) 생성 

형식

 CREATE TABLE 테이블명(
    컬럼명1 자료형,
    컬럼명2 자료형,
   );   

 

예시

CREATE TABLE TB_CHAR(
    COL1 CHAR(10 BYTE), -- BYTE 용량 변화 X
    COL2 CHAR(10 CHAR), -- CHAR 용량 변화 O
    COL3 CHAR(10)  --> 자동적으로 BYTE
);

 

 

 

INSERT : 테이블에 데이터 입력

형식

 INSERT INTO 테이블명(컬럼명, 컬럼명...)
 VALUES(값, 값, ...);

 

예시

INSERT INTO tb_char(COL1, COL2, COL3)
VALUES('ABC','ABC','ABC');   --영문한글자 : 1BYTE

INSERT INTO tb_char(COL1, COL2, COL3)
VALUES('가','나','다');   --한글한글자 : 3BYTE

INSERT INTO tb_char(COL1, COL2, COL3)
VALUES('가나','나나','다나');   --한글한글자 : 3BYTE

INSERT INTO TB_CHAR(COL1, COL2, COL3)
VALUES('가나다','나나다','다나다');   --한글한글자 : 3BYTE

 

CHAR 저장 공간 계산 방법

CHAR은 데이터 삽입 전 10BYTE이다. (크기가 고정되어있음)

문자가 '가'만 들어가 있을 경우 한글 1글자의 크기가 3BYTE + 10BYTE(CHAR 고정 크기) - 1BYTE = 12BYTE이다.

    가(3 BYTE) + 9 BYTE = 12 BYTE

문자가 '가나'만 들어가 있을 경우 한글 2글자의 크기가 6BYTE + 10BYTE(CHAR 고정 크기) - 2BYTE = 14BYTE이다.
    가나(6 BYTE) + 8 BYTE = 14 BYTE

문자가 '가나다'만 들어가 있을 경우 한글 3글자의 크기가 9BYTE + 10BYTE(CHAR 고정 크기) - 3BYTE = 16BYTE이다.
    가나다(9 BYTE) + 7 BYTE = 16 BYTE

 

 

 

SELECT : 검색

형식

 

 1. 테이블의 모든 컬럼 검색

    SELECT 컬럼명 FROM 테이블명;

 

예시

SELECT * FROM tb_char;

 

 2. 테이블의 컬럼명1, 컬럼명2 .. 컬럼명n 컬럼만 검색
    SELECT 컬럼명1, 컬럼명2 .. 컬럼명n FROM 테이블명;

 

예시

SELECT col1, col3 FROM tb_char;

 

 3. 컬럼명을 별명으로 설정하여 검색
 SELECT 컬럼명 AS 별명 FROM 테이블명;
 SELECT 컬럼명 as 별명 FROM 테이블명;
 SELECT 컬럼명 별명 FROM 테이블명;

 

예시

SELECT col1 AS 별명 FROM tb_char;

SELECT col1 as 별명 FROM tb_char;

SELECT col1 별명 FROM tb_char;

 

 

 

ALIAS : 테이블에 보이는 컬럼명 바꾸기(= 별명, 별칭)

형식

 SELECT 형식 3 참고

 

참고

 별명 지정 시 AS, as, 생략가능 
 별명은 기본적으로 문자로 시작하여야 하지만, 숫자로 시작하거나 공백이 있을경우 "별명"으로 작성한다.

 

예시

SELECT col1 "1별명" FROM tb_char;

SELECT col1 "별 명" FROM tb_char;

 

 

 

DROP : 테이블 삭제

형식

 DROP TABLE 테이블명;

 

예시

DROP TABLE tb_char;

 

 

 

 

 

DUAL TABLE : 가상 테이블 (결과용 테이블)

형식

 SELECT 문자 출력값, 연산 결과값 FROM DUAL;

 

예시

SELECT 1 FROM DUAL;
SELECT 'A' FROM DUAL;
SELECT '가나' FROM DUAL;
SELECT 23*45 FROM DUAL;

 

 

 

Standard Function (표준 함수)

 

문자열 함수 (Character Function) 정리

 

1. 변환함수

 

LOWER() : 알파벳 값을 소문자로 변환

 

형식

 LOWER(문자열)

 

예시

SELECT LOWER('HI, HELLO') FROM DUAL; -- hi, hello

 

 

UPPER() : 알바펫 값을 대문자로 변환

 

형식

 UPPER(문자열)

 

예시

SELECT UPPER('hi, hello') FROM DUAL;  -- HI, HELLO

 

 

INITCAP() : 첫번째 글자만 대문자로 변환

 

형식

 INITCAP(문자열)

 

예시

SELECT INITCAP('HI, HELLO') FROM DUAL; -- Hi, Hello

 

 

2. 문자 조작 함수

 

CONCAT() : 두 문자열 연결(결합)

 

형식

 CONCAT(값1, 값2)

 

예시

SELECT CONCAT(CONCAT('나는',' '),'최고입니다') FROM DUAL; -- 나는 최고입니다

 


|| : 문자열 연결(결합)

 

형식

 값1 || 값2 || ... 값n

 

예시

SELECT '나는 ' || '최고입니다' FROM DUAL; -- 나는 최고입니다

 

 

SUBSTR() : 문자열 중 특정 문자 또는 문자열의 일부분을 선택 ★★★★★

 

형식

 SUBSTR(문자열, 시작INDEX, 취득개수) 

 

예시

SELECT SUBSTR('ABCDE', 3) FROM DUAL; -- CDE


-- 3번째부터 2글자 가져와라 CD

SELECT SUBSTR('ABCDE', 3, 2) FROM DUAL; -- CD

 


LENGTH() : 문자열의 길이를 구함

 

형식

 LENGTH(문자열) 

 

예시

SELECT LENGTH('ABCDE') FROM DUAL; -- 5

 

 

INSTR() :  문자열 내 위치를 구함

 

형식

 INSTR(문자열, 찾을문자열[시작위치[, 검색차수]) 

 

참고

 시작위치가 있으면 시작위치부터 찾고 시작위치가 없다면 처음부터 찾는다.

 검색차수가 있으면 검색차수번째 순서에 있는 찾는문자열의 위치를 구한다.

 

예시

SELECT INSTR('abcde', 'a') FROM DUAL; -- 1

SELECT INSTR('123ABC456DEFABC', 'A') FROM DUAL; -- 4


-- 7번째 이후의 A의 INDEX번호

SELECT INSTR('123ABC456DEFABC', 'A', 7) FROM DUAL; -- 13


-- 7번째 이후의 1번째 나오는 A의 INDEX번호

SELECT INSTR('123ABC456DEFABCABC', 'A', 7, 2) FROM DUAL; -- 16

 

 

LPAD() / RPAD() : 나머지를 빈칸 또는 지정문자로 채운다. LPAD:왼쪽, RPAD:오른쪽

 

형식

 LPAD(문자열, 개수, [지정문자])

 RPAD(문자열, 개수, [지정문자])

 

예시

SELECT LPAD('BBB', 10) FROM DUAL; --        BBB


-- 지정문자 사용 예

SELECT LPAD('BBB', 10, '-') FROM DUAL; -- -------BBB

SELECT RPAD('124', 10, '0') FROM DUAL; -- 1240000000

 

 

LTRIM() / RTRIM() : 공백,  반복적인 문자를 지움 (LTRIM : 왼쪽, RTRIM : 오른쪽)

 

형식

 LTRIM(문자열)

 RTRIM(문자열)

 LTRIM(문자열, 삭제문자열)

 RTRIM(문자열, 삭제문자열)

 

예시

-- 공백 삭제

SELECT LTRIM('   BBB' )   FROM DUAL; 

SELECT RTRIM('BBB   ' )   FROM DUAL; 

--반복적인 문자 삭제

SELECT LTRIM('AABBB', 'AA')   FROM DUAL; -- BBB 

SELECT RTRIM('BBBAA', 'AA')   FROM DUAL; -- BBB

 

 

REPLACE() : 문자열 치환

 

형식

 REPLACE(문자열, 삭제문자)

 REPLACE(문자열, 대상문자, 교체문자)

 

예시

SELECT REPLACE('AAAAABCD', 'A') FROM DUAL; -- BCD

SELECT REPLACE('AAAAABCD', 'A', 'a') FROM DUAL; -- aaaaaBCD

SELECT REPLACE('AAAAABCD', 'AA', 'a') FROM DUAL; -- aaABCD

 

 

TREANSLATE() : 문자 치환

 

형식

 TREANSLATE(문자열, 대상문자, 치환문자)

 

참고

 글자를 지정해주지 않으면 에러발생

 

예시

SELECT TREANSLATE('AAAAABCD', 'A' , 'a') FROM DUAL; -- aaaaaBCD

-- 위와 동일 : 문자 치환이기 때문에

SELECT TREANSLATE('AAAAABCD', 'AA' , 'a') FROM DUAL; -- aaaaaBCD

 

 

 

숫자 함수 정리

 

CEIL() : 숫자를 올림 

 

형식

 CEIL(숫자)

 

예시

SELECT CEIL(13.1) FROM DUAL; -- 14

 

 

FLOOR() : 숫자를 내림

 

형식

 FLOOR(숫자)

 

예시

SELECT FLOOR(13.1) FROM DUAL; -- 13

 

 

ROUND() : 숫자를 반올림

 

 

형식

 ROUND(숫자)

 ROUND(숫자, 자릿수)

 

예시

SELECT ROUND(13.4) FROM DUAL; -- 13


-- 소수점 1번째자리 까지만 인정

SELECT ROUND(13.45,1) FROM DUAL; -- 13.5

 

 

TRUNC() : 숫자를 버림(절삭)

 

형식

 TRUNC (숫자)

 TRUNC (숫자, 자릿수)

 

예시

SELECT TRUNC(123.456) FROM DUAL; -- 123


-- 소수점 2번째자리 까지만 인정

SELECT TRUNC(123.456, 2) FROM DUAL; -- 123.45


-- 소수점 1번째자리 까지만 인정

SELECT TRUNC(123.456, 1) FROM DUAL; -- 123.4


-- 정수 1번째자리까지 인정

SELECT TRUNC(123.456, -1) FROM DUAL; -- 120

 

 

MOD() : 숫자를 나눈 나머지

 

형식

 MOD(숫자, 나눌수)

 

예시

SELECT MOD(3, 2)FROM DUAL; -- 1

 

 

POWER() : 거듭제곱(승수)

 

형식

 POWER (숫자, 승수)

 

예시

SELECT POWER(3, 2) FROM DUAL; -- 9

 

 

SIGN() : 양수, 음수, 0인지 확인

 

형식

 SIGN (숫자)

 

참고 

 양수일 때 반환값 : 1  

 음수일 때 반환값 : -1   

 0일 때 반환값 : 0 

 

예시

SELECT SIGN(13.4) FROM DUAL; -- 1

SELECT SIGN(-13.4) FROM DUAL; -- -1

SELECT SIGN(0) FROM DUAL; -- 0

 

 

CHR() : ASCII 값으로 변환

 

형식

 CHR(숫자)

 

예시

SELECT CHR(65) FROM DUAL; -- A

SELECT CHR(97) FROM DUAL; -- a

 

 

 

날짜 함수

 

SYSDATE : 오늘 날짜, 시간 반환

 

형식

SYSDATE 

 

예시

SELECT SYSDATE FROM DUAL;

 

 

MONTHS_BETWEEN() : 두 날짜 사이의 월수를 계산

 

형식

 MONTHS_BETWEEN(기준날짜, 비교날짜)

 

예시

SELECT MONTHS_BETWEEN(TO_DATE('20/04/23'), TO_DATE('20/01/1')) FROM DUAL; -- 3.7096..

 

 

ADD_MONTHS() : 월을 날짜에 더하기

 

형식

 ADD_MONTHS (기준날짜, 개월수)

 

예시

SELECT ADD_MONTHS(TO_DATE('20/04/23'), 6) FROM DUAL; -- 20/10/23

 

 

NEXT_DAY() : 명시된 날짜로부터 다음 요일에 대한 날짜 계산 (오늘은 포함 X)

 

형식

 NEXT_DAY (기준날짜, 요일문자열(요일번호))

 

참고

요일문자열 :  일요일, 월요일, 화요일, 수요일, 목요일, 금요일, 토요일, 또는 일, 월, 화, 수, 목, 금, 토

요일번호 : 1(일), 2(월), 3(화), 4(수), 5(목), 6(금), 7(토)

 

예시

SELECT SYSDATE, NEXT_DAY(SYSDATE, '월요일') FROM DUAL;

 

출력화면

 

 

LAST_DAY() : 명시된  날짜가 속한 달의 마지막 날를 반환

 

형식

 LAST_DAY (기준날짜)

 

예시

SELECT LAST_DAY('24/02/22') FROM DUAL; -- 24/02/29

 

 

ROUND() : 날짜를 반올림

TRUNC() : 날짜를 절삭

형식

 ROUND (기준날짜, 반올림기준)

 TRUNC (기준날짜, 절삭기준)

 

예시

SELECT TO_CHAR(sysdate, 'HH:MI:SS') , 
		ROUND(sysdate, 'YEAR'), sysdate,
		ROUND(sysdate), TRUNC(sysdate, 'MONTH')
FROM DUAL;

 

출력화면

 

 

 

형변환 함수 정리

 

TO_CHAR () :  날짜,시간 → 문자 변환    ★★★★★

 

형식

TO_CHAR(날짜,문자형식)

TO_CHAR(숫자,문자형식)

 

예시

SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH-MI-SS') FROM DUAL; -- 2021-05-31 01-02-12

SELECT TO_CHAR(123456789, '$999,999,999,999') FROM DUAL; -- $123,456,789 

 

 

TO_DATE() : 문자열 → 날짜,시간변환       ★★★★★

 

형식

TO_DATE(문자,날짜형식)

TO_DATE(문자,숫자형식)

 

예시

SELECT TO_DATE('20210525') FROM DUAL; -- 2021/05/25 00:00:00

-- 위와 같다.(지정변환가능)

SELECT TO_DATE('20210525', 'YYYYMMDD') FROM DUAL; -- 2021/05/25 00:00:00

 

 

TO_NUMBER() : 문자열 → 숫자

 

형식

TO_NUMBER(문자)

 

참고

TO_NUMBER()사용시 연산도 가능하다.

 

예시

SELECT TO_NUMBER('123') + 45 FROM DUAL; -- 168

 

 

 

 

참고 : 하루 10분 SQL

+ Recent posts