본문 바로가기
데이터 베이스/mysql 문제

7 from 절에서 테이블 명세

by 인생여희 2017. 11. 13.
반응형

from 절에서 테이블 명세

mysql은 테이블 명세를 두 부분으로 구성한다.

테이블 소유자의 이름 다음에는 테이블의 이름만 오게 된다.

즉, from절에서 다른 사람이 생성한 테이블을 참소 할 수 있다는 것을 의미하며, 이때 테이블 이름 앞에 소유자의 이름을 지정해야 한다.

하지만 사용자가 테이블의 소유자라면 소유자의 이름은 지정할 필요가 없다.

JJY가 생성한 STUDENT 테이블의 전체 내용을 KIM 이 보고자 할 때 적절한 SELECT 문을 완성하여라

SELECT * FROM JJY.STUDENT (소유자의 이름과 테이블 사이에는 마침표로 구분되어 있음)

JJY.STUDENT는 테이블 명세이다.

소유자를 지정하는 것은 가끔 테이블 이름의 자격으로써 참조 된다.

따라서 위의 예제에서 테이블 이름 STUDENT는 소유자의 이름은 JJY의 자격을 갖게 된다.

만약 JJY라는 사용자가 STUDENT 테이블의 내용을 보고자 한다면 위의 명령문을 사용할 수도 있지만 다음과 같이 소유자의 이름을 사용하지 않을 수도 있다.

SELECT * FROM STUDENT

-열 명세

SELECT 명령문에서 열의 이름 앞에 열이 포함되어 있는 테이블의 이름을 지정 할 수 있다.

이러한 것을 열의 자격이라 한다.

 학생의 학번을 나타내어라

SELECT STU_NO FROM STUDENT;

SELECT STUDENT.STU_NO FROM STUDENT;

다중중테이블 명세

ATTEND 테이블은 각 학생의 수강년도, 학기, 수강과목코드, 교수코드에 관한 정보는 가지고 있지만 이름에 대한 정보는 가지고 있지 않기 때문에 학생 신상 테이블인 STUDENT 테이블에서 가져와야 한다.

그러므로 2개의 테이블이 모두 필요하다.

따라서 FROM 절에 두 테이블 모두 지정해야 한다.

각 학생의 학번과 이름, 수강년도, 학기, 수강과목 코드, 교수 코드를 나타내어라

"SELECT student.stu_no, stu_name, att_year, att_term, sub_code, prof_code

FROM student, attend 

WHERE student.stu_no = attend.stu_no;

"

여기서 from 절까지만 실행했을 때 중간결과는 270개의 행이 나온다.

중간 결과 테이블에 있는 전체 열은 한 테이블의 전체 열과 다른 테이블의 전체열을 더한 것이며, 전체 행의 수는 한 테이블의 행의 수와 다른 테이블에 있는 행의 수를 곱한 것과 같다.

이와 같은 결과를 관련된 테이블의 카티션 프로덕트라고 한다.

from 절의 중간 결과 행의수 : a테이블의 행수 * b 테이블의 행수

from 절의 중간 결과 열의수: a테이블의 열수 + b 테이블의 열수

예를 들면 student 테이블의 행수가 15행이고, 열의 수가 13열, attend 테이블의 행수가 18이고, 열의 수가 11열 이면 행수는 270, 열 수는 24열이 된다.

앞의 예제 where 절에서 보는 것 처럼 stu_no 열 앞에 테이블 이름을 식별하는 것이 필요하다.

그렇치 않으면 SQL이 stu_no 열을 사용하는데 있어서 어떤 테이블의 stu_no를 사용할 것인지 명확히 알지 못한다.

결론적으로, from 절에서 두 개 이상의 테이블이 지정될 때, 각 테이블에서 사용하고 있는 열의 이름이 같은 이름으로 중복되어 사용되는 경우에는 테이블 명세.열의 명세 의 형식으로 사용해야 한다.

학생들의 학번, 이름, 수강신청구분을 나타내어라. 단. 수강신청구분은 attend 테이블에 있다.

"select student.stu_no, student.stu_name, attend.att_div from 

student, attend 

where student.stu_no = attend.stu_no"

가명

from 절에 여러개의 테이블 명세가 사용되는 경우에 가명을 사용하는 것이 더 편리할 때가 있다.

가명은 테이블의 임시 대체 이름이다.

앞의 예제에서 열에 접근권한을 줄 때 전체 테이블의 이름을 지정해야만 한다.

