본문 바로가기

sql

8. JOIN

728x90
반응형

조인

 " 여러개의 테이블에 있는 컬럼들을

모아서

하나의 결과로 출력하기 위한 SQL 문법 "

 

:

select * from dept;

 

문제179.

이름, 부서위치를 출력하시오

 select ename, loc

from emp, dept

where 이름과 부서위치를 출력할 있을만큼

emp dept 서로 어떤 연결고리 있다는

증거를 보여줘야 한다.

 

**그냥 뽑으면 중복 오짐.

 

select ename, loc

from emp, dept

where emp.deptno = dept.deptno;

=

select E.ename, D.loc

from emp E, dept D

where E.deptno =  D.deptno;

 

 

문제180.

위의 결과를 다시 출력하는데

부서위치가 DALLS 사원들만 출력하시오

select ename, loc

from emp, dept

where emp.deptno= dept.deptno

and

loc = 'DALLAS';

 

 

문제181.

직업이

SALEMAN 사원들의

이름과 직업과 부서위치를

출력하시오

select ename, job, loc

from emp, dept

where emp.deptno = dept.deptno

and

job = 'SALESMAN';

 

 

 

문제 182.

월급이 1000 에서 3000 사이인 사원들의

이름과 월급과 부서명과 직업을

출력하시오

select ename, sal, dname, job

from emp E, dept D

where E.deptno = D.deptno

and

sal between 1000 and 3000;

 

 

문제 183. 위의 결과에서 deptno 같이

출력해보시오.

 

select ename, sal, dname, job, E.deptno

from emp E, dept D

where E.deptno = D.deptno

and

sal between 1000 and 3000;

 

deptno 중복되니까

테이블 지정 해줘야 .

사실, ename, dname, job 항목에도

테이블 붙여서 출력해야 한다.

안그러면 나중에 어디 테이블에서 나온 값인지

몰라서 일일이 다뒤지는 상황이 발생한다.

 

테이블 별칭= E, D

 

 

문제185.

이름이 KING 사원의

이름과 월급과 직업과 부서위치를

출력하시오

select E.ename, E.sal, E.job, D.loc

from emp E, dept D

where E.deptno =  D.deptno

and

E.ename= 'KING';

 

 

문제186.

부서위치, 부서위치별 토탈월급을 출력하시오

select D.loc, sum(E.sal)

from emp E, dept D

where E.deptno = D.deptno

group by D.loc;

 

 

 

문제187. 위의 결과를 다시 출력하는데

토탈월급이 9000 이상인것만

출력하시오

 

select D.loc, sum(E.sal)

from emp E, dept D

where E.deptno = D.deptno

group by D.loc

having sum(E.sal) > 9000;

 

 

 

문제188.

직업이 SALESMAN 이고

월급이 1000 이상인 사원들의

이름과 월급과 직업과 부서위치를

출력하시오

 

select E.ename, E.sal, E.job, D.loc

  from emp E, dept D

  where E.deptno = D.deptno

  and      E.job = 'SALESMAN'

  and      E.sal > 1000;

 

 

문제189. 부서위치, 이름, 월급, 월급에 대한

순위를 출력하시오.

 

select D.loc, E.ename, E.sal,

dense_rank()over(order by E.sal desc)순위

from emp E, dept D

  where E.deptno = D.deptno ;

 

 

 

문제190.

위의 결과를 다시 출력하는데

순위를 부서번호별로

각각 출력되게 하시오

 

select D.loc, E.ename, E.sal,

dense_rank()over(partition by D.loc order by E.sal desc)순위

from emp E, dept D

  where E.deptno = D.deptno ;

 

 

문제191.

부서위치, 부서위치별로 속한 사원들의 이름을

가로 출력하시오.

 

select D.loc,

listagg(E.ename, ',') within group(order by E.ename)이름

from emp E, dept D

  where E.deptno = D.deptno

group by D.loc;

 

 

문제120.

부서위치, 부서위치별 토탈월급 출력하는데

