ORACLE [oracle] 서브쿼리, Sub Query

2020.05.03 00:31

졸리운_곰 조회 수:1206

[oracle] 서브쿼리, Sub Query

서브쿼리, Sub Query

- 하위쿼리, 부분쿼리

- SQL 안에 또 다른 SQL이 들어있는 형태

- 서브쿼리를 사용할 수 있는 위치(어디든지 데이터가 필요한 곳이면 다 사용 가능)

    a. where절 : 서브쿼리의 결과셋을 조건으로 사용한다.

    b. 컬럼리스트 : 서브쿼리의 결과셋을 하나의 컬럼값으로 사용한다.

    c. from절 : 서브쿼리의 결과셋을 하나의 테이블로 이용. (=뷰 , 인라인뷰

    d. order by절

    e. group by절

 

목적 : tblhousekeeping 테이블에서 가장 비싼 아이템을 가져오려고한다.

 

select item from tblhousekeeping where max(price) = price; 이게 안됨

 

서브쿼리사용

서브쿼리가 먼저 질의한 후에 반환되는 결과값을 원래 쿼리에 사용하고자 할때...

select item from tblhousekeeping where price = (select max(price) from tblhousekeeping)

>>> 여기있는 서브쿼리에서 price의 최대값이 반환되면 그것을 각각의 price와 비교한 후 price값이 max 값인 컬럼과 같은 값일때 반환하는 원리

 

 

select avg(basicpay) from tblinsa; --평균급여 : 155만원

 

--기본급이 155만원(평균)보다 큰 사람들

select * from tblinsa where basicpay > (select avg(basicpay) from tblinsa); 서브쿼리 사용

 

--영업부 직원중 가장 적은 급여를 받는 사람보다 더 많은 급여를 받는 직원이 전체 직원중 몇명입니까??

select count(*) from tblinsa where basicpay >= (select min(basicpay) from tblinsa where buseo='영업부');

 

--영업부에서 가장 날짜가 적은사람(고참인사람 - 유닉스시간으로 계산하나봄.) 보다 더 많이 받는 사람은??

select count(*) from tblinsa where basicpay >= (select min(basicpay) from tblinsa where ibsadate = (select min(ibsadate) from tblinsa where buseo='영업부'));

>>> 입사날짜가 가장 적은(최고참 - 유닉스시간으로 치면 가장 최근이 제일 크게나옴.) 사람의 입사년도를 가져오고 그 입사년도인 사람의 급여중 가장 작은 것을 가져오는 형태이다. 그렇게 반환받은 basicpay값으로 처리하면 된다.

 

hr 계정(hr 계정 로그인해서 예제 확인해보시기 바랍니다.)

select * from employees;

select * from departments;

select * from locations;

 

직원중 steven king이 소속된 부서(departments)가 어느지역에 있는지 주소를 알려주세요.

조건1 select department_id from employees where first_name = 'Steven' and last_name = 'King';

>> 이름이 steve king인 사람의 부서 id 를 알아야함.

 

조건2 select location_id from departments where department_id =90;  

>> steve king이라는 사람이 소속된 부서의 위치 id 값을 알아와야함.

 

최종SQL 

select * from locations where location_id=(select location_id from departments

    where department_id =(select department_id from employees

        where first_name = 'Steven' and last_name = 'King'));

>>> 두가지 조건을 조합하여 만든 sql쿼리

 

컬럼리스트에 서브쿼리 사용하기

--모든 직원들 중 '홍길동'보다 얼마를 더 받거나 덜 받는지 궁금

select basicpay from tblinsa where name ='홍길동';  --2610000

 

select name ,basicpay,basicpay-2610000 as "차액" from tblinsa where name <>'홍길동';

 

select 

name ,basicpay, basicpay-(select basicpay from tblinsa where name ='홍길동') as "차액"

,(select basicpay from tblinsa where name ='홍길동') 

from tblinsa where name <>'홍길동';

>>> 컬럼리스트에서 사용한 서브쿼리는 단하나의 레코드만 나오도록 해야함. 이 쿼리에서 name 컬럼은 PK값이 아니므로 올바르지 못한 쿼리이기는 함.

 

집계함수

1. where절에서 사용불가> where 절에서 서브쿼리를 사용하면 가능

2. 컬럼리스트에 일반컬럼과 집계함수를 동시에 못쓴다. > 컬럼리스트에 서브쿼리를 쓰면 가능.

 

select round(avg(basicpay)) as "평균급여" from tblinsa; --155만원

select name,basicpay from tblinsa;

 

select 

name,basicpay

,basicpay-(select round(avg(basicpay))from tblinsa) as"평균급여" 

,basicpay-(select round(max(basicpay))from tblinsa) as"최대급여" 

,basicpay-(select round(min(basicpay))from tblinsa) as"최소급여"

from tblinsa;

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

 

 

from절에서 서브쿼리를 사용하기

 

select * from tblname where gender = 'f';

 

select * from (select * from tblname where gender = 'f');--인라인뷰

 

select name,직위,city,이름 from (select name,substr(name,2,2) as "이름",jikwi as"직위", city from tblinsa where buseo = '영업부');

 

>>> select from 테이블, 에서 구해서 나온 값을 일종의 테이블로 보고 결과셋(나온 뷰)에서 또한번 select로 값을 얻어오는 방식이다.

 

where절에서의 서브쿼리

 

--서브쿼리의 결과가 단일행인 경우 -> 비교 연산자 사용.

--서브쿼리의 결과가 다중행인 경우 -> in을 사용한다. (열거형)

 

--서브쿼리의 결과가 단일컬럼일경우 : 값으로 취급

--서브쿼리의 결과가 다중컬럼일경우

--> =연산자와 ()를 사용해서 다대다 배교를 만들어서 사용한다(순서와 개수가 다르면 안된다***)

 

 

--홍길동과 이순애가 속한 부서의 직원명단을 가져오시오.

 

--ORA-01427: single-row subquery returns more than one row

select * from tblinsa 

where buseo = (select buseo from tblinsa where name = '홍길동' or name = '이순애');

 

select * from tblinsa 

where buseo in (select buseo from tblinsa where name = '홍길동' or name = '이순애');

 

select * from tblinsa 

where buseo in (select buseo,city from tblinsa where name = '홍길동' or name = '이순애');

 

select * from tblinsa where name = '엄용수';

 

--직원중 이름 나윤균, 나윤균과 같은 부서에 소속되어 있으며 같은 직위를 가지는 직원들은 누구누구있나...?

select * from tblinsa 

where buseo = (select buseo from tblinsa where name = '엄용수') 

and 

jikwi = (select jikwi from tblinsa where name = '엄용수');

 

--다중컬럼일때

select * from tblinsa 

where (buseo,jikwi,to_char(ibsadate,'yyyy')) = (select buseo,jikwi,to_char(ibsadate,'yyyy') from tblinsa where name = '엄용수');

 

 

 

컬럼리스트에서의 서브쿼리

-- : 서브쿼리가 무조건 단일값 반환해야 한다. 나머지는 사용 불가능하다.

 

--1. 단일컬럼 + 단일행 -> 얘만 가능.

select first,last,(select avg(weight) from tblname) as"평균몸무게" from tblname;

 

--2. 단일컬럼 + 다중행 : 100% 불가능

select first,last,(select height from tblname where height>170) from tblname;

 

--3. 다중컬럼 + 단일행 : 불가능

select first,last,(select height,weight from tblname where first='재석') from tblname;

 

 

from절에서의 서브쿼리

--1~4 번까지 다 사용 가능

--where절(값의역할), 컬럼리스트(단일컬럼 값의 역할), from(테이블의 역할)

 

--1. 단일컬럼 + 단일행

 

--2. 단일컬럼 + 다중행

 

--3. 다중컬럼 + 단일행

 

--4. 다중컬럼 + 다중행

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
공지 오라클 기본 샘플 데이터베이스 졸리운_곰 2014.01.02 86355
공지 [SQL컨셉] 서적 "SQL컨셉"의 샘플 데이타 베이스 SAMPLE DATABASE of ORACLE 가을의 곰을... 2013.02.10 78810
공지 [G_SQL] Sample Database 가을의 곰을... 2012.05.20 95567
704 [oracle] oracle 함수 간단 정리 file 졸리운_곰 2020.05.03 1475
703 [oracle] sub-query 서브쿼리 file 졸리운_곰 2020.05.03 1617
» [oracle] 서브쿼리, Sub Query 졸리운_곰 2020.05.03 1206
701 [oracle] 서브쿼리(SUB QUERY) 정리 file 졸리운_곰 2020.05.03 1121
700 [oracle] ORA-00979: GROUP BY 표현식이 아닙니다 file 졸리운_곰 2020.05.01 1648
699 [Oracle] ORA-00979: GROUP BY 표현식이 아닙니다 졸리운_곰 2020.05.01 1329
698 [oracle] ORA-00979: GROUP BY 표현식이 아닙니다 졸리운_곰 2020.05.01 1190
697 [oracle]오라클 group by, rollup file 졸리운_곰 2020.05.01 1317
696 [oracle] Introduction to Oracle GROUP BY clause file 졸리운_곰 2020.05.01 982
695 [oracle] GROUP BY 절과 HAVING 절 졸리운_곰 2020.05.01 1116
694 ORACLE 오라클 CASE문 사용법 CASE WHEN THEN END file 졸리운_곰 2020.04.27 1706
693 [ORACLE] CASE WHEN ~ THEN ~ ELSE END file 졸리운_곰 2020.04.27 1219
692 Generative Adversarial Network : DCGAN을 이용한 이미지 생성 file 졸리운_곰 2020.04.20 1514
691 [Oracle|오라클] PLS-00323: 부프로그램 또는 '******' 커서는 패키지 지정에 정의되고 패키지 본체에 나타나야합니다 졸리운_곰 2020.04.16 1124
690 Question answering with TensorFlow file 졸리운_곰 2020.04.06 1395
689 [오류] ORA-01861 literal does not match format string (리터럴이 형식 문자열과 일치하지 않음) 졸리운_곰 2020.03.12 1031
688 ORA-01861: literal does not match format string file 졸리운_곰 2020.03.12 1417
687 개발자 환장하는 "ORA-01861: literal does not match format string" 졸리운_곰 2020.03.12 1200
686 [Oracle|오라클] INTERVAL 날짜 년 빼기 더하기 (ADD_YEARS) file 졸리운_곰 2020.03.11 1538
685 SQLD 기출 문제 및 요약 정리 모음 졸리운_곰 2020.03.06 2879
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED