다운로드


- Oracle 11g Express

- Oracle SQL Developer(jdk포함)





DQL(Data Query Lenguage)


1. SELECT 구문에 의해서 테이블의 자료를 검색하는 명령

2.

SELECT 컬럼리스트

FROM 테이블

WHERE 조건식

GROUP BY 기준컬럼

HAVING 조건식

ORDER BY 기준컬럼;


-- 특정 테이블의 자료 확인

select * from employees;



--특정 테이블의 자료 일부 출력.  행(column) 제한

select first_name, last_name, phone_number

from employees;


-- 특정 테이블의 자료 일부 출력. 열(Row) 제한.

select *

from employees

where job_id = 'IT_PROG';


-- 특정 테이블의 자료 일부 출력. 행(column), 열(Row) 제한.


select first_name, last_name, phone_number

from employees

where job_id = 'IT_PROG';






조건식(행 제한)


1. 

select 컬럼리스트

from 테이블

[where 조건식]



2. 연산자 종류

연산자 종류

비교연산자 : =, >, <, >=, <=, <>

논리연산자 : and, or, not

SQL 연산자 : IN(값, ...), BETWEEN ~ AND , LIKE



3. 자료형

-문자형 : CHAR2, VARCHAR2

-날짜형 : DATE

-숫자형 : NUMBER



4. 리터럴(상수)

문자형 : 작은 따옴표로 표기된 문자열. EX) '테스트' 

날짜형 : 날짜 서식을 가진 문자열. '년-월-일', '월/일/년' 형식을 가진 문자열. ex)'2012-10-22'

숫자형 : 정수 또는 실수로 표기된 숫자. ex) 10


올바른 자료형 비교 예.

select *

from employees

where job_id='IT_PROG'; -- 성공


틀린 자료형 비교 예.

select *

from employees

here job_id="IT_PROG";" -- 실패






날짜 데이터 검색하는 방법

-> 날짜 데이터를 문자열 형식으로 변환하는 과정 필요.

-> to_char(날짜데이터, '서식') 함수 이용


--employees 테이블에서 입사년도(hire_date)가 '2003'년인 경우 출력.

select *

from employees

where to_char(hire_date, 'yyyy') = '2003';



--employees 테이블에서 입사월(hire_date)이 '1'월인 경우 출력.

select *

from employees

where to_char(hire_date, 'mm') = '01';


--employees 테이블에서 입사년도(hire_date)가 '2005'년이고, 입사월이 '1'월인 경우 출력.

select *

from employees

where to_char(hire_date, 'yyyy-mm') = '2005-01'; 


-- 혹은

select *

from employees

where to_char(hire_date, 'yyyy') = '2005' and to_char(hire_date, 'mm') = '01';


--employees 테이블에서 입사년도(hire_date)가 '2000'년대인 경우 출력.

-> substr(원본데이터, 출발위치, 길이)


select *

from employees

where to_char(hire_date, 'yyyy') = '2000' or to_char(hire_date, 'yyyy') = '2001' or to_char(hire_date, 'yyyy') = '2002'

      or to_char(hire_date, 'yyyy') = '2003' or to_char(hire_date, 'yyyy') = '2004' or to_char(hire_date, 'yyyy') = '2005'

      or to_char(hire_date, 'yyyy') = '2006' or to_char(hire_date, 'yyyy') = '2007' or to_char(hire_date, 'yyyy') = '2008'

      or to_char(hire_date, 'yyyy') = '2009';

      

-- 혹은

select *

from employees

where substr(to_char(hire_date, 'yyyy'), 1, 2) = '20';


-- 혹은 (문자열도 크기 비교가 됨.)

select *

from employees

where to_char (hire_date, 'yyyy') >= '2000' and

         to_char(hire_date, 'yyyy') <= '2009';






숫자 데이터 검색하는 방법



-- employees 테이블에서 salary(급여)가 20000달러 이상인 경우 출력

select *

from employees

where salary >= 20000;


--employees 테이블에서 salary(급여)가 5000~10000번위인 경우 출력


and연산자 사용.








SQL 연산자


1. IN(값, ...): or 연산 역할. 괄호 안의 나열된 값중 하나와 일치하면 true


2. BETWEEN 값1 AND 값2: and 연산 역할. 값1~값2 범위 지정시


3. LIKE: 피연산자가 패턴(_, %)과 일치하는 경우 true;



--jobs 테이블에서 job_title이 'President' 이거나, 'Sales Manager'인 경우 출력.

select *

from jobs

where job_title='President' or job_title = 'Sales Manager';


-- 혹은

