078 데이터 입력하기(INSERT)
ㅁSQL 종류
1. Query : select문의 6가지 절, 함수, 조인, 서브쿼리, 집합연산자
2. DML (Data Manpulation Language) : insert, update, delete, merge
3. DDL (Data Definition Language) : create, alter, drop, truncate, rename
4. DCL (Data Control Language) : grant, revoke
5. TCL (Transaction Control Language) : commit, rollback, savepoint
insert into 테이블명(컬럼명1,컬럼명2,....) values(값1,값2,.....)
문자의 경우 양쪽에 작은따옴표로 둘러줘야함. 날짜는 to_date를 이용해 날짜형식을 맞춰줘야 데이터를 맞게 입력할 수 있음.
/* 사원 테이블에 데이터를 입력하는데 사원번호는 2812, 사원이름은 JAC,
월급은 3500, 입사일은 2021년 11월 16일, 직업은 ANALYST로 입력하시오 */
insert into emp(empno, ename, sal, hiredate, job)
values(2812, 'JACK',3500,to_date('2021/11/16','RRRR/MM/DD'),'ANALYST') ;
문제382. 사원테이블의 아래의 데이터를 입력하시오
사원번호 : 4832 / 사원이름 : JANE / 월급 : 6800 / 부서번호 : 20
insert into emp(empno, ename, sal, deptno) values(4832,'JANE',6800,20);
문제383. 아래의 데이터를 부서 테이블에 입력하시오
부서번호 : 50 / 부서명 : transport / 부서위치 seoul
insert into dept(deptno, dname, loc) values(50, 'TRANSPORT','SEOUL');
문제384. 아래의 데이터를 emp테이블에 입력하시오
사원번호 : 8392 / 사원이름 JAMES / 입사일 : 오늘날짜
insert into emp(empno, ename, hiredate) values(8392, 'JAMES', sysdate);
문제385. 오늘 입사한 사원의 이름과 입사일을 출력하시오
select ename, hiredate
from emp
where hiredate = sysdate;
/* 위와같이 하면 출력이 안됨. sysdate로 데이터를 입력하면 날짜뿐만 아니라 시분초도 입력이 됨.
아까 입력했던 sysdate 시분초와 지금 검색하려고 넣은 sysdate가 달라서 검색이 안됨
to_date('2021/11/17','RRRR/MM/DD')로 넣은 경우에는 2021년 11월 17일 00시00분00초로 입력되기때문에
날짜로 검색하면 검색됨
to_date(sysdate)로 하면 시분초가 들어가지만, to_date(sysdate,'RRRR/MM/DD')로 하면 00시00분00초로 들어감
날짜 데이터를 입력할 때는 반드시 to_date사용해야 입력도 잘되고 검색도 잘됨
*/
ㅇ테이블에 null값을 입력하는 방법
1. 암시적으로 입력하는 방법
insert into emp(empno, ename, sal) values(1234,'aaa',3400);
사원번호, 이름, 월급 외에는 모두 null로 데이터가 입력됨
2. 명시적으로 입력하는 방법
- null
- ''(작은 따옴표 2개를 붙여서)
insert into emp(empno, ename, sal) values(3456,null,3200);
insert into emp(emono, ename, sal) values(2345,'',3500);
insert into emp(empno,ename,sal) values(4567,' ',5400);
문제386. 이름이 null이 아닌 사원들의 이름과 월급을 출력하시오
select ename, sal
from emp
where ename is not null;
-- 공백도 안나오게 할 때(내가 쓴 코드)
select ename, sal
from emp
where ename is not null and ename not like '% %';
-- 다른 방법 (trim 사용)
select ename, sal
from emp
where trim(ename) is not null;
079 데이터 수정하기(UPDATE)
update 테이블명
set 변경할 컬럼
where 변경하고 싶은 조건
--SCOTT의 월급을 3900으로 수정하시오
update emp
set sal = 3900
where ename = 'SCOTT';
문제387. 부서번호가 10번인 사원들의 커미션을 9000으로 수정하시오
update emp
set comm = 9000
where deptno = 10;
문제388. 부서번호가 10,20인 사원들의 직업을 ANALYST로 변경하시오
update emp
set job = 'ANALYST'
where deptno in ( 10, 20);
문제389. 직업이 null인 사원들의 직업을 SALESMAN으로 변경하시오
update emp
set job = 'SALESMAN'
where job is null ;
ㅇupdate 사용시 주의사항
where절을 잘못작성해서 where절을 안쓴다거나 잘못쓰면 안됨
080 데이터 삭제하기(DELETE, TRUNCATE, DROP)
delete from 테이블명
where 조건
-- SCOTT의 데이터를 지우시오
delete from emp
where ename = 'SCOTT';
문제390. 월급이 3000이상인 사원들을 지우시오
delete from emp
where sal >= 3000;
ㅇ만약 실수로 테이블을 전부 다 지워버렸다면,
타임머신을 타고 과거로 가서 emp테이블을 살려보기(오라클 기본설정 골든타임 15분(회사마다 설정 다름))
-- flashback query문
select *
from emp as of timestamp to_timestamp('2021/11/17:15:24:00','RRRR/MM/DD:HH24:MI:SS');
-- 복구할 수 있는 시간 확인 방법
select name, value
from v$parameter
where name = 'undo_retention';
-- undo_retention 900 = 15분
-- 특정시간으로 emp테이블 복구하기
-- 1. emp테이블을 flashback이 가능한 상태로 변경
alter table emp enable row movement;
-- 2. emp테이블을 2021/11/17:15:24:00로 되돌리기
flashback table emp to timestamp to_timestamp('2021/11/17:15:24:00','RRRR/MM/DD:HH24:MI:SS');
-- 3. 커밋으로 완료
문제391. 사원테이블의 월급을 전부 0으로 변경하고 커밋하시오
update emp
set sal = 0;
문제392. 사원테이블을 원래대로 복구하시오
select *
from emp as of timestamp to_timestamp('2021/11/17:16:00:00','RRRR/MM/DD:HH24:MI:SS');
alter table emp enable row movement;
flashback table emp to timestamp to_timestamp('2021/11/17:16:00:00','RRRR/MM/DD:HH24:MI:SS');
ㅇ 오라클에서 데이터를 삭제하는 3가지 방법
delete | truncate | drop | |
데이터 | 삭제 | 삭제 | 삭제 |
저장공간 | 유지 | 삭제 | 삭제 |
저장구조 | 유지 | 유지 | 삭제 |
취소여부 (rollback) |
가능 | 불가능 | 불가능 |
플래쉬백 여부 | 가능 | 불가능 | 가능 |
truncate와 drop의 차이
truncate는 테이블의 구조를 남겨둠. 테이블의 구조를 남겨두면 나중에 데이터를 새로 입력할 때 테이블을 생성하지 않아도 됨. 데이터를 모두 삭제할거라면 delete보다는 truncate가 속도가 더 빠름.
ㅇ테이블 백업하기
-- emp_backup이라는 이름으로 emp테이블과 똑같은 테이블을 생성
create table emp_backup
as
select *
from emp;
select *
from emp_backup;
-- sqldeveloper로 백업하는 방법
접속창의 테이블 > 해당 테이블 선택 > 익스포트
문제393. 부서번호, 부서번호별 평균월급을 출력하시오
select deptno, avg(sal)
from emp
group by deptno;
문제394. (오늘의 마지막 문제) 부서번호, 이름, 월급, 자기가 속한 부서번호의 평균월급을 출력하는데, 자기의 월급이 자기가 속한 부서번호의 평균월급보다 더 많은 월급을 받는 사원들만 출력하시요.
select *
from (
select deptno, ename, sal, avg(sal) over (partition by deptno) as avg
from emp
)
where sal >= avg;
'Study > class note' 카테고리의 다른 글
sql중급 / 서브쿼리를 사용한 insert문 (0) | 2021.11.18 |
---|---|
sql 중급 / DML(commit, rollback, merge, lock, select for update) (0) | 2021.11.18 |
sql중급 / subquery ( select절) (0) | 2021.11.17 |
sql중급 / subquery (다중 행, 다중 컬럼, not in, exists, having절, from절) (0) | 2021.11.16 |
sql중급 / subquery(단일 행) (0) | 2021.11.15 |