CS/데이터베이스

[DB] 6. SQL DML(SELECT)

소-은 2022. 7. 15. 15:00
728x90

DML ?

데이터 조작 언어로, CRUD 연산이 가능해야 한다.

- CREATE

- READ

- UPDATE

- DELETE

 

1. select : 조건에 맞는 데이터 검색

select [컬럼명] from <테이블명> [where 조건식]

 

ex) '산공'과 4학년 학생들의 이름을 찾아라

select sname from STUDENT where dept = '산공' and year = '4';

 

기말고사 또는 중간고사의 성적이 90점 이상인 학생들의 학번을 찾아라

select sno from enrol where MIDTERM >= 90 or finterm >= 90;

 

기말고사 성적이 중간고사 성적보다 좋은 학생들의 학번을 찾아라

select sno from enrol where midterm < finterm;

 

 

* select distinct : 중복된 레코드는 한 번만 출력

 

select distinct sno

from enrol

where midterm < finterm;

select year from STUDENT; -- 특정 column만 출력(행 선택x)

select distinct year from STUDENT; -- 중복은 한 번만 출력

 

 

* order by : select 결과를 정렬하여 출력

 

  • asc : 오름차순(디폴트)
  • desc : 내림차순

 

ex) select * from STUDENT order by year, asc, sno, dec;

 

 

* like : 문자열 패턴 검색

 

  • % : 임의의 길이 및 문자
  • _ : 단일한 임의의 문자

ex) 과목이름에 '구조'라는 문자열이 포함된 모든 과목 검색

select * from COURSE where cname like '%구조%'

 

이름이 '김'으로 시작하는 모든 학생을 검색

select * from STUDENT where sname like '김%'

 

이름이 '싸'자로 시작하고 두 글자인 학생을 검색

select * from STUDENT where sname like '싸_'

 

 

 

* in : 주어진 값들에 포함되는 것만 검색

 

select * from STUDENT where year in (1, 2);

 

위와 같은 표현

select * from STUDENT where year = 1 or year = 2; 

 

* between : 값의 범위에 따른 검색

 

select * from STUDENT where year between 1 and 3;

 

 

* alias : 테이블, 컬럼의 이름을 주어진 이름으로 지정

 

select sno as 학번, sname as name from student;

 

 

* 집계함수

  • avg() : 평균
  • count() : 개수
  • first() : 첫째 값
  • last() : 마지막 값
  • max() : 최대값
  • min() : 최소값
  • sum() : 합계

 

 

ex)

기말고사 최고점은 얼마인가?

select max(finterm) from ENROL;

 

'C413' 과목의 기말고사 최저점수는?

select min(finterm) from enrol where cno = 'C413';

 

기말고사 평균은?

select avg(finterm) from ENROL;

select avg(finterm) from enrol where cno = 'C413';

 

 

* group by : 컬럼값이 같은 것을 묶어 집계함수 적용

 

ex) 학과별로 소속 학생의 수를 출력하라

select DEPT 학과, count(*) as 학생수 from STUDENT group by DEPT;

 

학과별로 개설된 과목의 개수를 구하라.

select dept as 학과, count(*) as 과목수

from course

group by dept;

 

과목별로 기말고사의 평균을 구하라.

select cno as 과목, avg(finterm) as 평균

from enrol

group by cno;

 

* having 절 : 그룹에 대한 조건식

 

ex) 3명 이상 수강하는 과목의 기말 평균을 구하라.

 

select cno as 과목, avg(finterm) as 기말평균

from enrol

group by cno

having count(*) >= 3; -- 행의 수가 3이상

 
 
 
- where는 group by 전에 주어짐. 원래의 테이블에 대한 조건
- having은 group by 이후 주어지는 조건

 

 

2. 부속 질의(subquery)

: select 문 안에 포함된 select 문

 

ex) 'C413' 과목을 등록한 학생 이름을 검색하라.

select sname from STUDENT where sno in ( select sno from ENROL where cno = 'C413' )

 

학번이 100인 학생과 동일한 학과에 속한 학생을 모두 찾아라.

select * from STUDENT where dept = (select dept from STUDENT where sno = 100)

 

 

3. 카티션 프로덕트

: from 절에 여러 개의 테이블을 지정하면 카티션 프로덕트 생성

 

ex) select * from STUDENT, ENROL

=> STUDENT와 ENROL의 각 행이 하나씩 대응

 

 

4. join

1) natural join : 중복된 컬럼에 대해 동일조인을 수행하고 중복된 컬럼은 한 번만 출력

 

 

ex) 'C413' 과목을 등록한 학생 이름을 모두 출력하라.

select sname from STUDENT natural join ENROL where cno = 'C413'

 

'데이터베이스'과목을 수강하는 학생들의 이름을 모두 찾아라.

select sname from (STUENT natural join ENROL) join COURSE on ENROL.cno = COURSE.cno

where cname = '데이터베이스'

 

'정기태' 학생이 수강한 모든 과목의 중간고사 성적 평균을 구하라.

select avg(midterm)

from STUDENT s join ENROL e on s.sno = e.sno

where sname = '정기태'

 

 

 2) outer join : 조인 조건을 만족하는 것과 관계 없이 한 번씩 출력

 

ex) 등록한 과목이 전혀 없는 학생들의 이름을 출력하라. 
select sname
from enrol right outer join student on student.sno = enrol.sno
where cno is null;

등록한 학생이 전혀 없는 과목의 과목 이름을 출력하라. 
select sname
from enrol right outer join student on student.sno = enrol.sno
where sno is null;

728x90