[ self 조인 ]
select employee_id, manager_id, last_name from employees;
[e]
select employee_id, last_name from employees order by 1;
[m]
101 - Kochhar - King
102 - De Haan - King
- 방법 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
order by 1;
- 방법 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)
order by 1;
select * from countries, locations;
select * from countries cross join locations;
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;
[문제5] 학생 중에 동명이인을 검색하여 이름으로 오름차순하고, 만약 같은 이름은 번호로 오름차순하시오 (SELF JOIN)
테이블 : STUDENT
컬럼 : SNO, SNAME
select distinct A.sno, A.sname
from student A, student B
where A.sname = B.sname and A.sno != B.sno
order by 2, 1;
select distinct A.sno, A.sname
from student A
join student B on(A.sname = B.sname and A.sno != B.sno)
order by 2, 1;
여기서 실수한 점 !! sname만 같은 사람 찾으면 다 나온다.
sno가 다른 것도 조건으로 걸어야 한다는 점 !!!!
그리고 distinct 이 것도 해야지 중복되는 거 안 나온다.
[SET operator] - 집합연산자
두 개 이상의 쿼리 결과를 하나로 결합시키는 연산자
1. UNION : 양쪽 쿼리를 모두 포함(중복 결과는 1번만 포함) → 합집합
2. UNION ALL : 양쪽 쿼리를 모두 포함(중복 결과도 모두 포함)
3. INTERSECT : 양쪽 쿼리 결과에 모두 포함되는 행만 표현 → 교집합
4. MINUS : 쿼리1 결과에 포함되고 쿼리2 결과에는 포함되지 않는 행만 표현 → 차집합
오라클의 집합연산자(SET operator) UNION, INTERSECT, MINUS 는 order by 한다.
→ UNION을 사용할 경우 합쳐진 결과에서 중복을 제거한 결과를 반환한다.
중복을 제거하기 위해서 order by 하기 때문에 컬럼이 많으면 느려진다.
수가 작은 튜플로 가공 후 사용 하는게 좋다
→ UNION ALL 는 order by 하지 않고 무조건 합해준다
Order by를 하려면 두 번째 쿼리에 작성해야 한다.
[ 테이블 구조만 복사하는 방법 ]
create table employees_role as select * from employees where 1=0;
→ 테이블 구조만 복사된다. 레코드는 들어오지 않는다.
select * from employees;
select * from employees_role;
insert into employees_role values(101, 'Neena', 'Kochhar', 'NKOCHHAR', '515.123.4568',
'1989-09-21', 'AD_VP', 17000.00, NULL, 100, 90);
insert into employees_role values(101, 'Neena', 'Kochhar', 'NKOCHHAR', '515.123.4568',
'1989-09-21', 'AD_VP', 17000.00, NULL, 100, 90);
insert into employees_role values(101, 'Nee', 'Ko', 'NKOCHHAR', '515.123.4568',
'1989-09-21', 'AD_VP', 17000.00, NULL, 100, 90);
insert into employees_role values(200, 'Neena', 'Kochhar', 'NKOCHHAR', '515.123.4568',
'1989-09-21', 'AD_VP', 17000.00, NULL, 100, 90);
insert into employees_role values(200, 'Nee', 'Kochhar', 'NKOCHHAR', '515.123.4568',
'1989-09-21', 'AD_VP', 17000.00, NULL, 100, 90);
insert into employees_role values(300, 'GilDong', 'Hong', 'NKOCHHAR', '010-123-4567',
'2009-03-01', 'IT_PROG', 23000.00, NULL, 100, 90);
commit;
[ UNION ]
select employee_id, last_name from employees
union
select employee_id, last_name from employees_role;
[ UNION ALL]
select employee_id, last_name from employees
union all
select employee_id, last_name from employees_role;
select salary from employees where department_id=10
union all
select salary from employees where department_id=30 order by 1;
[ MINUS ]
select employee_id, last_name from employees
minus
select employee_id, last_name from employees_role;
[ INTERSECT ]
select employee_id, last_name from employees
intersect
select employee_id, last_name from employees_role;
select last_name 사원이름, job_id 업무ID, department_id 부서ID
from employees
where department_id = 10
UNION
select last_name 사원이름, job_id 업무ID, department_id 부서ID
from employees_role
where job_id = 'IT_PROG';
- 방법1 (join, in연산자 이용)
select last_name, job_title
from employees
join jobs using(job_id)
where job_title in('Stock Manager', 'Programmer');
- 방법2 (join, union 이용)
select last_name, job_title
from employees
join jobs using(job_id)
where job_title='Stock Manager'
union
select last_name, job_title
from employees
join jobs using(job_id)
where job_title='Programmer'
order by 2;
컬럼개수 맞춰야한다 !! 그래서 NULL 쓴 것 / 데이터타입도 맞춰야한다.
select last_name, employee_id, hire_date
from employees
where department_id=20
union
select department_name, department_id, NULL
from departments
where department_id=20;
'Oracle' 카테고리의 다른 글
DAY 30 - ORACLE 연습5 (2024.08.13) (0) | 2024.08.13 |
---|---|
DAY 29 - ORACLE DB 연습4 - 서브쿼리 / 상관쿼리 (2024.08.12) (0) | 2024.08.12 |
DAY 15 - Oracle 설치(hr계정 / 사용자 계정_java) / 기본SQL / 트랜잭션 (2024.07.23) (0) | 2024.08.09 |
DAY 15 - 기본 SQL HOMEWORK (2024.07.23) (0) | 2024.08.09 |
DAY 27 - Oracle DB 연습3 - GROUP BY / JOIN (2024.08.08) (0) | 2024.08.08 |