select *

from jobs

where job_title in ('President', 'Sales Manager');



--employees 테이블에서 salary(급여)가 5000~10000번위인 경우 출력


select *

from employees

where salary between 5000 and 10000;




--employees 테이블에서 전화번호가 4567로 끝나는 경우 출력

-> substr은 길이가 서로 다른 문자열에서는 일부 문자열을 얻기가 힘듬.

-> like 연산자 사용


select *

from employees

where phone_number like



--employees 테이블에서 전화번호가 국번이 123로 끝나는 경우 출력


select *

from employees

where phone_number like '%123_____';


select *

from employees

where phone_number like '___.123.____';








null 확인


1. 데이터베이스 내의 데이터 저장 공간을 확보한 후 데이터를 채우지 않으면

자동으로 NULL값이 저장된다.


2. is 로 확인.


-- employees 테이블에서 commission_pct 정보가 null인 경우 출력


select *

from employees

where commission_pct is null;









내장 함수


- 함수는 데이터를 입력시 , 단일 결과를 리턴하는 프로그램의 집합


1. 입력데이터가 없는 경우

select sysdate from dual; -- 시스템의 현재 날짜


select to_char(sysdate,'yyyy-mm-dd') from dual;


select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;






2. 입력 데이터가 있는 경우

TO_DATE('날짜문자열') : 문자열을 날짜 형식으로 변환


select sysdate - to_date('특정날짜') from dual;

-- 특정 날짜부터 특정 날짜 사이의 날짜수 계산



TO_CHAR(날짜자료형, '서식')


select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;

--서식에 맞게 날짜, 시간 출력


ROUND(값)


select round (10.123) from dual; --10

select round (10.567) from dual; --11

select round (10.567, 2) from dual; --10.57

select round (10.567, 1) from dual; --10.6

-- 반올림 함수



TRUNC(값)


select trunc (10.123) from dual; --10

select trunc (10.567) from dual; --10

-- 절삭함수

ex) employees 테이블에서 salary가 10000이상이면서, 20000 미만인 경우 출력

select *

from employees

where trunc (salary/10000) = 1;



MOD(값1, 값2)


-- 나머지 연산 함수


LOWER('대문자') : 입력된 문자를 소문자로 변경


UPPER('소문자') : 입력된 문자를 대문자로 변경


ex)

select *

from employees

where first_name = 'ellen'; --X


select *

from employees

where first_name = 'Ellen'; --O


select *

from employees

where first_name = 'ELLEN'; --X


select *

from employees

where LOWER(first_name) = LOWER('ellen'); --O


select *

from employees

where UPPER(first_name) = UPPER('ellen'); --O



CONCAT(문자열1, 문자열2) : 입력된 문자열1과 문자열2를 하나의 컬럼으로 합쳐 출력


LENGTH(원본문자열) : 문자열 길이


SUBSTR(원본문자열, 위치, 길이) : 부분 문자열 리턴


INSTR(원본문자열, 검색문자열) : 문자열 검색.


REPLACE(원본문자열, 검색문자열, 대체문자열) : 문자열 대체


LPAD(식,길이,표시문자열) : 문자열 대체. 특정 문자열로 채워짐. (LIFT)

EX) 

select '801010-1234567' from dual;

select lpad((substr('801010-1234567', 7, 8), 14, '*') from dual;



RPAD(식,길이,표시문자열) : 문자열 대체. 특정 문자열로 채워짐. (RIGHT)

EX) 

select rpad(substr('801010-1234567', 1, 7), 14, '*') from dual;


NVL(식, 값) : 식의 결과값이 null 이면 값 리턴 (if구문만 있는 상태)


NVL2(식, 값1, 값2) : 식의 결과값이 null이면 값1 리턴 아니면 값2 리턴 (if~else 구문 상태)


DECODE(식, 조건, 값1, 조건2, 값2, ...) : 식의 조건이 참이면 값1을 리턴하고 조건2를 만족하면 값2를 리턴.. (if ~ else if~ else 인 상태)

ex)

select first_name, last_name, decode(department_id, 90, 'Excutive', 60, 'IT', 50, 'Shipping')

from employees;


ex)employees 테이블에서 salary가 10000미만인 경우는 C등급, 10000이상 20000미만인 경우는 B등급, 20000이상인 경우는 A등급으로 출력

select first_name || ' ' || last_name AS 이름, 

decode(trunc(salary/10000), 0, 'C등급', 1, 'B등급' , 2, 'A등급') as 급여등급

from employees;


WRITTEN BY
빨강꼬마

,

