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;
'CS > 데이터베이스' 카테고리의 다른 글
[DB] 6. SQL DDL (0) | 2022.07.15 |
---|---|
[DB] 6. SQL DML(INSERT, UPDATE, DELETE) (0) | 2022.07.15 |
[DB] 6. SQL Basic (0) | 2022.07.15 |
[DB] 5. 관계 대수와 관계 해석 (0) | 2022.06.28 |
[DB] 4. 관계 데이터베이스 (0) | 2022.06.19 |