국비교육 29일차 Oracle: Set Operator(Set 연산자, 집합연산자), Pseudo Column, DML, DDL, DCL, TCL, DQL
(1) UNION
- UNION은 첫번째 컬럼별로 오름차순 정렬이 되어진다.
- 중복행은 1개만 나온다.
(2) UNION ALL
- UNION ALL을 하면 정렬 없이 그냥 순서대로 행을 붙여서 보여준다.
- UNION ALL은 중복 제거 없이 그대로 보여준다.
(3) INTERSECT
- INTERSECT 교집합
- 테이블과 테이블 사이에 공통되는 행을 찾아준다.
(4) MINUS
- MINUS 차집합
- 테이블과 테이블 사이에서 한쪽에는 존재하고 다른 한쪽에는 존재하지 않는 행을 찾아준다.
WITH V as
(
select *
from tbl_panmae_202205
UNION
select *
from tbl_panmae_202206
UNION
select *
from tbl_panmae
-- 백분률을 구할 때 union all을 사용하여 모든 행을 다 더하는 방식으로 했었으나,
-- union all 을 안써도 되는 이유는 판매데이터 별로 다 다른 시간을 가지고 있기에 다른 행으로 인식됨
-- 따라서 아래의 백분률에서 union all을 사용하지 않고 V의 panmaesu로 해도 된다.
)
select decode( grouping(jepumname), 0, jepumname, '전체') AS 제품명
, decode( grouping(to_char(panmaedate, 'yyyy-mm')), 0, to_char(panmaedate, 'yyyy-mm'), ' ') AS 판매년월
, sum(panmaesu) AS 판매량의합계
, to_char(
ROUND( sum(panmaesu) / -- 분자
(select sum(panmaesu) from V ) * 100 -- 퍼센트
, 1) -- round
, '999.0')AS "백분율(%)"
from V
group by rollup(jepumname,to_char(panmaedate, 'yyyy-mm'))
-- ◎오늘의에러 grouping sets로 여러번 그룹지어 준 다음, grouping 한 컬럼명을 그대로 써주어야한다.
Pseudo(의사,유사,모조) Column 은 rowid와 rownum 이 있다.
select rownum -- 2. 그 다음에 rownum으로 번호 부여
, boardno
, subject
, userid
, REGISTERDAY
from
(
select boardno
, subject
, userid
, to_char(registerday, 'yyyy-mm-dd hh24:mi:ss') AS REGISTERDAY
from tbl_board
order by boardno desc -- 1. 내림차순으로 보이게 설정부터 한다.
)V; -- V가 내림차순으로 출력 받있고, 다시 밖에서 rownum을 행번호를 받아왔기 때문에 오름차순으로 rownum 출력
-- 1페이지에 RNO : 1 ~ 2 boardno : 5 ~ 4(최신순)만 나오게 하기
select T.boardno, T.subject, T.userid, T.REGISTERDAY
from
(
select rownum AS RNO, boardno, subject, userid, REGISTERDAY
from
(
select boardno
, subject
, userid
, to_char(registerday, 'yyyy-mm-dd hh24:mi:ss') AS REGISTERDAY
from tbl_board
order by boardno desc
)V
) T --RNO는 alias로 처리된 상태라 바로 where 절에 사용할 수 없어서 다시 인라인뷰
where RNO between 1 and 2;
where RNO between (조회하고자 하는 페이지 번호 * 한페이지당 보여줄 행의 개수) - (한페이지당 보여줄 행의 개수 -1)
and (조회하고자 하는 페이지 번호 * 한페이지당 보여줄 행의 개수);
where RNO between (1 * 2) - (2 -1)
and (1 * 2);
select boardno, subject, userid, registerday
from
(
select row_number() over(order by boardno desc) AS RNO-- 글 번호의 내림차순으로 번호를 부여한다.
, boardno
, subject
, userid
, to_char(registerday, 'yyyy-mm-dd hh24:mi:ss') AS registerday
from tbl_board
)V
where RNO between 1 and 2;
-- row_number() over(order by boardno desc)도 where 절에 바로 사용 불가능
-- 그러므로 이것 또한 inline view를 사용해야 한다.
- DML(Data Manuplation Language) : 데이터 조작어 ==> insert, update, delete, merge
: 수동 commit 이므로 rollback 이 가능하다.- DDL(Data Definition Language) : 데이터 정의어 ==> create, drop, alter, truncate
: 자동 commit( Auto commit) 이므로 rollback 이 불가하다.- DCL(Data Control Language) : 데이터 제어어 ==> grant, revoke
: 자동 commit( Auto commit) 이므로 rollback 이 불가하다.- TCL(Transaction Control Language) : 트랜잭션 제어어 ==> commit, rollback
- DQL(Data Query Language) : 데이터 질의어 ==> select
insert into 테이블명(컬럼명1,컬럼명2,...) values(값1,값2,...);
insert all
into 테이블명1(컬럼명1, 컬럼명2, ....)
values(값1, 값2, .....)
into 테이블명2(컬럼명3, 컬럼명4, ....)
values(값3, 값4, .....)
SUB Query문;
insert all
when 조건절 then
into 테이블명1(컬럼명1, 컬럼명2, ....)
values(값1, 값2, .....)
when 조건절 then
into 테이블명2(컬럼명3, 컬럼명4, ....)
values(값3, 값4, .....)
SUB Query문;
(2) update --> 데이터 수정
update employees set first_name = '여진', last_name = '손'
where employee_id = 100;
(3) delete --> 데이터 삭제
delete from 테이블명
where 조건절;
(4) merge --> 데이터 병합
create database link teacherServer
connect to hr identified by a
using 'TEACHER';
-- Database link TEACHERSERVER이(가) 생성되었습니다.
merge into tbl_reservation_merge@teacherserver R -- remote 원격
using tbl_reservation_shonyeojin L -- local
on (L.rsvno = R.rsvno)
when matched then
update set R.memberid = L.memberid
, R.ticketcnt = L.ticketcnt
-- 만일 있으면 로컬에 있는 것을 원격지에 업데이트
when not matched then
insert(rsvno, memberid, ticketcnt) values(L.rsvno, L.memberid, L.ticketcnt)
-- 이 컬럼은 원격지에 있다. -- 이 컬럼은 로컬에 있다.
-- 로컬에 있는 것을 원격지에 넣어준다.
-- 로컬에 일치하는 데이터가 없어서 새로 넣어주는 경우.
-- 1 행 이(가) 병합되었습니다.
commit;
조급하게 굴지 말아야한다는 건 아는데, 자꾸 맘처럼 안되니까 속상하다