일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 1521
- calc.plus
- removeClass
- index %
- push오류
- calc.minus
- Math.floor()
- addClass
- 증가값
- Math.round()
- is_check
- toFixed()
- Math.ceil()
- 파일질라다운로드
- selectedIndex
- excel중복체크
- hide
- SUB함수
- 파일질라설치
- Excel
- 주석이 먹히지 않을 때
- Parent
- FileZilla다운로드
- Git
- ctrl+/
- selectoptions
- FileZilla설치
- 파일질라설치오류
- slideUp
- 소스트리인증실패
- Today
- Total
잡동사니에도 사랑을
Oracle 정리 - Chapter.03 본문
EMPLOYEES | DEPARTMENTS | LOCATIONS |
EMPLOYEE_ID FIRST_NAME PHONE_NUMBER HIRE_DATE JOB_ID SALARY COMMISSION_PCT MANAGER_ID DEPARTMENT_ID |
DEPARTMENT_ID DEPARTMENT_NAME MANAGER_ID LOCATION_ID |
LOCATION_ID STREET_ADDRESS POSTAL_CODE CITY STATE_PROVINCE COUNTRY_ID |
COUNTRIES | JOBS | LOCATIONS2 |
COUNTRY_ID COUNTRY_NAME REGION_ID |
JOB_ID JOB_TITLE MIN_SALARY MAX_SALARY |
LOC_ID STREET_ADDRESS POSTAL_CODE CITY STATE_PROVINCE COUNTRY_ID |
※ select (해석순서 1 → 2 → 3 → 4 → 5)
select [distinct] [컬럼1, 컬럼2,.....][as 별명][ || 연산자][*] --- 6
from 테이블명 --- 1
[where 조건절] --- 2
[group by 컬럼명] --- 3
[having 조건절] --- 4
[order by 컬럼명 asc|desc ] --- 5
=> 테이블로부터 where 조건에 맞게 그룹을 짓고, 그룹에 대한 조건절에 정렬해주면 컬럼을 꺼내와라
group by : 그룹함수(max,min,sum,avg,count..)와 같이 사용 ex) 점수가 95점 이상
having : 묶어놓은 그룹의 조건절 ex) 반별 평균 90점 이상
ex1) 사원테이블에서 급여의 평균을 구하시오
조건) 소수 이하는 절삭, 세자리 마다 콤마(,) 표시
사원급여평균
---------------
6,461
select to_char(trunc(avg(salary),0), '99,999') as 사원급여평균 from employees;
ex2) 부서별 급여평균을 구하시오
조건1) 소수 이하는 반올림
조건2) 세자리 마다 콤마, 화폐 단위(₩)로 표시
조건3) 부서별로 오름차순 정렬하시오
조건4) 평균급여가 5000이상인 부서만 표시하시오
부서코드 평균급여
--------------------------
10 ₩8,600
select department_id as 부서코드,
to_char(round(avg(salary), 0), 'L99,999,999') as 평균급여
from employees
group by department_id
having avg(salary) >= 5000
order by department_id asc;
ex3) 부서별 급여평균을 구해서 사원명(last_name), 부서별 급여평균을 출력하시오 - X
select last_name, avg(salary)
from employees
group by department_id;
★ last_name 때문에 error - group by절에 없는 것을 select에 조회하면 error
그룹함수 sum, avg, max, min 과 같이 쓰면 상관없다.
group by의 단점은 group by 시킨 것만 select할 수 있다는 것이다.
[문제1] job_id별 급여의 합계를 구해서 job_id, 급여합계를 출력하시오
[문제1 - 정답]
ex4) 비효율적인 having절
10과 20부서에서 최대급여를 받는 사람의 최대급여를 구하여 정렬하시오
department_id max_salary
------------------------------------
10 4400
20 13000
select department_id, max(salary) as max_salary
from employees
group by department_id
having department_id in(10,20)
order by department_id;
전체 부서에 대해 그룹을 잡아서 최대급여를 구한 후에 부서가 10과 20인 것을 추려낸다
select department_id, max(salary) as max_salary
from employees
where department_id in(10, 20)
group by department_id
order by department_id;
부서번호가 10과 20인 것만 골라내서 그룹잡기 때문에 속도가 좀 빠르다
조인(join)
- 두 개의 테이블에서 공통의 고리를 찾아서 결합을 시키는 것
EMPLOYEES DEPARTMENTS JOIN
---------------------------------------------------------------------
사 부 부 부 사 부 부
원 서 + 서 서 = 원 서 서
이 번 번 이 이 번 이
름 호 호 름 름 호 름
※ 종류
1. Inner join : 같은 것끼리만 연결
2. Outer join : 한쪽을 기준(모두포함)해서 연결
left join : 왼쪽 컬럼 모두포함
right join : 오른쪽 컬럼 모두포함
3. full join : 왼쪽, 오른쪽 모두 포함
4. self join : 자기자신 테이블과 연결
5. cross join : 모든 경우의 수로 연결
6. non equijoin : 범위에 속하는지 여부를 확인
7. n개 테이블 조인 : 여러 개의 테이블 조인
※ 방법
1. 오라클 구문 전용
2. Ansi 표준 구문
ex5) inner join : 같은 것끼리만 조인
사원테이블과 부서테이블에서 부서가 같을 경우 사원번호, 부서번호, 부서이름을 출력하시오
방법1(오라클 전용 구문)
select employee_id,
employees.department_id,
department_name
from employees, departments
where employees.department_id = departments.department_id;
방법2(오라클 전용 구문)
select employee_id,
e.department_id,
department_name
from employees e, departments d
where e.department_id = d.department_id;
방법3(Ansi 표준)
select employee_id, department_id, department_name
from employees
join departments using(department_id);
=> employees와 department 테이블에서 (using) 같은 부서 코드를 꺼내와라
[문제2] 부서테이블(DEPARTMENTS d)과 위치테이블(LOCATIONS l)을 연결하여 부서가 위치한 도시를 알아내시오
department_id city
----------------------------------
10 Seattle
[문제2 - 정답]
ex6) outer join(left) : 왼쪽 테이블은 모두 포함하여 조인
사원테이블과 부서테이블에서 부서번호가 같은 사원을 조인하시오 → 107레코드
방법1(오라클 전용 구문)
select e.last_name, d.department_id, d.department_name
from employees e, departments d
where e.department_id = d.department_id (+);
(+) : 반대편에 있는 테이블을 다 가져와라,,,,헷갈려서 잘 쓰지 않는다
방법2(Ansi 표준)
select last_name, department_id, department_name
from employees
left join departments using(department_id);
=> employees에 있는 나머지들을 모두 꺼내와라
ex7) outer join(right) : 오른쪽 테이블은 모두 포함하여 조인
사원테이블과 부서테이블에서 부서번호가 같은 사원을 조인하시오 → 122 레코드
방법1(오라클 전용 구문)
select e.last_name, d.department_id, d.department_name
from employees e, departments d
where e.department_id(+)=d.department_id;
방법2(Ansi 표준)
select last_name, department_id, department_name
from employees
right join departments using(department_id);
ex8) full join(right) : 왼쪽, 오른쪽 테이블을 모두 포함하여 조인
사원테이블과 부서테이블에서 부서번호가 같은 사원을 조인하시오 → 123레코드
--방법1(오라클 전용 구문) : 없다
--방법2(Ansi표준)
select last_name, department_id, department_name
from employees
full join departments using(department_id);
ex9) inner join : 두 개의 컬럼이 일치(join) 하는 경우
부서ID와 매니저ID가 같은 사원을 연결 하시오 → 32 레코드
(관련 테이블 : departments, employees)
last_name department_id manager_id
방법1(오라클 전용 구문)
select e.last_name, d.department_id, d.manager_id
from employees e, departments d
where e.department_id=d.department_id and e.manager_id=d.manager_id;
방법2(Ansi표준)
select last_name, department_id, manager_id
from employees
inner join departments using(department_id, manager_id);
ex10) 내용은 같은데 컬럼명이 다른 경우에 조인으로 연결하기
departments(location_id), locations2(loc_id)
테이블 복사
create table locations2 as select * from locations;
select * from locations2;
alter table locations2 rename column location_id to loc_id;
=> location_id를 loc_id로 컬럼명을 변경해 locations2 테이블 새롭게 저장
방법1(오라클 전용 구문)
select d.department_id, l.city
from departments d, locations2 l
where d.location_id=l.loc_id;
=> d.location_id와 l.loc_id가 같은 걸 골라라
방법2(Ansi 표준)
select department_id, city
from departments
join locations2 on(location_id=loc_id);
=> 부서 테이블과 locations2를 비교, 내용은 같으나 서로의 컬럼명이 다를 경우 using 대신 on을 써준다
방법3(Ansi 표준)
select department_id, city
from departments d
join locations2 l on(d.location_id=l.loc_id);
ex11) self 조인 : 자기 자신의 테이블과 조인하는 경우 사원과 관리자를 연결하시오
사원번호 사원이름 관리자
----------------------------------
101 Kochhar King
EMPLOYEES EMPLOYEES
-------------------------------------------------------------------
employee_id, last_name(사원이름) last_name(관리자)
조건 employee_id = manager_id
select employee_id, manager_id, last_name from employees; → e
select employee_id, last_name from employees; → m
방법1
select e.employee_id as 사원번호,
e.last_name as 사원이름,
m.last_name as 관리자
from employees e, employees m
where m.employee_id=e.manager_id;
=> employees e, employees m을 조인시켜서 m.employee_id와 e.manager_id가 같은 것을 골라라
방법2
select e.employee_id as 사원번호,
e.last_name as 사원이름,
m.last_name as 관리자
from employees e
join employees m on(m.employee_id=e.manager_id);
ex12) cross join : 모든 행에 대해 가능한 모든 조합을 생성하는 조인
select * from countries, locations; → 575레코드
select * from countries cross join locations;
ex13) Non Equijoin (넌 이큐조인)
컬럼값이 같은 경우가 아닌 범위에 속하는지 여부를 확인 할 때
on ( 컬럼명 between 컬럼명1 and 컬럼명2)
salgrade : salary의 등급 매기기
create table salgrade(
salvel varchar2(2),
lowst number,
highst number);
insert into salgrade values('A', 20000, 29999);
insert into salgrade values('B', 10000, 19999);
insert into salgrade values('C', 0, 9999);
commit;
select * from salgrade;
select last_name, salary, salvel
from employees
join salgrade on(salary between lowst and highst)
order by salary desc;
ex14) n(여러)개의 테이블은 조인
업무ID 같은 사원들의 사원이름, 업무내용, 부서이름을 출력하시오
(EMPLOYEES, JOBS, DEPARTMENTS 테이블을 조인)
<분석>
EMPLOYEES JOBS DEPARTMENTS
------------------------------------------------------------
department_id job_id department_id
job_id
<출력>
last_name job_title department_name
select last_name, job_title, department_name
from employees
join departments using(department_id)
join jobs using(job_id);
=> employees, departments, jobs 세 테이블은 순서 상관 없다.
[문제3] 위치ID, 부서ID을 연결해서 사원이름, 도시, 부서이름을 출력하시오
(관련 테이블 : EMPLOYEES, LOCATIONS2, DEPARTMENTS)
조건1 : 사원이름, 도시, 부서이름으로 제목을 표시하시오
조건2 : Seattle 또는 Oxford 에서 근무하는 사원
조건3 : 도시 순으로 오름차순 정렬하시오
사원이름 도 시 부서이름
---------------------------------------------
Hall Oxford Sales
[문제 3 - 정답]
[문제4] 부서ID, 위치ID, 국가ID를 연결해서 다음과 같이 완성하시오
(관련 테이블 : EMPLOYEES, LOCATIONS2, DEPARTMENTS, COUNTRIES)
조건1 : 사원번호, 사원이름, 부서이름, 도시, 도시주소, 나라이름으로 제목을 표시하시오
조건2 : 도시주소에 Ch 또는 Sh 또는 Rd가 포함되어 있는 데이터만 표시하시오
조건3 : 나라이름, 도시별로 오름차순 정렬하시오
조건4 : 모든 사원을 포함한다
포함이니까 like구문 써줘야
[문제 4 - 정답]
'정리 > Oracle정리' 카테고리의 다른 글
Oracle 정리 - Chapter.06 (0) | 2021.09.15 |
---|---|
Oracle 정리 - Chapter.05 (0) | 2021.09.14 |
Oracle 정리 - Chapter.04 (0) | 2021.09.13 |
Oracle 정리 - Chapter.02 (0) | 2021.09.09 |
Oracle 정리 - Chapter.01 (0) | 2021.09.07 |