전체 토탈월급이 아래쪽에 출력되게하시오

 

내꺼 틀린답

select D.loc,

sum(E.sal) over () 토탈월급 over(partition by D.loc order by E.sal asc;)

from emp E, dept D

  where E.deptno = D.deptno

group by rollup(D.loc);

 

select  nvl(D.loc, '전체토탈')as 부서위치,

sum(E.sal) as 토탈월급

from emp E, dept D

 where E.deptno = D.deptno

group by rollup(D.loc);

 

 

 

문제193.

그럼 위의 문제를 다시 아래와 같이 결과가

출력되게 하시오.(숫자에 찍어서 나오게끔 하라는 )

select nvl(d.loc,''),

       to_char(sum(e.sal),'999,999')

   from emp e, dept d

  where e.deptno = d.deptno

  group by rollup(d.loc);

 

 

문제194.

부서위치,

             부서위치별 토탈월급,

             부서위치별 최대월급,

             부서위치별 평균월급,

             부서위치별 인원수를 출력하시오

 

select  D.loc as 부서위치,

sum(E.sal) as 토탈월급,

max(E.sal) as 최대월급,

round(avg(E.sal)) as 평균월급,

count(*) as 인원수

from emp E, dept D

 where E.deptno = D.deptno

group by D.loc;

 

*partition by 필요없는 이유

: 부서위치가 통일되서 굳이 묶을 이유가 없음.

 

 

 

문제195.(오늘의 마지막 문제)

아래와 같이 결과를 출력하시오

select * from

(

select E.sal as 월급, D.loc as 위치

from emp E, dept D

 where E.deptno = D.deptno

)

pivot(sum(월급)for 위치 in ('NEW YORK','DALLAS', 'CHICAGO'));

 

 

 

EQUI JOIN

다른 컬럼을 조인시킨다.

 

문제196.

DALLAS 에서 근무하는

사원들의 이름과 월급과 부서위치를

출력하는데

월급이 높은 사원부터 출력하시오

 

select E.ename, E.sal, D.loc

from emp E, dept D

where E.deptno=D.deptno ----조인의 연결고리

and

D.loc = 'DALLAS'   ----------------검색조건

order by E.sal desc;

 

 

문제197.  부서테이블 전체를 조회하시오

 

 

 

문제198.

이름과 부서위치를 출력하는데

출력 부서위치가 무엇인지

확인하시오

 

select E.ename,  D.loc

from emp E, dept D

where E.deptno=D.deptno;

 

보스톤이 없음

emp 테이블에

부서번호 40, 보스턴 근무자가 없어서.

 

 

 

OUTER JOIN

각기 다른 테이블을 출력하는데

일치하지 않는 값도 출력가능하게 하는 기능.

 

문제199. 이름과 부서위치를 출력하는데

출력안된 부서위치도

같이 출력하시오.

******emp 테이블에 없는 내용도 뽑아라

 

select E.ename,  D.loc, E.deptno

from emp E, dept D

where E.deptno(+)=D.deptno;

 

**emp 테이블에 없는 내용을 플러스+

해주려고 outer join sign 붙여준다.

(+) :  outer join sign

 

 

 

 

 

join 문법의 종류 크게 2가지

1. 오라클 조인 문법

             -equi join : 조인의 연결고리가

                        =(이퀄) 경우의 조인문법

 

             -outer join: equi join 으로는

                        없는 결과를

                        사용하는 조인

 

             -non equi join: 조인의 연결고리가

               =(이퀄) 아닌 경우의 조인문법

 

            -self join: 자기 자신의 테이블과

                       조인하는 조인 문법

 

2. 1999 ANSI 조인 문법

* 추가하기

 

insert into emp(empno, ename, deptno)

     values( 9293 , 'JANE', 70) ;

 

 

 

 

문제200.

이름과 부서위치를 출력하는데

사원 테이블에는 존재하는데

부서테이블에는 존재하지 않는

정보도 같이 출력하시오

 

select E.ename,  D.loc, E.deptno

