Download presentation
Presentation is loading. Please wait.
Published byMarika Kaisa Hakala Modified 5년 전
1
8장. SELECT명령문 : FROM 절 FROM 절에서 테이블 명세 열 명세 다중 테이블 명세 가명 FROM절의 다양한 예제
반드시 가명을 사용해야 하는 경우 쉽게 배우는 MySQL 5.x
2
8.1 FROM 절에서 테이블 명세 -FROM 절은 사용하려는 테이블을 지정하기 위해서 사용
-테이블 참조는 가능하다면 가명이 따라오는 테이블 명세로 구성 -테이블 명세는 테이블 이름으로 구성, 뷰나 동의어를 지정 하여 사용 가능 -테이블 명세를 두 부분으로 구성 : 테이블 소유자의 이름.테이블의 이름 -사용자가 테이블의 소유자라면 소유자의 이름은 지정 불필요 [예제 8-1] “JJY”가 생성한 STUDENT 테이블의 전체 내용을 “KIM”이 보고자 할 때 적절한 SELECT 명령문을 완성하라(KIM은 STUDENT 테이블을 질의할 수 있는 권한이 있다고 가정한다). SELECT * FROM JJY.STUDENT; “JJY”이란 사용자가 STUDENT 테이블의 내용을 보고자 한다면 SELECT * FROM STUDENT; 쉽게 배우는 MySQL 5.x
3
8.2 열 명세 SELECT 명령문은 열의 이름 앞에 열이 포함되어 있는 테이블의 이름을 지정
8.2 열 명세 SELECT 명령문은 열의 이름 앞에 열이 포함되어 있는 테이블의 이름을 지정 <table specification> . <column specification> 앞부분은 STUDENT이나 ATTEND과 같은 테이블 이름을 사용하고 생략도 가능 뒷부분은 stu_no이나 stu_name과 같은 열의 이름으로 반듯이 기록 [예제 8-2] 각 학생의 학번을 나타내어라(두 가지 방법을 사용할 수 있다). SELECT STU_NO SELECT STUDENT.STU_NO FROM STUDENT; FROM STUDENT; 쉽게 배우는 MySQL 5.x
4
8.3 다중 테이블 명세 FROM 절에 두 개 이상의 테이블 명세 사용
8.3 다중 테이블 명세 FROM 절에 두 개 이상의 테이블 명세 사용 서로 다른 테이블로부터 데이터를 가져오려면 FROM 절에 여러 테이블 지정 [예제 8-3] 각 학생의 학번과 이름, 수강년도, 학기, 수강과목코드, 교수코드를 나타내어라. mysql> 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 절을 실행한 후 중간 결과 ․․․․․ | stu_no | stu_name | att_year | att_term |․․․․․| sub_code | prof_code | | | 박정인 | 2006 | 1 |․․․․․| 4001 | 4002 | | | 박정인 | 2006 | 1 |․․․․․| 4002 | 4003 | | | 박정인 | 2006 | 1 |․․․․․| 4003 | 4004 | | | 박정인 | 2006 | 1 |․․․․․| 4004 | 4001 | | | 박정인 | 2006 | 1 |․․․․․| 4005 | 4007 | | | 박정인 | 2006 | 1 |․․․․․| 4006 | 4008 | | | 박정인 | 2006 | 2 |․․․․․| 4007 | 4009 | ․․․․․․․․․․․․․․․․․․․․․․․․․․․․․․․․․․․․․ 270 rows in set (0.08 sec) 쉽게 배우는 MySQL 5.x
5
FROM절의 중간 결과 테이블의 내용 : 카티션 프로덕트(Cartesian product)
FROM 절의 중간 결과 행의 수 : A 테이블의 행수 * B 테이블의 행 수 FROM 절의 중간 결과 열의 수 : A 테이블의 열수 + B 테이블의 열 수 예 : STUDENT 테이블의 행수가 15행이고, 열의 수가 13열 ATTEND 테이블의 행수가 18 이고, 열의 수가 11열 FROM 절의 중간 결과의 행수와 열수 행 수 : 15 * 18 = 270 행 열 수 : = 24 열 WHERE절의 중간 결과 student.stu_no = attend.stu_no (“테이블 명세.열의 명세” 형식 사용) 학생신상 테이블 학번과 수강 테이블의 학번이 같은 경우는 18행만 해당 쉽게 배우는 MySQL 5.x
6
SELECT절의 최종 결과 (6개 열 값만 출력)
| stu_no | stu_name | att_year | att_term | sub_code | prof_code | | | 박정인 | 2006 | 1 | 4001 | 4002 | | | 박정인 | 2006 | 1 | 4002 | 4003 | | | 박정인 | 2006 | 1 | 4003 | 4004 | | | 박정인 | 2006 | 1 | 4004 | 4001 | | | 박정인 | 2006 | 1 | 4005 | 4007 | | | 박정인 | 2006 | 1 | 4006 | 4008 | | | 박정인 | 2006 | 2 | 4007 | 4009 | | | 박정인 | 2006 | 2 | 4008 | 4005 | | | 박정인 | 2006 | 2 | 4009 | 4006 | | | 박정인 | 2006 | 2 | 4010 | 4001 | | | 박정인 | 2006 | 2 | 4011 | 4002 | | | 박정인 | 2006 | 2 | 4012 | 4003 | | | 유하나 | 2007 | 1 | 4001 | 4002 | | | 유하나 | 2007 | 1 | 4002 | 4003 | | | 유하나 | 2007 | 1 | 4003 | 4004 | | | 유하나 | 2007 | 1 | 4004 | 4001 | | | 유하나 | 2007 | 1 | 4005 | 4007 | | | 유하나 | 2007 | 1 | 4006 | 4008 | 18 rows in set (0.00 sec) 쉽게 배우는 MySQL 5.x
7
[예제8-4] 학생들의 학번, 이름, 수강신청구분을 나타내어라. 단, 수강신청구분은 ATTEND 테이블에 있다.
mysql> select s.stu_no, stu_name, att_div -> from student s, attend a -> where s.stu_no = a.stu_no; | stu_no | stu_name | att_div | | | 박정인 | Y | | | 유하나 | Y | 18 rows in set (0.00 sec) 쉽게 배우는 MySQL 5.x
8
8.4 가명(Alias) -FROM 절에 여러 개의 테이블이 사용되는 경우에 가명 사용하면 편리
[예제8-5] 학생들의 학번, 이름, 수강신청구분을 나타내어라. 단, 학적 테이블의 가명을 S, 수강테이블의 가명은 A로 정의한다. mysql> select s.stu_no, stu_name, att_div -> from student s, attend a -> where s.stu_no = a.stu_no; -가명 S와 A는 FROM절이 먼저 처리되기 때문에 SELECT 절에서 사용되고 있지만 아무런 문제는 없다. -테이블 이름의 크기를 줄여서 SELECT 절을 좀 더 편리하고 쉽게 사용 -가명은 256문자까지 가능하며 영문자, 숫자, 밑줄 문자를 사용 -첫 번째 문자는 반드시 영문자로 시작 -동일한 가명을 1개의 문장에 사용할 수 없다. 쉽게 배우는 MySQL 5.x
9
8.5 FROM절의 다양한 예제 [예제 8-6] 수강테이블의 학번과 이름, 과목코드, 교수코드, 교수명을 출력하라.
mysql> select s.stu_no, stu_name, sub_code, p.prof_code, prof_name -> from student s, attend a, professor p -> where s.stu_no = a.stu_no and -> a.prof_code = p.prof_code; | stu_no | stu_name | sub_code | prof_code | prof_name | | | 박정인 | 4004 | 4001 | 정진용 | | | 박정인 | 4010 | 4001 | 정진용 | | | 유하나 | 4004 | 4001 | 정진용 | | | 박정인 | 4001 | 4002 | 나인섭 | | | 박정인 | 4011 | 4002 | 나인섭 | | | 유하나 | 4001 | 4002 | 나인섭 | | | 박정인 | 4002 | 4003 | 정창부 | | | 박정인 | 4012 | 4003 | 정창부 | | | 유하나 | 4002 | 4003 | 정창부 | | | 박정인 | 4003 | 4004 | 박상철 | | | 유하나 | 4003 | 4004 | 박상철 | | | 박정인 | 4008 | 4005 | 정병열 | | | 박정인 | 4009 | 4006 | 고진광 | | | 박정인 | 4005 | 4007 | 김영식 | | | 유하나 | 4005 | 4007 | 김영식 | | | 박정인 | 4006 | 4008 | 최우진 | | | 유하나 | 4006 | 4008 | 최우진 | | | 박정인 | 4007 | 4009 | 문창수 | 18 rows in set (0.16 sec) 쉽게 배우는 MySQL 5.x
10
[예제 8-7] 학적테이블의 학번과 이름, 수강테이블의 수강년도, 학기, 수강교과목코드, 교과목테이블의 교과목명을 나타내어라.
mysql> select s.stu_no, stu_name, att_year, att_term, a.sub_code, sub_name -> from student s, attend a, subject su -> where s.stu_no = a.stu_no and -> a.sub_code = su.sub_code; | stu_no | stu_name | att_year | att_term | sub_code | sub_name | | | 박정인 | 2006 | 1 | 4001 | 데이터베이스 응용 | | | 박정인 | 2006 | 1 | 4002 | 웹사이트 구축 | | | 박정인 | 2006 | 1 | 4003 | 소프트웨어공학 | | | 박정인 | 2006 | 1 | 4004 | 웹프로그래밍 | | | 박정인 | 2006 | 1 | 4005 | 컴퓨터구조 | | | 박정인 | 2006 | 1 | 4006 | 정보처리실무 | | | 박정인 | 2006 | 2 | 4007 | UML | | | 박정인 | 2006 | 2 | 4008 | 운영체제 | | | 박정인 | 2006 | 2 | 4009 | 전자상거래 실무 | | | 박정인 | 2006 | 2 | 4010 | 윈도우즈 프로그래밍 | | | 박정인 | 2006 | 2 | 4011 | 자바프로그래밍 | | | 박정인 | 2006 | 2 | 4012 | 네트워크 프로그래밍 | | | 유하나 | 2007 | 1 | 4001 | 데이터베이스 응용 | | | 유하나 | 2007 | 1 | 4002 | 웹사이트 구축 | | | 유하나 | 2007 | 1 | 4003 | 소프트웨어공학 | | | 유하나 | 2007 | 1 | 4004 | 웹프로그래밍 | | | 유하나 | 2007 | 1 | 4005 | 컴퓨터구조 | | | 유하나 | 2007 | 1 | 4006 | 정보처리실무 | 18 rows in set (0.20 sec) 쉽게 배우는 MySQL 5.x
11
[예제 8-8] 학적테이블의 학번과 이름, 보관성적테이블의 성적 취득년도, 학기, 신청학점, 취득학점, 평점평균을 나타내어라.
mysql> select s.stu_no, stu_name, sco_year, sco_term, -> req_point, take_point, exam_avg -> from student s, score sc -> where s.stu_no = sc.stu_no; | stu_no | stu_name | sco_year | sco_term | req_point | take_point | exam_avg | | | 박정인 | 2006 | 1 | 18 | 18 | 4.5 | | | 박정인 | 2006 | 2 | 18 | 18 | 4.0 | | | 박정인 | 2007 | 2 | 18 | 0 | 0.0 | | | 유하나 | 2007 | 1 | 18 | 18 | 4.4 | | | 김문영 | 2007 | 1 | 18 | 18 | 4.4 | | | 최차영 | 2007 | 1 | 18 | 18 | 4.2 | 6 rows in set (0.02 sec) 쉽게 배우는 MySQL 5.x
12
[예제 8-9] 학적테이블의 학번과 이름, 수강테이블의 수강신청년도, 학기, 수강신청유무를 나타내어라.
mysql> select s.stu_no, stu_name, att_year, att_term, att_div -> from student s, attend a -> where s.stu_no = a.stu_no; | stu_no | stu_name | att_year | att_term | att_div | | | 박정인 | 2006 | 1 | Y | | | 박정인 | 2006 | 2 | Y | | | 유하나 | 2007 | 1 | Y | 18 rows in set (0.00 sec) 쉽게 배우는 MySQL 5.x
13
중복된 데이터가 존재하므로 SELECT 절에 DISTINCT를 사용 중복 제게
[예제 8-10] 학적테이블의 학번과 이름, 수강테이블의 수강신청년도, 학기, 수강신청유무를 나타내어라.(단, 중복은 배제한다.) mysql> select distinct s.stu_no, stu_name, att_year, att_term, att_div -> from student s, attend a -> where s.stu_no = a.stu_no; | stu_no | stu_name | att_year | att_term | att_div | | | 박정인 | 2006 | 1 | Y | | | 박정인 | 2006 | 2 | Y | | | 유하나 | 2007 | 1 | Y | 3 rows in set (0.02 sec) 최종 결과를 보면 중복된 데이터가 제거되어 18개 행에서 3개 행으로 줄어든 것을 확인 쉽게 배우는 MySQL 5.x
14
[예제8-11]적어도 한번 이상 장학금을 받은 학생의 이름을 나타내어라.
mysql> select distinct s.stu_no, stu_name -> from student s, fee f -> where s.stu_no = f.stu_no and -> not jang_code is null; | stu_no | stu_name | | | 박도준 | | | 박정인 | | | 장수인 | | | 홍길동 | | | 이순신 | | | 유하나 | | | 김문영 | | | 최차영 | 8 rows in set (0.00 sec) 조건 절에서 NOT JANG_CODE IS NULL의 “NOT IS NULL”은 “NULL값을 같지 않는다” 라고 해석한다. 쉽게 배우는 MySQL 5.x
15
[예제8-12] 등록한 학생의 이름, 등록년도, 학기, 장학코드, 장학금총액, 등록구분을 나타내어라.
mysql> select stu_name, fee_year, fee_term, jang_code, jang_total, fee_div -> from student s, fee f -> where s.stu_no = f.stu_no -> and f.fee_div = 'Y'; | stu_name | fee_year | fee_term | jang_code | jang_total | fee_div | | 박도준 | 2000 | 1 | 2 | | Y | | 박도준 | 2000 | 2 | 10 | | Y | | 박도준 | 2001 | 1 | 10 | | Y | | 박도준 | 2001 | 2 | 10 | | Y | | 박도준 | 2006 | 1 | 10 | | Y | | 박도준 | 2006 | 2 | 10 | | Y | | 박도준 | 2007 | 1 | 11 | | Y | | 박도준 | 2007 | 2 | 10 | | Y | | 박정인 | 2006 | 1 | 1 | | Y | | 박정인 | 2006 | 2 | 10 | | Y | | 박정인 | 2007 | 1 | 11 | | Y | | 박정인 | 2007 | 2 | 21 | | Y | | 장수인 | 2007 | 1 | 1 | | Y | | 장수인 | 2007 | 2 | NULL | NULL | Y | | 홍길동 | 2007 | 1 | 1 | | Y | | 홍길동 | 2007 | 2 | NULL | NULL | Y | | 이순신 | 2007 | 1 | 1 | | Y | | 이순신 | 2007 | 2 | NULL | NULL | Y | | 유하나 | 2007 | 1 | 1 | | Y | | 유하나 | 2007 | 2 | 11 | | Y | | 김문영 | 2007 | 1 | 1 | | Y | | 김문영 | 2007 | 2 | NULL | NULL | Y | | 최차영 | 2007 | 1 | 1 | | Y | | 최차영 | 2007 | 2 | 10 | | Y | 24 rows in set (0.00 sec) 쉽게 배우는 MySQL 5.x
16
FROM 절에서 테이블 명세가 사용되는 순서는 무관 ① SELECT S.STU_NO FROM STUDENT S, FEE F
WHERE S.STU_NO = F.STU_NO ② SELECT S.STU_NO FROM FEE F, STUDENT S WHERE F.STU_NO = S.STU_NO ①번과 ②번은 FROM 절에서 테이블의 순서가 서로 바뀌었으나 결과 값은 동일 SELECT 절은 열이 출력되는 순서를 정의 ORDER BY 절은 행의 순서를 정의 쉽게 배우는 MySQL 5.x
17
[예제 8-13] 2007년에 등록한 학생의 학번과 이름을 나타내어라.
mysql> select distinct s.stu_no, s.stu_name -> from student s, fee f -> where s.stu_no = f.stu_no -> and fee_year = 2007; | stu_no | stu_name | | | 박도준 | | | 박정인 | | | 장수인 | | | 홍길동 | | | 이순신 | | | 유하나 | | | 김문영 | | | 최차영 | 8 rows in set (0.02 sec) 쉽게 배우는 MySQL 5.x
18
8.6 반드시 가명을 사용해야 하는 경우 -FROM 절에서 동일한 테이블 이름이 한 번 이상 사용될 때 반드시 가명 사용
8.6 반드시 가명을 사용해야 하는 경우 -FROM 절에서 동일한 테이블 이름이 한 번 이상 사용될 때 반드시 가명 사용 [예제 8-14] 박정인 학생보다 나이가 더 많은 학생의 이름과 생년을 나타내어라. mysql> select s.stu_name, s.birth_year -> from student s, student st -> where st.stu_name = '박정인' -> and s.birth_year < st.birth_year; | stu_name | birth_year | | 김유신 | 1981 | | 박도준 | 1978 | | 이상길 | 1975 | | 연개소문 | 1981 | 4 rows in set (0.00 sec) 박정인의 출생연도(1983년)를 미리 알고 있다면 가명을 사용하지 않아도 됨 쉽게 배우는 MySQL 5.x
Similar presentations