이 때 테이블의 이름을 사용하는 대신에 가명을 사용할 수가 있는데, 가명은 from 절에서 선언한다.

학생들의 학번, 이름, 수강신청구분을 나타내어라. 단, 학적 테이블의 가명을 S, 수강 테이블의 가명은 A로 정의한다.


from 절의 다양한 예제

수강테이블의 학번과 이름, 수강과목코드, 교수코드, 교수명을 나타내어라

"select s.stu_no, s.stu_name, a.sub_code, p.prof_name from 

student s, attend a, professor p 

where s.stu_no = a.stu_no 

and a.prof_code = p.prof_code

"

학적테이블의 학번과 이름, 수강테이블의 수강과목코드, 교과목테이블의 교과목명을 나타내어라

select s.stu_no, s.stu_name, a.sub_code, sb.sub_name

from student s, attend a, subject sb 

where s.stu_no = a.stu_no 

and a.sub_code = sb.sub_code;

학적테이블의 학번과 이름, 보관성적테이블의 성적 취득년도, 학기, 신청학점, 취득학점, 평점평균을 나타내어라.

"select s.stu_no, s.stu_name, a.sub_code, sb.sub_name

from student s, attend a, subject sb 

where s.stu_no = a.stu_no 

and a.sub_code = sb.sub_code;


학적테이블의 학번과 이름, 수강테이블의 수강신청년도, 학기, 수강신청유무를 나타내어라

select S.stu_no, S.stu_name, A.att_div from 

student S, attend A 

where S.stu_no = A.stu_no

최종 결과를 보면 중복된 데이터가 많이 존재한다는 것을 확인 할 수 있다.

그러면 중복된 값을 자동으로 제거할 수 있는 명령어가 select 다음에 바로 distinct 라는 단어를 사용해야 한다.

학적테이블의 학번과 이름, 수강테이블의 수강신청년도, 학기, 수강신청유무를 나타내어라 (중복은 배재한다.)

"select distinct S.stu_no, S.stu_name,A.att_div from 

student S, attend A 

where S.stu_no = A.stu_no

;"

적어도 한번 이상 장학금을 받은 학생의 이름을 구하라

"select  s.stu_name

from student s, fee f

where s.stu_no = f.stu_no

and f.jang_total is not null;"

"select distinct s.stu_name

from student s, fee f

where s.stu_no = f.stu_no

and f.jang_total is not null;"

등록한 학생의 이름, 등록년도, 학기, 장학코드, 장학금총액, 등록구분을 나타내어라

"select s.stu_name, f.fee_year, f.jang_code, f.jang_total, f.fee_div

from student s, fee f 

where s.stu_no = f.stu_no

and f.fee_div = 'Y'"

2007년에 등록한 학생의 학번과 이름을 나타내어라

"select distinct s.stu_no, s.stu_name

from student s, fee f 

where s.stu_no = f.stu_no

and f.fee_year = '2007';"

반드시 가명을 사용해야 하는 경우

반드시 가명을 사용해야 하는 경우가 있다.

이러한 상황은 from 절에서 동일한 테이블 이름이 한번 이상 사용될 때 발생한다.

예)

박정인 학생보다 나이가 더 많은 학생의 이름과 생년을 나타내어라.

"select s.stu_name, s.birth_year

from student s, student st 

where st.stu_name = '박정인'

and s.birth_year < st.birth_year;

"

열을 유일하게 식별하기 위해서 열의 이름 앞에 테이블 이름을 지정했다.

다시말하면 from 절에 동일한 이름을 가지는 두개의 테이블을 참조하면 반드시 가명이 사용되어야 한다.

만약 박정인의 출생년도를 미리 알고 있다면 가명을 사용하지 않아도 되지만 이를 알 수 없기 때문에 가명을 사용한다

만약 select 절에 s.birth_year 대신에 st.birth_year를 사용하면 결과는 어떻게 될가?

김유신, 박도준, 이상길, 연개소문 이름이 전부 박정인으로 출력되고, 출생년도가 박정인의 출생년도인 1983으로 출력되 ㄹ것이다.

그래서 select 절의 가명을 올바르게 기입해 주어야 한다.

반응형

'데이터 베이스 > mysql 문제' 카테고리의 다른 글

9 mysql 서브쿼리 부속질의  (0) 2017.11.14
8 where 절  (0) 2017.11.14
6 select 절  (0) 2017.11.13
5 mysql 함수 & 문제  (0) 2017.11.10
4 mysql 테이블 생성  (0) 2017.11.09

댓글