티스토리 뷰
이것에 대하여 안나오는 이유는 무엇일까 ??
식 -> true
false
unknown sql의 식은 이 3가지를 통하여 판별 할 수 있다.
즉, null 에 관한 값은 unknown으로 처리 된다.
하지만 null값으로 찾을 수 는 없을까??
select * from student where dept is null;
is를 사용해주면 null값을 넣고 사용할 수 있다.
--수강인원이 3명 이상인 것을 보여 달라
select cno,count(*) as 수강인원,avg(finterm) as 기말고사평균 from enrol where snam >= 3 group by cno;
이런식으로 했다고 한다면 앞줄에 snam이 where 절에 걸리는데 동시에 작업을 할 수 는 없다.
grouping 을 한 다음에 사용할 수 있는 조건절은 Having 이다.
select cno,count(*) as 수강인원,avg(finterm) as 기말고사평균 from enrol group by cno having count(*) >= 3;
부속 질의
--'C413'과목을 등록한 학생 이름을 찾아라
고 했을 때 enrol table 에서 student table 로 가서 학생의 이름을 찾아야 한다.
더 중요) select sname from student natural join enrol where cno = 'C413';
자연 조인을 이용하여 더 간단히 사용 가능
부속 질의를 사용하지 않았을 시
1단계 select sno from enrol where cno = 'C413';
-- 여기의 결과 값을
2단계 select * from student where sno in (100,300,400); 숫자가 들어가는 부분은 집합이 들어가는 자리이다.
-- 2단계에서 다 쳐넣어야 된다.
-> SQL을 nesting이 가능하다. (반복이 가능하다.)
부속 질의를 사용 시
먼저 서브 쿼리가 실행되고 그 다음 그 결과값을 바탕으로 밖의 쿼리가 실행이 된다.
select sname from student where sno in (select sno from enrol where cno = 'C413');
-- 학번이 100인 학생과 동일한 학과에 속한 학생을 모두 찾아라(100번 학생도 포함할 것)
select sname as 학생이름 from student where dept = ( select dept from student where sno = 100);
카티션 프로덕트
from 절에서 사용하는 방법
select *from student s,enrol e where s.sno = e.sno;
단어를 줄여 사용 가능 => 앨리어스 사용
select *from student s join enrol e
on s.sno = e.sno;
자연 조인
select *from student natural join enrol;
공통 컴럼에 대해서 동등 조인을 사용 할 수 있다.
(예시 문제들)
--데이터베이스 과목의 기말고사 최저 점수는?
select cname, min(finterm) from enrol natural join course group by cname
having cname = '데이터베이스';
select * from course;
select * from student;
select min(finterm) from enrol where cno = 'C413';
-- 컴퓨터과 소속 학생들의 과목별 기말고사 평균을 구하여라.
select * from student;
select cno,avg(finterm) from enrol natural join student group by cno;
-- 모든 학생들에 대해 학생의 이름과 수강 과목이름, 해당 과목의 기말 고사와 중간고사의 합계를 다음과 같이 출력하라.
select sname as 이름, dept as 수강과목이름, (finterm + midterm)as 기말중간합계 from student natural join enrol ;
--정기태 학생이 수강한 모든 과목의 중간고사 성적 평균을 구하라
select avg(midterm) from student natural join enrol where sname = '정기태';
select avg(midterm) from student join enrol on student.sno = enrol.sno where sname = '정기태';
-- 데이터베이스과목을 수강하는 학생들의 이름을 모두 찾아라.
select sname from (course natural join enrol) join student on enrol.sno = student.sno
where cname = '데이터베이스';
select * from (student natural join enrol) natural join course
on enrol.sno = student.sno
where cname = '데이터베이스';
'3학년 2학기 > DB' 카테고리의 다른 글
Chapter 4 관계 데이터베이스 (1) (0) | 2016.10.15 |
---|---|
데이터베이스의 종류 (0) | 2016.10.15 |
10/11 수업 (0) | 2016.10.11 |
Chaper 3 데이터베이스 시스템의 구성 (0) | 2016.10.11 |
Chapter 2 데이터베이스 관리 시스템 (2) (0) | 2016.10.08 |