from emp E, dept D

where E.deptno=D.deptno(+);

 

 

문제201.

부서위치, 부서위치별 토탈월급을 출력,

BOSTON 출력하고

토탈월급이 높은것부터 출력하시오

 

select  D.loc, sum(E.sal)

from emp E, dept D

where E.deptno(+)=D.deptno

 group by d.loc

order by sum(E.sal) desc;

 

 

NULL 위치조정

근데 여기서

null 값이 위에 있는게 싫다

아래 보내려면

 

select  D.loc, sum(E.sal)

from emp E, dept D

where E.deptno(+)=D.deptno

 group by d.loc

order by sum(E.sal) desc nulls last;

 

 

문제202.

위의 결과를 다시 출력하는데

토탈월급이 낮은 것부터 출력하시오.

 

select  D.loc, sum(E.sal)

from emp E, dept D

where E.deptno(+)=D.deptno

 group by d.loc

order by sum(E.sal) asc;

 

***낮은것 부터 하면

null 알아서 출력된다.

으로 빼고 싶으면

 

select  D.loc, sum(E.sal)

from emp E, dept D

where E.deptno(+)=D.deptno

 group by d.loc

order by sum(E.sal) asc nulls first;

 

 

 

 

1. 오라클 조인 문법

             -equi join : 조인의 연결고리가

                        =(이퀄) 경우의 조인문법

 

             -outer join: equi join 으로는

                        없는 결과를

                        사용하는 조인

 

             -non equi join: 조인의 연결고리가

               =(이퀄) 아닌 경우의 조인문법

 

            -self join: 자기 자신의 테이블과

                       조인하는 조인 문법

 

2. 1999 ANSI 조인 문법

 

 

non equi join

 salgrade : 급여등급 테이블

drop  table  salgrade;

create table salgrade

( grade   number(10),

  losal   number(10),

  hisal   number(10) );

 

insert into salgrade  values(1,700,1200);

insert into salgrade  values(2,1201,1400);

insert into salgrade  values(3,1401,2000);

insert into salgrade  values(4,2001,3000);

insert into salgrade  values(5,3001,9999);

 

commit;

 

 

****slagrade table

 

 

NON EQUI JOIN

WEHRE 절의 연결고리가 서로 같지 않는

테이블을 연결할 사용하는 조인문법

문제203.

이름, 월급, 등급grade 출력하시오

(emp, salgrade 테이블 조인해서)

 

원하지 않는 답이 나옴

select E.ename, E.sal, S.grade

from emp E, salgrade S;

 

 

위의 salgrade 테이블 출력값과 비교하면

올바르지 못한 값이다.

대로 뽑으면

등급 5개에 대한 사원15명의 경우의수가

 출력된다 ( 75)

 

 

 

 

emp table 월급은

slagrade lowsal= losal

          high sal= hisal 사이에 있다.

 

 

select E.ename, E.sal, S.grade

from emp E, salgrade S

where E.sal between S.losal and S.hisal;

 

***losal =  low sal

    hisal =  high sal

 

 

 

설명:  조인할 where 절의

조인의 연결고리가

= 아닌 경우의 조인문법을

 non equi join 이라고 한다.

 

고객등급, 포인트 충전

 

 

문제204.

등급(grade), 등급별로 해당하는 사원들의

이름을 가로로 출력하시오

 

select S.grade,

listagg(E.ename, ',') within group

        (order by E.ename)

from emp E, salgrade S

where E.sal between S.losal and S.hisal

group by S.grade;

 

 

 

 

3 TABLE JOIN

 

문제205.

이름, 월급, 급여등급, 부서위치를 출력하시오

**급여등급은 salgrade 테이블에 있는것과

  조인하라는 !!

 

오답

select E.ename, E.sal, S.grade, D.loc

from emp E, salgrade S, dept D

where E.sal between S.losal and S.hisal;

 

 

 

 

******3 테이블 조인!!!!!!

dept--------emp--------------salgrade

     연결고리       연결고리

테이블 3개면

