2019. 4. 2. 19:20ㆍDateBase
----------------------------오라클의 논리연산자----------------------------
오라클의 논리연산자는 and, or, not 세종류가 있다.
- and : 제시된 모든 조건식이 true면 true를 반환한다.
- or : 제시된 모든 조건식 중 하나라도 true면 true를 반환한다. // or는 최대한 안쓰는것 거의 절대적
(x이거나 y 인것 = in 을 쓰고, x이하이거나 y이상인것 = between을쓴다.)
- not : 제시된 조건식이 true이면 false로, false면 true로 반환한다.
※ not in : in의 반대이다. x, y, z .... 등이 아닌것
where 절에서 논리연산자를 사용하면 하나 이상의 조건에 부합되는 행을 선택할 수 있다.
예시) 80번 부서에 소속된 사원중에서 급여를 5000달러 이상 받는 사원의 이름과 급여, 직종, 부서아이디를 조회하기
select first_name, salary, job_id, department_id
from EMPLOYEES
where department_id =80 and salary > 5000;
예시2) 소속부서가 60번 이거나 90번인 사원의 이름, 소속부서를 조회하기
SELECT first_name, department_id
from EMPLOYEES
where department_id in (60, 90); -> where department_id = 60 or department_id = 90;
// or도 가능하지만 대부분 in을 쓴다.
예시3) 급여를 3000달러 이하로 받는 사원과 급여를 15000달러 이상으로 받는 사원의 이름, 급여를 조회하기
(이경우는 합집합을 구하는 식으로 or을 쓸수밖에 없다.)
select first_name, salary
from employees
where salary <= 3000
or salary >= 15000;
예시4) 소속부서가 50번 부서에 소속된 사원 중에서 급여를 3000달러 이하로 받거나 급여를 15000달러 이상으로 받는 사원의
이름, 급여, 부서아이디를 조회하시오
select first_name, salary, department_id
from EMPLOYEES
where department_id = 50
and (salary <= 3000 or salary >= 15000); // 괄호가 중요하다.
예시5) 소속부서가 50번 80번 외의 부서에서 근무하는 사원의 이름, 소속부서를 조회하기
(50번, 80번인 사람찾을때는 in을 쓰지만 아닌것의 반대는 not in이다.)
select first_name, department_id
from EMPLOYEES
where department_id not in (50, 80);
===========조회된 데이터의 정렬==============
데이터 정렬
order by 절을 사용하면 조회된 데이터를 정렬할 수 있다.
order by 절은 select문의 가장 끝에 위치한다.
asc응 오름차순, desc는 내림차순으로 정렬한다. 생략하면 오름차순 정렬한다.
order by에서는 select 절의 별칭을 사용할 수 있다.
두 가지 이상의 정렬기준을 적용해서 정렬할 수 있다.
데이터 정렬(오름차순)
- 날짜는 옛날 날짜부터 표시
- 숫자는 작은 값부터 표시
- 문자는 알파벳, 가나순으로 표시
- null값은 마지막에 표시
실행순서
select -- 3번
from -- 1번
where -- 2번
order by -- 4번
select *
from 테이블명
where 조건식
order by 컬럼명 asc <--- 지정된 컬럼의 값들이 기준으로 오름차순 정렬한다. ※. asc일경우 생략이 가능하다.
select *
from 테이블명
where 조건식
order by 컬럼명 desc <--- 지정된 값들의 기준으로 내림차순으로 정렬한다.
예시) 사원테이블에서 아이디, 이름, 급여를 조회하고, 급여를 기준으로 내림차순 정렬하기
select employee_id, first_name, salary
from EMPLOYEES
order by salary DESC;
예시2) 80번 부서에 소속된 사원들의 이름, 입사일을 조회하고 입사입을 기준으로 오름차순 정렬하기
select first_name, hire_date
from EMPLOYEES
order by hire_date; -- asc 생략 가능
예시3) 80번 부서에 소속된 사원중에서 이름에 'e'를 포함하고 있고, 급여를 10000달러 이상으로 받는 사원들의
아이디, 이름, 급여를 조회하고, 급여순으로 내림차순 정렬하기
select employee_id, first_name, salary
from EMPLOYEES
where department_id = 80
and (first_name like '%e%' or first_name like '%E%')
and salary > 10000
order by salary desc; --> order by 3 desc; select에 3번째로 써있어서 이렇게도 쓸수있다.
예시4) 80번 부서 사원의 급여, 이름을 조회하기
급여와 이름순으로 오름차순 정렬하기(급여가 동일할 때는 이름순으로 정렬)
select salary, first_name
from EMPLOYEES
where department_id = 80
order by salary , first_name;
------------------------오라클의 내장함수--------------------------
내장함수란
- 값을 입력받아서 적절한 작업을 수행하고 결과값을 반환하는 것
- 구분
- 단일행 함수
- 단일 행에 대해서만 연산을 수행하고, 행 당 하나의 결과를 반환한다.
- 단일행 함수는 여러 번 중첩해서 사용할 수 있다.
예시) 문자자르기(대문자변환(문자), 1, 8) - 대문자 변환 후 문자 자르기 2번 중첩
- select절, where절, order by절에서 사용할 수 있다.
- 종류
문자함수 - 문자를 입력받아서 처리하고 결과를 반환한다.
숫자함수 - 숫자를 입력받아서 처리하고 결과를 반환한다.
날짜함수 - 날짜를 입력받아서 처리하고 결과를 반환한다.
변환함수 - 날짜 <-> 문자, 숫자 <-> 문자로 변환한다.
기타함수 - 기타
- 다중행 함수(그룹함수)
- 여러 행(행 그룹)을 조작해서 행 그룹 당 하나의 결과를 반환한다.
- 평균, 합계, 분산, 표준편차, 최댓값, 최소값, 갯수 등 계산한다.
- 통계작업에 활용된다.
- 한번만 중첩이 가능하다.
///////////////////////////////////문자 함수
=======upper(컬럼), lower(컬럼)========
예시) 문자함수 - 대소문자 변환함수
upper(컬럼), lower(컬럼)
select first_name, upper(first_name), lower(first_name)
from EMPLOYEES;
=======substr(컬럼,m[,n]) : m번째부터 n번째까지 문자를 반환한다.========
예시) 문자열 추출하기 - substr(컬럼,m[,n])
select first_name, substr(first_name, 2)
from employees;
=======instr(컬럼, '문자') : 지정된 문자의 위치를 반환한다.============
예시) 지정된 문자의 등장 위치 찾기 - insert(컬럼, '문자')
select instr('801010-1121211','-')
from dual; // dual : 더미테이블
※ dual : 오라클의 빌트인 테이블, 1행1열짜리 테이블, 더미테이블이다.
특별한 테이블을 대상으로 수행하는 조회작업이 아닐때 사용된다.
========lpad(컬럼, 길이, '문자'), rpad(컬럼, 길이, '문자')==============
컬럼을 쓰고 컬럼의 값이 지정된 길이보다 짧으면 부족한 길이만큼 문자를 채운다.
lpad : 왼쪽에서 부터 문자를 채운다.
rpad : 오른쪽에서 부터 문자를 채운다.
예시)문자 채우기
SELECT lpad('abc',10,'*'), rpad('abc',10,'*')
from dual;
========length(컬럼) : 문자의 길이를 반환=====================
예시) 문자 길이 반환
SELECT first_name, length(first_name)
from employees;
예시2) 문자가 4개이상인 이름 반환
select first_name, length(first_name)
from EMPLOYEES
where length(first_name) <= 4;
심화 예제) 이름에 'C'나 'c'가 들어가있는 사원의 이름을 조회하기
select first_name
from EMPLOYEES
where lower(first_name) like '%c%';
=========trim(컬럼) : 불필요한 좌우 공백을 제거한다.===========
예시) 불필요한 공백 없애기
select ' abc ', trim(' abc ')
from dual;
// tab은 없어지지 않는다. tab은 문자로 인식
==========replace(문자, '찾을문자', '변경할문자')=============
예시)문자 바꾸기
select replace('자바 입문자를 위한 자바의 정성', '자바', '파이썬')
from dual;
///////////////////////////////////숫자 함수
==========round(숫자, 자릿수)==================
round(숫자, 자릿수) : 지정된 자리로 값을 반올림한다.
예시)
select round(3.2), round(3.6)
from dual;
예시2)
select round(10/3,2)
from dual;
예시3) - 자리로 적을경우 반대로 간다.
SELECT round (12345, -1), round (12345, -2), round (12345,-3), round (12345, -4)
from dual;
==========trunc(숫자, 자릿수)==================
trunk(숫자, 자릿수) : 지정된 자리까지 남기고 값을 버린다.
예시)
select trunc(123.58,1), round(123.58,1)
from dual;
예시2)
select first_name, salary, trunc(salary, -3)
from EMPLOYEES
where department_id = 80;
==========mod(숫자1, 숫자2)===================
mod(숫자1, 숫자2) : 숫자1을 숫자2로 나눈 나머지를 반환한다.
//////////////////////////////날짜 함수
============sysdate=====================
sysdate : 현재날짜와 시간정보를 반환한다. 반환값은 DATE타입의 값이다.
예시)
select SYSDATE
from dual;
============months_between(날짜, 날짜)========
months_between(날짜, 날짜) : 두 날짜사이의 개월 수 반환
예시) 사원아이디, 이름, 입사일, 근무개원 수 조회하기
select employee_id, first_name, hire_date, trunc(months_between(sysdate, hire_date)) months
from employees;
==========add_months(날짜, 개월수)============
add_months(날짜, 개월수) : 날짜에 개월수를 더한 날짜를 반환
예시) 앞으로 6개월 후
select add_months(sysdate, 6)
from dual;
===============날짜 연산=================
날짜 + 일수 : 지정된 날짜에서 더해진 숫자만큼 이후의 날짜를 반환한다.
날짜 - 일수 : 지정된 날짜에서 빼진 숫자만큼 이전의 날짜를 반환한다.
날짜 - 날짜 : 두 날짜 사이의 일수를 반환한다.
날짜 + 시간/24 : 지정된 날짜에 시간이 더해진 날짜를 반환한다.
예시) 최근 3일전에 입사한 사원 조회하기
select employee_id, first_name, hire_date
from EMPLOYEES
where hire_date < (sysdate -3);
예시) 사원들의 이름, 입사일, 근무일수 조회하기
select first_name, hire_date, trunc(sysdate - hire_date) days
from EMPLOYEES;
/////////////////////////////////////변환함수
변환 함수란
날짜를 문자로 꾸고 문자를 날짜로 바꾸거나
문자를 숫자로 숫자를 문자로 빠꿀 수 있는 함수를 말한다.
종류
to_char(날짜, '패턴')
날짜를 문자로 바꾼다.
to_char(숫자, '패턴)
숫자를 문자로 바꾼다.
--------------------------------------
to_date('문자', '패턴)
문자를 날짜로 바꾼다.
to_number('문자', '패턴')
문자를 숫지로 바꾼다.
예시) 날짜를 문자로 변경하기 to_char - 출력값 형식
select to_char(SYSDATE,'YYYY') 년, to_char(sysdate, 'MM') 월, to_char(sysdate, 'DD') 일,
to_char(sysdate, 'HH24') 시, to_char(SYSDATE, 'MI') 분, to_char(sysdate, 'SS') 초,
to_char(sysdate, 'am') 오전오후, to_char(sysdate, 'day') 요일
from dual;
예시2) 문자를 날짜로 변경하기 to_date - 입력값의 형식
select to_date('2019/01/31', 'YYYY/MM/DD'),
to_date('2019-01-31', 'YYYY-MM-DD'),
to_date('31/01/2019', 'DD/MM/YYYY')
from dual;
(테이블에 출력된 값은 그대로지만 입력된 값의 타입을 지정해준것이다.)
예시3) to_date로 연산하기
select '2019/08/19' - SYSDATE
from dual; // 에러
select to_date('2019/08/19','yyyy/mm/dd') - SYSDATE
from dual;
위의 첫번째 방식으로 하면 date 와 char은 타입이 달라 계산이 안된다하여 아래처럼 해야한다.
예시4) 2008년 3월 1일 ~ 2008년 3월 15일 사이에 입사한 사원의 아이디, 이름, 입사일 조회하기
select employee_id, first_name, hire_date
from EMPLOYEES
where hire_date >= to_date('2008/03/01', 'yyyy/mm/dd')
and hire_date <= to_date('2008/03/15 23:59:59', 'yyyy/mm/dd hh24:mi:ss');
(시간을 적어둔것은 시간을 안적을경우 00:00:00시 이기때문에 사실적으로 15일에 입사한사람은 안나온다.
아니면 처음부터 16일로 적어둬도 된다.)
사실 아래처럼 사용이 가능하다. 이런것을 묵시적 변환이라 하고 날짜형식으로 입력되면 자동으로
날짜타입으로 바뀐다.
to_char(숫자, '패턴')은 숫자사이에 , 넣고 그런거에 사용하는것인데 이런건 자바에서 패턴을 써서 많이 안씀
예시5) 숫자를 문자로 변환
select employee_id, first_name, to_char(salary, '99,999'), to_char(salary, '00,000'),
to_char(commission_pct, '9.99'), to_char(commission_pct, '0.00')
from employees
where commission_pct is not null;
숫자 표현을 자바는 #이었지만 sql은 0, 9가 사용된다.
9 : 소숫점 이상의 자리에서 없는자리는 생략하지만 소숫점 이하는 없으면 0을 표현
0 : 소숫점 이상과 이하 모두 없는자리를 생략하지않고 0을 넣는다.
to_number은 묵시적 변환으로 자동으로 되기때문에 많이 사용되지 않는다.
예시6) 문자를 숫자로 변환하기
select employee_id, first_name, salary
from EMPLOYEES
where salary > to_number('15,000','99,999');
15000은 바로 묵시적 변환이 되지만 " , "를 사용하면 묵시적 변환이 되지않아 to_number을 사용한다.
'DateBase' 카테고리의 다른 글
그룹함수 특징, group by, sql 실행순서, having, 서브쿼리 예시, 오라클 에러 (0) | 2019.04.05 |
---|---|
다중행 함수 - count, sum, avg, min, 서브쿼리 (0) | 2019.04.04 |
nvl, nvl2, case ~ when, decode, 테이블 조인 - 등가조인, 비등가조인, 포괄조인, 셀프조인 (0) | 2019.04.04 |
SQL 특징, SQL의 종류, Select 문, Select 산술연산, as 별칭 부여, || 연결 연산자, where 조건절, in, between, is null, is not null, like (0) | 2019.04.02 |
Database, SQL, Oracle초기, HR계정, 관계형 데이터 베이스 (0) | 2019.03.29 |