◆ Null에 대한 처리 ◆

1. Null과 관련된 함수
   ㄱ. nvl 함수
     형식: select nvl(x, y)
        X값이 null일 경우 Y로 출력하고, null이 아닐 경우 X값 대로 출력하게함.


select nvl(null, -800), nvl(0, -800), nvl('이순신', '장군'), nvl(null, '장군') from dual;

 


select employee_id as "사원번호", first_name as "성", last_name as 명, salary 기본급, commission_pct as "수당 퍼센트1",
          nvl(commission_pct, 0) as "수당 퍼센트2",
          nvl(salary * commission_pct, 0) as "수당",
          (salary + nvl(salary * commission_pct, 0)) * 12 as "연봉"
from employees;

※ select에서 기입되는 컬럼명의 최종 출력 컬럼명을 별명처리로 위의 그림(예제2)처럼 바꿀수 있다.(as는 생략가능)
※ 다만 별명안에 공백이 있을 경우 "" 가 반드시 있어야 함
   권장 ex: select employee_id as "사원번호"
      ex: select employee_id "사원번호"
      ex: select employee_id 사원번호

 


   ㄴ. nvl2 함수
     형식: select nvl2(x, y, z)
        X값이 Null이면 Y값 출력, X값이 Null이 아니면 Z값 출력 

select nvl2(0, 100, 200), nvl2(null, 100, 200), nvl2('일', '이', '삼'), nvl2(null, '이', '삼') from dual;

 


   ㄷ. coalesce 함수
     형식: select coalesce(A, B, C, D)
        A가 Null이 아닐경우 A 출력,
        A가 Null일 경우, B 출력,
        B가 Null일 경우, C 출력,
        C가 Null일 경우, D 출력,
        D가 Null일 경우, Null 출력

 

select coalesce(0, 1, 2, 3),
          coalesce(null, 1, 2, 3),
          coalesce(null, null, 2, 3),
          coalesce(null, null, null, 3),
          coalesce(null, null, null, null)
from dual;

 

 

- where 절에서 null로 데이터를 구할때 = 연산자 대신 is 혹은 is not 으로 사용
  (null 이 존재하지 않는 데이터이기 때문에 = 연산자는 처리가 되지 않아 실행 불가)

 

select employee_id as "사원번호", first_name ||' ' ||last_name as "성명", salary as "급여", commission_pct as "커미션 퍼센트"
from employees
where commission_pct is null;   

 

 

select employee_id as "사원번호", first_name ||' ' ||last_name as "성명", salary as "급여", commission_pct as "커미션 퍼센트"
from employees
where commission_pct is not null;

 


- || (백스페이스키 왼편에 붙은 키를 쉬프트키를 누른상태에서 입력)
 결과물에서 여러개의 다른 컬럼을 한개의 컬럼으로 합하여 표시하고자 할때 사용.
 ||의 경우 2개 이상이 가능하므로 이것을 주로 사용.

 

 


select first_name ||' '||  last_name as "성명" from employees;

 


- concat: ||와는 다르게 2개의 컬럼까지만 가능

select concat('이순신의 입사일자는 ', sysdate) from dual;

 

 

select concat('이순신의 입사일자는 ', sysdate, ' 이고,') from dual;

 


- distinct: 결과물중 행 데이터가 동일할 경우 한개만 출력하는 명령

 

select distinct job_id, department_id from employees;

 

- 데이터 타입중 문자 및 날짜 타입은는 좌(왼)측 정렬

- 데이터 타입중 숫자 타입은 우(오른)측 정렬

 

 

◆ like 연산자 ◆

- like는 = 연산자와 비슷한 기능을 가짐.

select * from employees where job_id = 'AD_VP';

 

select * from employees where job_id like 'AD_VP';

 

- like연산자는 = 연산자와는 다르게 Wild Character 인 %, _를 사용하여 보다 구체적인 조건을 사용할 수 있다.
   - %: 글자가 있고 없고 관계없이 모든 글자를 뜻함

select job_id from employees where job_id like 'AD%';

 

    - _: 글자가 무엇이든 상관없이 1글자를 뜻함

select distinct job_id from employees where job_id like '___C%';

 


- escape: like 연산자를 사용할때 데이터내 % 문자가 와일드캐릭터로 인식되어 정확한 데이터 추출이 불가능할때 한글자 단위로 사용함
     (escape 사용할때 탈출 문자는 아무거나 가능하나 보통 \를 사용함)

 

 

select * from tbl_watch where bigo like '%99.99\%%' escape '\';

WRITTEN BY
빨강꼬마

,