연결고리를 2 써줘야 한다.

 

 

select E.ename, E.sal, S.grade, D.loc

from emp E, salgrade S, dept D

where E.deptno =  D.deptno

   and  E.sal between S.losal and S.hisal

 

 

 

** 서브쿼리로 안했는가

>>>서브쿼리는 원하는 값만 where 지정 하기위해서인데

where 지정시 지정값 판단오류를 막기 위해

별칭지정 해서 작업해야하는데

실행순서 때문에

서브쿼리를 써야 한다.

 

 

205번은

where E.deptno =  D.deptno

값을 넣어서 중복값이 출력

 

 

 

문제206.

아래표(문제205)에서 부서위치가 CHICAGO

사원들만 출력하시오

 

 

select E.ename, E.sal, S.grade, D.loc

from emp E, salgrade S, dept D

where E.deptno =  D.deptno

   and  E.sal between S.losal and S.hisal

   and

         D.loc = 'CHICAGO';

 

 

 

select E.ename, E.sal, S.grade, D.loc

from emp E, salgrade S, dept D

where E.deptno =  D.deptno   -----------연결고리

   and  E.sal between S.losal and S.hisal--연결고리

   and

         D.loc = 'CHICAGO';---------------------검색조건

 

 

 

문제207. 아래와 같이 결과를 출력하시오

 select S.grade,

    listagg(E.ename||'('||D.loc ||')', ',')

      within group

        (order by E.ename) as LIST_ENAME

 

from emp E, salgrade S, dept D

where E.deptno = D.deptno

and E.sal between S.losal and S.hisal

group by S.grade;

 

 

 

self join

 " 자기 자신의 테이블과 조인하는 조인 문법"

언제 필요한가? 사원이름, 관리자의 이름(직속상사) 출력할

 

 

 

밑에 블레이크, 클라크, 존스 있음

 블레이크 밑에 팀원들 있음

 클라크, 존스 밑에도 팀원들 있음

 

이런 관계도를 sql 만드는 거임

 

 

 

select empno, ename, mgr

from emp;

*mgr

자기의 직속상사 또는 관리자를 말함

 

블레이크의 상사=mgr 킹이다

존의 상사는 킹이다

 

 

self join

 

문제208.

사원이름, 관리자의 이름(직속상사)

출력하시오

 

select

   사원.ename as 사원,

   관리자.ename as 관리자

from emp 사원, emp 관리자

where 사원.mgr = 관리자.empno;

 

 

 

문제209.(점심시간 문제)

select

관리자.ename||'('||관리자.sal||')' as 관리자,

listagg(사원.ename||'('||사원.sal||')', ',')

       within group(order by 사원.ename) as 사원

  from emp 관리자, emp 사원

  where 관리자.empno=사원.mgr

             and

            관리자.deptno = 사원.deptno

group by 관리자.ename, 관리자.sal;

 

**group by

ename, sal 둘다 쓰는 이유

창에 2 그룹시키니까.

예전 166번은 통신사 하나라서.

 

 

 

조인문법의 종류 2가지(페이지 239)

1. 오라클 조인문법

         -EQUI JOIN (= inner join )

         -NO EQUI JOIN

         -OUTER JOIN

         -SELF JOIN

 

2. 1999 ANSI 문법

         -full outer join / on

         -on 절을 사용한 조인 문법

    

 

문제211.

이름과 부서위치를 출력하는데

outer join 사용해서 작성을 하고

(+)<<<--outer join sign 양쪽에

작성해서 수행해 보시오

Full outer join/on 사용해서

 

 

 select E.ename, D.loc

from emp E, dept D

where E.deptno(+)=D.deptno(+);

에러남!!!!!!!!!!!!!

outer join 사인을 한군데만 있다고

에러나옴.

 

 

그래서

full outer join 필요함

(=1999 ANSI 문법이다)

ANSI =  American National Standards Institute

미국국립표준문법

 

Oracle, mssql, mysql, postgre SQL, Maria db...

