서브쿼리에 대한 질문 하나 올릴게요 0 5 1,017

by 나구니 [2010.03.02 12:18:52]



아래를 보시면 emp 테이블에서 JONS 이란 이름을 가진 사원과 업무가 같거나,
FORD란 이름을 가진 사원보다 급여가 같거나 많이 받는 사원들의 이름,업무,
부서번호,급여를 출력 하라는 쿼리 인데요..제가 궁금한 것은 데이타 값은 대.소
문자를 구분하므로, lower(JONS)라고 하면 소문자로 변화되어 찾게 될텐데
아시다시피 emp테이블의 모든 값은 대문자로 되어있지 않습니까? 그런데 왜 아
래와 같이 검색되어 지는 걸까요...??

SELECT ename,job,deptno,sal
FROM emp
WHERE job = (select job from emp where ename = 'lower(JONS)')
OR sal > = ( select sal from emp where ename='FORD') order by sal desc
/



* 결과 값
ENAME   JOB    DEPTNO     SAL
---------- --------- ---------- ----------
KING    PRESIDENT 10    5000
FORD    ANALYST    20    3000
SCOTT   ANALYST    20    3000


그리고 더불어 반환받을 값이 하나가 아닌 위와 같이 여러개일 때는 ' = ' 으로 할 수 없고,
IN 으로 해야 한다고 하던데 왜 또 멀쩡히 값이 나오는 걸까요..?? 제가 잘 이해를 못해서;;
친절한 설명 부탁드립니다 ~.
by 도가니 [2010.03.02 12:58:35]
먼저 소문자 대문자 당연히 구분을 합니다, 검색되어진 데이터는 아랫줄 'FORD'란 이름을 가진 사원보다 급여가 같거나 많은 사원만 나온 데이터 입니다, 그리고 lower('JONS') 이렇게 쓰셔야 합니다, 그리고 'IN'을 쓰실려면 이런씩으로 =>where job in (select job from emp where ename in ('JONES','FORD') 이해가 가실련지,,

by 나구니 [2010.03.02 13:08:23]
아아..그러니까 select job from emp where ename = 'lower(JONS)'는 검색되지 않은거군요!! 아 빠르고 친절한 설명 감사드립니다. 모르고 있던걸 3가지나 알게 해주셨네요 ^^* 근데 lower('JONS') 이렇게 안적고 저처럼 적어도 오류가 안 나는 이유는 무엇일까요?그냥 권장 사항인가요??

by 도가니 [2010.03.02 13:16:27]
사원 이름이 'JONS'가 아닌 'lower(JONS)' 로(함수로 보지않고) 찾게되서 에러는 나지 않은겁니다 ^^

by 마농 [2010.03.02 13:19:34]
메인 쿼리의 결과가 여러건이라고 In을 쓰는것이 아닙니다.
서브 쿼리의 결과가 여러건일때 In을 써야 하는거죠.
위 서브쿼리의 결과가 1건 또는 0건이기 때문에 = 을 써도 에러가 안난 것입니다.
그리고 'lower(JONS)' 가 에러가 안난 이유는 따옴표 안의 문자는 뭐가 와도 상관 없습니다.
그냥 문자열일 뿐입니다. 명령어가 아니기 때문에 에러날 이유가 없죠.

by 나구니 [2010.03.02 13:41:00]
쿼리문 하나에 이토록 많은 원리가 숨어 있다니..정리 좀해야겠어요~ 두분다 답변 감사드려요 많은 도움이 되었답니다. 복 받으세요~
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입