17) 학생이 300번인 학생이 등록한 과목의 개수는?
SELECT count(*)
FROM enrol
where sno='300'
18) 과목 'C413'의 중간 평균은?
SELECT avg(*)
FROM enrol
where cno='C413'
19) 과목별 중간고사 평균
SELECT cno, avg(*)
FROM enrol
GROUP BY cno;
여기서 새로운 내용, GROUP BY가 등장한다.
GROUP BY 컬럼명 을 명시해주면 컬럼의 같은 내용끼리 묶어준다.
주의점 : 집계함수와 다른 컬럼들을 같이 사용하고 싶다면 반드시 SELECT의 다른 컬럼들을 GROUP BY에 추가해주어야한다.
WHERE -> 개별조건
HAVING -> 그룹에 대한 조건(전체가 T거나 전체가 F이여야 한다.), 집계함수의 사용이 가능하다.
20) 2명이상 등록한 과목의 중간 평균
SELECT cno,avg(midterm)
FROM enrol
GROUP BY cno
HAVING count(*) >= 2;
21) 2명이상 등록한 과목의 과목번호, 과목명, 중간 평균?
SELECT c.cno,cname,midterm
FROM enrol e JOIN course c ON e.cno=c.cno
GROUP BY c.cno, cname
HAVAING count(*) >= 2
22) 전체 과목의 기말고사의 평균이 80점 이상이면 그 기말 평균을 출력
SELECT avg(final)
FROM enrol
HAVING avg(*) >= 80
23) 학과가 컴퓨터이거나 전기 중, 학생수가 2명 이상인 학과의 학과명 학생 수를 학생수 높은 순으로 출력
SELECT sdept, count(sno)
FROM student
WHERE sdept in ('컴퓨터', '전기')
GROUP BY sdept
HAVING count(*) >= 2
ORDER BY 2 DESC;
정리
SELECT 컬럼명
FROM 테이블 명
WHERE 개별조건
GROUP BY SELECT에 포함된 집계함수 외의 모든 컬럼
HAVING 그룹조건, LIKE 사용가능(모두 T거나 모두 F가 될 수 있기 때문)
ORDER BY 컬럼명 정렬방식
SubQuery(부속 질의어)
다른 질의어에 중첩되어 사용되는 검색문
쓰는 방식
1. ()안에 써야하고 제일 먼저 실행됨
2. Order by를 사용하지 않는다.
3. 외부 쿼리와 비교할 대상을 적절히 사용하여야 한다.
24) 중간고사가 80점 이상인 자료중, 중간고사 평균이 90점 이상인 과목의 과목번호, 과목명, 평균중간고사를 높은순으로 출력
SELECT cname,c.cno, avg(midterm)
FROM enrol e JOIN course c ON e.cno=c.cno
WHERE midterm >= 80
GROUP BY cname, c.cno
HAVING avg(midterm) >= 90
ORDER BY 3 DESC
[부속질의어로 어떻게 만들까?]
25) 과목번호 'C413'을 동록한 학생의 이름
SELECT sname
FROM students JOIN enrol e ON s.sno=e.sno
WHERE cno='C413'
SELECT sname
FROM student
WHERE cno NOT IN (
SELECT cno
FROM course
WHERE cno='C413'
)
26) '나수영'과 같은 학년인 학생의 이름과 그 학년을 출력
SELECT sname, syeaer
FROM student
WHERE syear IN (
SELECT syear
FROM student
where sname='나수영'
)
여기서 = 가 아닌 IN을 사용한 이유는 =는 NULL 값을 찾지 못하지만 IN은 모든 내용을 찾을 수 있기 때문!
왠만하면 IN을 사용하도록 하자
'금 > 데이터베이스' 카테고리의 다른 글
4. 데이터 베이스 (0) | 2017.05.27 |
---|---|
3. 데이터 베이스 (0) | 2017.05.21 |
1. 데이터베이스 (0) | 2017.05.14 |
5. 데이터베이스 (0) | 2017.04.19 |
4. 데이터베이스 (0) | 2017.04.09 |