>>ansi 이용하면 위에 가능.

 

 

어느 데이터베이스에서든 사용할 있다.

-->>full outer join 문법

 

select E.ename, D.loc

from emp E full outer join dept D

                      on(E.deptno = D.deptno);

 

*** 테이블에 없는 null

알아서 뽑아준다.

 

 

 

 

문제212. 이름과 부서위치를 출력하는데

on 절을 사용한 조인문법으로 작성하시오

 

select E.ename, D.loc

from emp E  join  dept D

                 on(E.deptno=D.deptno);

 

*콤마 대신 join

 where 대신 on

 

 

문제213. 위의 결과에서 DALLAS 에서

근무하는 사원들만 출력하시오

 

select E.ename, D.loc

from emp E  join  dept D

                 on(E.deptno=D.deptno)

               and D.loc = 'DALLAS';

 

 

선생님답:

select E.ename, D.loc

from emp E  join  dept D

       on(E.deptno=D.deptno) ---조인 연결 조건

 where D.loc = 'DALLAS'; ----검색 조건

 

and 답이 나오나

왠만하면 where 절로 뽑으시오.

 

 

문제214.

월급이 3000 이상인 사원들의

이름과 월급과 직업과 부서명을

출력하시오

select E.ename, E.sal, E.job, D.dname

from emp E  join  dept D

                 on(E.deptno=D.deptno)

    where E.sal > 3000;

 

 

문제215.

이름, 월급, 등급(grade) 출력하는데

grade 3등급인 사원들만 출력하시오

 

select E.ename, E.sal, S.grade

from emp E join salgrade S

on(E.sal between S.losal and S.hisal)

where S.grade='3';

 

 

 

문제216.

이름, 월급, 부서위치, 급여등급(grade)

출력하시오

 

select E.ename, E.sal, D.loc, S.grade

from emp E      join  dept D

 

on(  E.deptno = D.deptno)

 

                           join salgrade S

 

on(E.sal between S.losal and S.hisal);

 

설명:

dept ---------- emp ----------salgrade

  연결시 위의 가운데 오는 값을

제일 먼저 줘야 한다.

 

 

 

 

조인문법의 종류 2가지(페이지 239)

1. 오라클 조인문법

         -EQUI JOIN (= inner join )

         -NO EQUI JOIN

         -OUTER JOIN

         -SELF JOIN

 

ANSI 문법

2. 1999 ANSI 문법

          -on 절을 사용한 조인 문법

         -left, right, full outer 조인 문법

         -using 절을 사용한 조인 문법

         -natural join

 

문제217.

아래의 오라클 조인 문법을

1999 ansi

문법으로 변경하시오

 

select E.ename,  D.loc

from emp E, dept D ------> 오라클 조인 문법

where E.deptno(+) = D.deptno;

 

 

select E.ename,  D.loc

from emp E right outer join dept D

on (E.deptno = D.deptno);  ---->1999 ANSI 문법

RIGHT OUTER JOIN은 왼쪽 테이블에

조인시킬 컬럼의 값이 없는 경우 사용한다.

 

 

 

문제218.

이름과 부서위치를 출력하는데

using 절을 사용한 조인으로 수행하시오

 

select E.ename, D.loc

from emp E  join  dept D

using (deptno);

 

***주의사항

USING 괄호안에

테이블 지칭 쓰면 에러남.

using(E.deptno)

 

*현업에서 거의 안씀.

 

 

 

 

문제219.

이름과 부서위치를 출력하는데

natural join 으로 수행하시오

 

select E.ename, D.loc

from emp E  natural join  dept D;

 

**on, where 안써도 중복값 알아서 제거.

**현업에서 거의 안씀

 

 

 

 

조인문법의 종류 2가지(페이지 239)

1. 오라클 조인문법

         -EQUI JOIN (= inner join )

         -NO EQUI JOIN

         -OUTER JOIN

         -SELF JOIN

 

2. 1999 ANSI 문법

          -on 절을 사용한 조인 문법

         -left, right, full outer 조인 문법

         -using 절을 사용한 조인 문법

         -natural join

         -cross join

 

 

