102p의 예제 2번) <학생>테이블과 <학과>테이블에서 학과코드 값이 같은 튜플을 JOIN하여 학번, 이름, 학과코드, 학과명을 출력하는 SQL문을 작성하시오.
이때, 학과코드가 입력 안 된 학생이나 학생이 없는 학과코드도 모두 출력하시오.
SELECT 학번, 이름, 학과.학과코드, 학과명 -> 찾을 튜플의 속성
FROM 학생 FULL OUTER JOIN 학과 -> <학과>(<학생>)테이블에 없는 <학생>(<학과>)테이블의 튜플에 NULL 값을 붙여서 JOIN에 추가
ON 학생.학과코드 = 학과.학과코드; -> <학생>테이블의 학과코드와 <학과>테이블의 학과코드가 같을 경우 튜플을 결합하여 하나의 릴레이션 생성.
=> 코딩 해석이 맞는지 궁금해요
128-129P
문제 8번) <학과>테이블에 존재하지 않는 <학교>테이블의 '학교명'과 '지역'을 검색하는 SQL문을 작성하시오.
SELECT 학교.학교명, 지역 -> 찾을 튜플의 속성
FROM 학교 LEFT OUTER JOIN 학과 -> <학과>테이블에 없는 <학교>테이블의 튜플에 NULL값을 븉여서 JOIN에 추가
ON 학교.학교명 = 학과.학교명 -> <학교>테이블과 <학과>테이블의 학교명이 같은 경우 튜플을 결합하여 하나의 릴레이션 생성
WHERE 학교명 IS NULL; -> 학교명이 NULL일 경우, 즉 2번째 줄에 의해 학교명이 NULL인 결과 출력.
=> 해석 이게 맞나요?
=> 102P에서의 예제 2번과 큰 차이가 없는데 결과가 너무 달라요.
=> 즉 WHERE 학교명 IS NULL에 의해 INNER JOIN된 결과는 생략되는건가요?
=> 그리고 해설에는 IS NULL이 아닌 Is Null;로 되어있는데 대문자 소문자 구분 안해도 되나요?
+ 문제 8번의 경우
SELECT 학교.학교명, 지역
FROM 학교
WHERE 학교명 NOT IN(SELECT 학교명 FROM 학과);
로 해도 동일한 결과가 출력되나요?
+ OUTER JOIN의 표기 형식에서 이 두가지 형식 중 하나를 사용하라는 거 맞죠?(즉 1)과 2)의 결과는 같기 때문에 하나만 사용(선택)하라는 것인지)
1) SELECT
FROM
ON
2) SELECT
FROM
WHERE
+ 126P 문제 5) 자격증이 없는 사원의 '이름', '재직년도', '기본급'을 검색하는 SQL문을 작성하시오.
-> 만약 하위 질의를 사용하라는 내용이 없다면, 하위 질문과 OUTER JOIN을 언제 써야 하는지 구분을 어떻게 해야되나요 ㅠㅠ 문제 5번과 문제 8번의 내용이 비슷한데 코딩이 완전 달라서요..
안녕하세요 길벗수험서 운영팀입니다.
[102페이지 예제 2번]
select 에서 필드를 선택하는 것은 from on을 통해 도출된 가상의 테이블에서 해당 필드만을 불러오는 것입니다.
from on만 제대로 해석하면 문제될 것은 없죠.
해설은 크게 틀린 것은 없습니다. 다만 튜플들을 결합하여 하나의 릴레이션이 된다는 해설은 앞의 from ~full outer join과 함께 붙여서 풀어야 맞는 얘기가 될 것 같습니다. (튜플이 결합하면 튜플이 되겠죠)
추가로 full outer join이므로 어느 테이블에 없는 어떤 테이블이라고 칭하기 보다는 둘 모두를 결합한다는 의미의 해설이 더 적합한 것 같습니다.
즉, 학생 테이블과 학과 테이블을 결합하되 학생의 학과코드와 학과의 학과코드가 동일한 튜플은 결합하고, 결합되지 않는 튜플들은 데이터가 없는 필드에 null을 붙여 결한다. 정도가 되겠네요.
[128페이지 문제 8번]
해당 SQL문의 해설은 교재의 정답페이지(476p)에 있는 것을 확인해보시기 바랍니다.
~테이블에 없는 ~테이블의 튜플이라는 설명이 해석하기에 조금 어려운 해설입니다. on 개념 없이 단순히 설명하려다가 나온 해설 같은데, 이 경우 on과 같이 해설을 다는 것이 편합니다.
=> 102P에서의 예제 2번과 큰 차이가 없는데 결과가 너무 달라요.
당연합니다. where구문이 추가되었으니까요.
=> 즉 WHERE 학교명 IS NULL에 의해 INNER JOIN된 결과는 생략되는건가요?
예, 맞습니다. outer join한 결과에서 null만을 출력한다는 것은 inner join 결과를 생략하고 출력하겠다는 의미죠.
=> 그리고 해설에는 IS NULL이 아닌 Is Null;로 되어있는데 대문자 소문자 구분 안해도 되나요?
예, SQL에서 모든 예약어는 대소문자를 가리지 않습니다.
필드명은 대소문자를 구분하니 주의하세요.
+ 추가로 작성해주신 SQL문은 정답과 동일한 결과를 출력합니다.
참고로 '학교.학교명'에서 '학교.'는 빼셔도 됩니다. in (select~ 에서 호출되는 테이블과 중복되지 않으므로 테이블 구분은 필요하지 않습니다.
+ join 구문을 사용하는 것과 where 조건에 (+)를 사용하는 join은 차이가 없습니다.
어떤 것을 사용해도 무관합니다.
+ 특정 질의를 사용하라는 문구가 없다면 어떤 SQL문을 사용하더라도 결과만 정답과 동일하게 나온다면 정답입니다. 사용하기 편한 SQL문을 이용하세요.
행복한 하루되세요 :)
-
관리자2019-03-19 14:26:47
안녕하세요 길벗수험서 운영팀입니다.
[102페이지 예제 2번]
select 에서 필드를 선택하는 것은 from on을 통해 도출된 가상의 테이블에서 해당 필드만을 불러오는 것입니다.
from on만 제대로 해석하면 문제될 것은 없죠.
해설은 크게 틀린 것은 없습니다. 다만 튜플들을 결합하여 하나의 릴레이션이 된다는 해설은 앞의 from ~full outer join과 함께 붙여서 풀어야 맞는 얘기가 될 것 같습니다. (튜플이 결합하면 튜플이 되겠죠)
추가로 full outer join이므로 어느 테이블에 없는 어떤 테이블이라고 칭하기 보다는 둘 모두를 결합한다는 의미의 해설이 더 적합한 것 같습니다.
즉, 학생 테이블과 학과 테이블을 결합하되 학생의 학과코드와 학과의 학과코드가 동일한 튜플은 결합하고, 결합되지 않는 튜플들은 데이터가 없는 필드에 null을 붙여 결한다. 정도가 되겠네요.
[128페이지 문제 8번]
해당 SQL문의 해설은 교재의 정답페이지(476p)에 있는 것을 확인해보시기 바랍니다.
~테이블에 없는 ~테이블의 튜플이라는 설명이 해석하기에 조금 어려운 해설입니다. on 개념 없이 단순히 설명하려다가 나온 해설 같은데, 이 경우 on과 같이 해설을 다는 것이 편합니다.
=> 102P에서의 예제 2번과 큰 차이가 없는데 결과가 너무 달라요.
당연합니다. where구문이 추가되었으니까요.
=> 즉 WHERE 학교명 IS NULL에 의해 INNER JOIN된 결과는 생략되는건가요?
예, 맞습니다. outer join한 결과에서 null만을 출력한다는 것은 inner join 결과를 생략하고 출력하겠다는 의미죠.
=> 그리고 해설에는 IS NULL이 아닌 Is Null;로 되어있는데 대문자 소문자 구분 안해도 되나요?
예, SQL에서 모든 예약어는 대소문자를 가리지 않습니다.
필드명은 대소문자를 구분하니 주의하세요.
+ 추가로 작성해주신 SQL문은 정답과 동일한 결과를 출력합니다.
참고로 '학교.학교명'에서 '학교.'는 빼셔도 됩니다. in (select~ 에서 호출되는 테이블과 중복되지 않으므로 테이블 구분은 필요하지 않습니다.
+ join 구문을 사용하는 것과 where 조건에 (+)를 사용하는 join은 차이가 없습니다.
어떤 것을 사용해도 무관합니다.
+ 특정 질의를 사용하라는 문구가 없다면 어떤 SQL문을 사용하더라도 결과만 정답과 동일하게 나온다면 정답입니다. 사용하기 편한 SQL문을 이용하세요.
행복한 하루되세요 :)