서브 쿼리란?
단일 열 단일 행 서브 쿼리 (데이터하나):
- 서브 쿼리가 하나의 컬럼에서 하나의 행을 검색한다.
단일 열 다중 행 서브 쿼리 (열은하나 행이 여러개):
- 서브 쿼리가 하나의 컬럼에서 여러 개의 행을 검색한다.
다중 열 서브 쿼리 :
- 서브 쿼리가 여러 개의 컬럼을 검색한다.
서브 쿼리는 WHERE절, HAVING절과 같이 조건 절에 주로 쓰이고 FROM절에 쓰이는 경우도 있다.
특히 FROM절에 쓰인 서브 쿼리는 인라인 뷰(Inline View)라고 부른다.
예측하기 힘든 단일 행 서브 쿼리를 수정하는 방법 (단일 행 연산자를 다중 행 연산자로 바꾼다.)
① '=' 연산자는 'IN' 연산자로 바꾼다.
② 부등호 ('<', '>', '<=', '>=')는 any, all 연산자를 추가한다. (가독성이 떨어져 상대적으로 잘 안씀)
③ Max(), Min()과 같은 그룹 함수를 사용 한다.
실습
1. 김혁윤 보다 평점이 우수한 학생의 학번과 이름을 검색한다.
select sno 학번, sname 이름
from student
where avr > (select avr from student where sname = '김혁윤') ;
2. 권현와 동일한 학년 학생 중에 평점이 강은혜와 동일한 학생을 검색한다.
select syear 학년, sname 이름, avr 학점
from student
where avr = (select avr from student where sname = '강은혜')
AND syear = (select syear from student where sname = '권현') ;
3. 이학수학 과목과 동일한 학점수인 과목을 검색한다.
select cname 과목명, st_num 학점수
from course
where st_num = (select st_num from course where cname = '이학수학') ;
4. 타 학과에 송강 교수와 동일한 지위의 교수 명단을 검색한다.
select pname 이름, section 소속학과, orders 직위
from professor
where section != (select section from professor where pname = '송강')
AND orders = (select orders from professor where pname = '송강');
5. 제갈민의 입사일보다 나중에 부임한 교수의 명단을 검색한다.
select pname 교수명, hiredate 부임일
from professor
where hiredate > (select hdate from emp where ename = '제갈민');
6. 강태용보다 일반 화학 과목의 학점(A,B,..)이 더 낮은 학생의 명단을 학점과 검색한다.
select sname 이름, c.result 학점, b.cname 과목명
from student a, course b, score c
where a.sno = c.sno AND b.cno = c.cno
AND b.cname = '일반화학'
AND c.result = (select result from student a, score b where a.sno = b.sno AND a.sname = '강용태');
select a.sname 이름, b.result 학점, c.cname 과목명
from student a, score b, course c
where a.sno = b.sno AND b.cno = c.cno AND c.cname = '일반화학'
AND b.result < (select result from student a, score b where a.sno = b.sno AND a.sname = '강용태');
select a.sname 이름, c.cname 과목명, d.grade 학점
from student a, score b, course c, scgrade d
where c.cname = '일반화학'
AND d.scgrade < (select scgrade from student a, score b, course c, scgrade d where a.sname = '강용태' AND c.cname ='일반화학');
select grade
from student a, course b, scgrade c, score d
where a.sno = d.sno AND b.cno = d.cno AND result between loscore AND hiscore
AND a.sname = '강태용' AND b.cname = '일반화학';
select a.sno, sname, cname, grade
from student a, course b, score c, scgrade d
where
AND b.cname = '일반화학'
AND d.grade > (select grade
from student a, course b, scgrade c, score d
where a.sno = d.sno AND b.cno = d.cno
result BETWEEN loscore AND hiscore
AND sname ='강태용' AND cname ='일반화학');
SELECT s.sno, sname, cname, grade
FROM student s, course c, score r, scgrade g
WHERE s.sno=r.sno AND r.cno=c.cno
AND result BETWEEN loscore AND hiscore
AND cname='일반화학'
AND grade > (SELECT grade
FROM student s, course c, scgrade g, score r
WHERE s.sno=r.sno AND r.cno=c.cno
AND result BETWEEN loscore AND hiscore
AND sname='강태용' AND cname='일반화학');
any 어떤것보다 작다
all 전체보다 작다
select eno 사번, ename 이름, dno 부서번호, job 업무
from emp
where (dno, job) IN (select dno, job from emp where ename ='김선유')
AND ename ! ='김선유';
select eno 사번, ename 이름, dno 부서번호, job 업무
from emp
where dno in (select dno from emp where ename = '김선유')
AND job in (select job from emp where ename = '김선유')
AND ename != '김선유';
select dno, eno, ename, job
from emp
where ename = '김선유';
실습
1. 화학과 학생과 평점이 동일한 학생들을 검색한다.
select sname 이름, sno 학번, major 학과
from student
where avr in (select avr from student where major = '화학')
AND major != '화학';
2. 화학과 교수와 부임일이 같은 직원을 검색한다.
select ename 이름, hdate 입사일
from emp
where hdate in (select hiredate from professor where section = '화학');
3. 화학과 학생과 같은 학년에서 평점이 동일한 학생들을 검색한다.
select syear 학년, sname 이름, major 학과, avr 평점
from student
where avr in (select avr from student where major = '화학')
AND syear in (select syear from student where major = '화학')
AND major != '화학';
4. 10번 부서 사원들보다 년봉을 많이 받는 사원을 검색한다.
5. 10번 부서 사원들과 업무와 성별이 동시에 일치하는 사원을 검색한다.
중복제거 (dis 정렬해서 제거함)
집합 연산자
합집합 : UNION :검색된 결과의 합으로 중복은 제거된다. (정렬을 유발함)
UNION ALL : 중복을 포함한 결과의 합을 검색한다. (정렬을 유발하지않음)
교집합 : INTERSECT : 양쪽 모두에서 포함된 행을 검색한다. (일반적으로는 거의 안씀)
차집합 : MINUS : 첫 번째 검색된 결과에서 두 번째 검색 결과를 제외한
나머지를 검색한다. (일반적으로는 거의 안씀)
SQL> SELECT ...
2 [UNION ALL | UNION | INTERSECT | MINUS]
3 SELECT ...
실습
1. 화학과 학생과 교수를 검색한다. (집합 연산자를 이용한다.)
select sno 교수번호_학생번호, sname 이름, major 학과
from student
where major = '화학'
union
select pno, pname, section from professor where section = '화학';
2. 정교수의 명단과 모델링이 업무인 직원의 이름, 입사일(부임일)을 검색한다.
select pname 이름, hiredate 부임일, orders 직위_업무
from professor
where orders = '정교수'
union
select ename, hdate, job from emp where job = '모델링';
DML(INSERT, UPDATE, DELETE) 문의 이해 (테이블을 조작)
SQL> INSERT INTO <테이블> [(컬럼, 컬럼, ... )]
2 VALUES (값, 값, ...);
SQL> UPDATE 테이블
2 SET 컬럼 = 값, 컬럼 = 값, ...
3 [WHERE 조건];
SQL> DELETE FROM 테이블
2 [WHERE 조건];
SQL> COMMIT; 작업완료 명령어 (반드시 작업이 끝난뒤에 명령어를 써야한다.)
SQL> ROLLBACK; 작업을 취소하는 명령어 (전에 했던 모든 작업들이 취소됨)
ALTER SESSION SET nls_date_format='YYYY/MM/DD'; -> 날짜 입력 포맷
ALTER SESSION SET nls_date_format = 'YYYY/MM/DD:HH24:MI:SS'; -> 시분초까지 입력 포맷
없는 값은 null ''쓰지않는다
SQL> SELECT sysdate FROM dual; -> 현재 날짜 표시
읽기일관성 -> 커밋 또는 롤백한 이후의 데이터만 봐야함
redo = 되돌림 , undo = 취소
트렌젝션 : insert, update, delete를 이용하여 commit 또는 rollback 하는 과정
데이터를 가져오는 것 scan
scan 1) full table : 위에서 부터 아래까지 다 읽음 > 성능 떨어짐 (만약 데이터양이 많은 테이블을 읽게되면 메모리를 많이 차지하게 되서 느림)
2) index : 특정 컬럼을 정렬해서 복사, rowid 컬럼을 만들어서 행의 데이터 위치를 표시함 (데이터 찾을때 빠름)
insert 하는 과정에서 index의 공간이 부족할수도 있다. 이러한 이유로 무한정 만들어 놓지 않는다.
select * from emp
order by ename;
>> full table은 모든 데이터를 다 읽고 정렬해야해서 시간이 오래걸림
>> index는 정렬되어있어서 바로 출력됨
'SQL' 카테고리의 다른 글
SQL 테이블 구조,생성, 데이터타입, 제약조건 PK,FK, 제약조건조회 (0) | 2022.11.08 |
---|---|
SQL 명령어 그룹함수와 HAVING절, GROUP BY절, (0) | 2022.11.08 |
오라클 사용자 계정 만들기, 데이터베이스 서버 네트워크 연결 (0) | 2022.11.08 |
SQL 명령어 Self join, Outer join (0) | 2022.11.08 |
SQL LIKE, BETWEEN, IN 연산자 (0) | 2022.11.08 |