문제220.

아래의 cross join 오라클 조인문법으로

수행해보시오

 

select E.ename, D.loc

from emp E       cross join          dept D;

 

 

 

 

화면 캡처: 2018-10-22 오후 2:51

 

연결고리(where~ = ) 넣어준 것과 같이

중복값 나옴.

select E.ename, D.loc

from emp E, dept D;

            | |

select E.ename, D.loc

from emp E       cross join          dept D;

 

                         

 

 

 

문제221.

부서위치, 부서위치별 토탈월급을 출력하는데

부서위치가 BOSTON 출력되게 하고

부서위치가 CHICAGO 제외하고 출력하고

토탈월급이 4000 이상인것만 출력하고

토탈월급이 높은것부터 출력하는데

null 뒤에 출력되게 하시오

 

select D.loc, sum(E.sal)토탈월급

from emp E , dept D

where E.deptno(+) = D.deptno

and

D.loc != 'CICHAGO'

group by rollup(D.loc)

having sum(E.sal) >= 4000

order by sum(E.sal) desc nulls last;

 

 

 

문제222.

부서위치, 부서위치별 인원수를 출력하는데

부서위치별 인원수가 3 이상인것만

출력하시오

 

select D.loc, count(*)

from emp E, dept D

where E.deptno = D.deptno

group by D.loc

having  count(*) >= 3;

 

 

 

문제223.

부서위치, 부서위치별 인원수를 출력하는데

아래와 같이 가로로 출력하시오

select

 count(decode(D.loc, 'NEW YORK', 1, null) ) as "NEW YORK",

 count(decode(D.loc, 'DALLAS', 1, null) ) as "DALLAS",

 count(decode(D.loc,'CHICAGO', 1, null)) as "CHICAGO",

 count(decode(D.loc, 'BOSTON',1,null)) as "BOSTON"

from emp E, dept D

where E.deptno = D.deptno;

 

**sum 으로 하면 null 해서

시카고, 보스톤은 null 나옴

 

 

 

문제224.

위의 결과를 아래와 같이 출력하시오

select E.job,

 count(decode(D.loc, 'NEW YORK', 1, null) ) as "NEW YORK",

 count(decode(D.loc, 'DALLAS', 1, null) ) as "DALLAS",

 count(decode(D.loc,'CHICAGO', 1, null)) as "CHICAGO",

 count(decode(D.loc, 'BOSTON',1,null)) as "BOSTON"

from emp E, dept D

where E.deptno = D.deptno

group by E.job;

 

 

 

문제225. 위의 결과에서 토탈값 넣어서 출력하시오

select nvl(E.job, '토탈값') as JOB,

 count(decode(D.loc, 'NEW YORK', 1, null) ) as "NEW YORK",

 count(decode(D.loc, 'DALLAS', 1, null) ) as "DALLAS",

 count(decode(D.loc,'CHICAGO', 1, null)) as "CHICAGO",

 count(decode(D.loc, 'BOSTON',1,null)) as "BOSTON"

from emp E, dept D

where E.deptno = D.deptno

group by rollup(E.job);

 

 

문제226.

아래의 통신사 테이블 생성하시오

create table telecom_price

 ( telecom_id      number(10),

   telecom_name    varchar2(20),

   month_price       number(10) ) ;

 

insert into telecom_price values (1, 'sk', 56000);

insert into telecom_price values (2, 'lg', 54000);

insert into telecom_price values (3, 'kt', 52000);

insert into telecom_price values (4, 'cj hello', 50000);

 

commit;

 

 

 

문제227.

이름, 나이, 통신사, 월정액(month_price)을 출력하시오

 

select E2.ename, E2.age, lower(E2.telecom), TP.month_price

from emp2 E2, telecom_price TP

where lower(E2.telecom) = TP.telecom_name;

 

 

 

7. subquery (227페이지)

SUBQUERY 활용

 

*subquery 배워야 하는 이유 ?

