본문 바로가기

Oracle/SQL

(98)
* SQL 계층형 질의문 connect by 절 level 서열을 주어 데이터 출력 데이터에서 서열을 출력하는 SQL 문법 ex) emp table 에는 서열이 존재한다. →숨어있는 서열을 화면에 표시하는것. →서열과 관련된 컬럼은 mgr (관리자 번호 이다.) → 관리자번호(mgr)를 이용한 서열 출력 할 수 있다. connect by 절을 쓸때 절들의 역할 where : 데이터들을 모두 가져온 뒤 마지막으로 조건절에 맞게 정리한다. start with : 계층구조를 만들때 기준이 되는 데이터를 입력한다. connect by prior : 각 행들의 연관된 관계를 적어준다. * 숫자를 1부터 10 까지 출력 하는 방법 select level as 숫자 from dual connect by level 2400 start with ename = 'KING' connect by prior ..
SQL 서브쿼리를 이용한 데이터 합치기 Merge 튜닝전 sql 이 보이면 바로 merge 문으로 튜닝해주기 문제 454 dept 에 추가한 sumsal 컬럼의 값을 해당 부서번호의 별 토탈월급으로 갱신하시오 merge into dept d using (select sum(sal) as sumsal from emp group by deptno ) v on (d.deptno = v.deptno) when matched then update set d.sumsal = v.sumsal ; 문제 455 부서번호의 40 번의 sumsal 이 숫자 0으로 갱신되도록 merge 문 작성 merge into dept d using (select deptno, sum(sal) sumsal from emp group by deptno ) v on (d.deptno = v..
SQL 서브쿼리를 이용한 DATA 삭제 Delete 스캇보다 더많은월급 받는 사원들 삭제 delete from emp where sal > (select sal from emp where ename ='SCOTT'); SCOTT 과 같은 직업을 갖는 사원 삭제, SCOTT 은 제외 하고 삭제하시오 delete from emp where job = (select job from emp where ename = 'SCOTT') AND ENAME != 'SCOTT'; allen 보다 늦게 입사한 사원들 삭제 delete from emp where hiredate > (select hireate from emp where ename ='ALLEN'); 만약 서브쿼리를 이용한 Delete 문을 수행하지 않는다면 쿼리문을 두번 실행하여 데이터를 삭제해야한다. 마지막..
SQL 서브쿼리를 이용한 DATA 수정 Update (update 절에 튜닝시 merge 만큼빠름) update 문에 서브쿼리를 쓸 수 있는 절 update 테이블명 set 변경할 컬럼과 값 where 조건 → 서브쿼리절은 , update, set, where 절 3개 모두 가능하다. 여러개의 데이터를 한번에 갱신할 수 있는 SQL / 많은 양의 데이터 갱신할때는 튜닝된SQL 을 작성해야된다. ******* 튜닝된 SQL 이란 merge 문 과 update 절의 subqery 문 이다. (1) where 절에 서브쿼리를 쓰는경우 예제: 스미스 보다 더많은 월급을 받는 사원들의 부서번호를 10번으로 수정 update emp set deptno = 10 where sal < (select sal from emp ename = 'SMITH'); 문제 :ALLEN 보다 늦게입사한 사원들 커미션을 9000으로 ..
SQL 서브쿼리를 이용한 DATA 입력 Insert insert into 문에 value 가 아닌 select 절을 이용하여 한번에 데이터를 입력하는 방법이다. (1) emp_backup 이라는 테이블을 생성하고 그안에 데이터를 emp 테이블 데이터로 한번에 추가하고 싶을때 insert 문에 서브 쿼리문을 이용하여 한번에 입력 할 수 있다. 예제 : emp table 을 그대로 복제한 emp2 테이블 부서에 deptno 가 10 번인 사원들의 empno, ename, sal, deptno 를 한번에 갱신 해보자. insert into emp2 (empno, ename, sal, deptno) select ename, ename, sal, deptno from emp where deptno =10; -> 이런식으로 일반적으로 insert 문장을 쓸때 쓰던 ..
SQL Select 절에 LOCK 을 거는 For Update LOCK 은 UPDATE 문을 수행할때 필요한 것. → 내가 변경하고자 하는 데이터를 다른 세션이 변경하지 못하도록 막을때 필요 SELECT 절에도 LOCK 을 걸 수 있다. → 마지막 절에 for update 라고 작성해 주면 select 절에 lock 이 걸린다. 왜 select 절에도 lock 이 필요할까? → 내가 만약 밤 12 시에 오늘의 총 매출 집계를 하고싶고 지금 select 하는 그 시점의 데이터로 집계하고 싶을때 누구도 내가 집계하려는 데이터를 변경하면 안된다. ~ 그래서 그 누구도 데이터를 갱신하지 못하게 할때 for update 를 사용한다. 예시 select ename, sal from emp where ename = 'KING' FOR UPDATE ; -> 마지막 문장에 for ..
SQL 쿼리에 LOCK이 걸리는 경우 특정'행'을 갱신을 하는 update 문장이 있다면, 그 update 문장을 수행하는 session 은 update 하는 '행'에lock 을 건다. 그리고 그 lock은 commit 이나 rollback 을 할때까지 유지 됩니다. lock 을 거는 이유는? 내가 변경하고 있는 데이터를 다른사람이 변경하지 못하도록 하기 위해서. update 하는 '행' 전체에 lock 을 건다. → 만약 내가 king 의 월급을 변경했다면 다른 session 들은 king 의 월급 외에도 다른 어떤 컬럼의 데이터도 변경 할 수 없다. → king 말고 allen 의 데이터는 변경 가능하다
SQL [TCL] COMMIT / ROLLBACK COMMIT : 지금까지 작업한 DML 작업 (insert, update, delete, merge ) 를 데이터 베이스에 영구히 저장하겠다. rollback : 지금까지 작업한 DML 작업(insert, update, delete, merge) 를 모두 취소하겠다. insert.............어쩌고저쩌고 insert.................어쩌고저쩌고 입력한 작업물들 을 commit................ —————→ 여기까지는 모두 저장이 된것이고 insert................ update................. rollback ; ----------------> commit 다음 insert 문부터 전부다 rollback 이 된다. 문제 사원테이블의 월급을 모두 ..