ALIAS 지정값 활용

필요 컬럼만 출력하고자 .

 

사원테이블에서 가장 많은 월급을 받는

사원의 이름과 월급을

출력하시오(rank 이용하지 말고)

 

오답

select * from

(
select ename, sal, max(sal)over() from emp

)

where sal?????

 

select ename, max(sal) from emp; --->수행안됨

그래서

subquery 배워야 한다.

 

 

 

문제228.

JONES 월급을 출력하시오

select sal

 from emp

 where ename= 'JONES';

 

 

 

문제229.

JONES 월급보다 많은 월급을 받는

사원들의

이름과 월급을 출력하시오

select ename, sal

from emp

where sal> 2975 ;

 

228, 229 두번 수행해서 알아낼 값을

서브쿼리로 한번에 !

 

select ename, sal

from emp

where sal > ( select sal from emp

                 where ename = 'JONES' );

 

**SAL > 이하 괄호들을 SUBQEURY 라고 한다.

 

실행순서: 서브쿼리 먼저.

 

 

문제230.

SCOTT 같은 월급을 받는 사원들의

이름과 월급을 출력하시오

(SCOTT 안나오게 해보시오)

 

select ename, sal

from emp

where sal = (select sal from emp

                  where ename = 'SCOTT')

and

 ename !=  'SCOTT';

 

 

 

 

문제231.

최대월급을 받는 사원의

이름과 월급을 구하시오

 

select ename, sal

from emp

where sal=(select max(sal) from emp);

 

 

 

문제232.

서울시 물가 데이터

가장 가격이 높은 생필품의

이름과 가격과 파는 매장을 출력하시오.

*내가 가지고 있는 테이블 리스트 확인

select table_name

from user_tables;

또는

select * from price;

 

 

select a_name, a_price, m_name

from price

where a_price=

(select max(a_price) from price);

 

 

 

문제233.

가정불화로 생기는 범죄중에

가장 많이 발생하는 범죄가 무엇인가

(select * from crime_cause2;)

 

쌤답

select crime_type from crime_cause2

where cnt=

(select max(cnt) from crime_cause2

where term='가정불화');

 

 

 

문제234.

병원에서 많이 발생하는 범죄유형이

무엇인지 출력하시오

( crime_loc2 사용)

 

select crime_type from crime_loc2

where cnt=

(select max(cnt) from crime_loc2

where c_loc = '병원');

 

 

 

문제235.

 

30 부서번호에서 가장 많은

월급을 받는 사원의 이름과

월급을 출력하시오

select ename, sal

from emp

where sal =

(select  max(sal) from emp

where deptno = 30)

and

deptno = 30

 

and 붙이고 안붙이고의 차이가 없는데

선생님말로는

다른부서 최대값도 나온다고

이해가 안됨.

소현설명:

서브쿼리 값이 만약 3천이면

결국 where sal=(3000) 이란 소리다.

그럼 다른부서의 sal 3000 출력된다는 얘기.

 

car_accident.csv 오라클 데이터베이스에

입력하시오

 

create table car_accident

( a_year   number(10),

  a_loc     varchar2(20),

  a_loc2   varchar2(100),

  a_cnt     number(10),

  a_type   varchar2(20) );

 

쌤꺼 오라클gate2010 깔아서

 car_accident 불러오기 성고옹

 

 

 

 

문제236.(오늘의 마지막 문제)

서울시에서 교통사고가 가장 많이

일어나는 지역이 어디인지

알아내시오

 

select A_loc2 from car_accident

where A_cnt=(

select max(A_cnt) from car_accident);

 

 

728x90
반응형

'sql' 카테고리의 다른 글

10. 집합연산자  (0) 2019.03.30
9. SUBQUERY  (0) 2019.03.30
7. DATA 분석함수(rank, dens_rank, listagg, ntile, lead, lag)  (0) 2019.03.30
6. 그룹함수  (0) 2019.03.30
5. NVL, DECODE, CASE  (0) 2019.03.30