본문 바로가기

이론/DB

[DB] SQL - (3)

중간고사 이후시간이다.

이제까지 배운것은 대학데이터베이스가 설계되어있을 때의 쿼리문을 작성하는 것이였다.

이제 하반기에는 데이터베이스가 어떻게 만들수 있는지 설계부분에 중점을 둬서 공부를 하게 될 것이다.

데이터베이스 설계도 DBA가 가져야 할 스킬이다.

데이터베이스 갱신에 대한 SQL을 다시 해볼거다. 

데이터 갱신은 테이블에 조건에 맞는 튜플에 대해서 애트리뷰트 값을 변경시킬 수 있다. 

UPDATE 테이블 SET { 열이름 = 산술식 } [ WHERE 조건] ; 

하나의 튜플에 대해서 업데이트한 예

UPDATE STUDENT SET year = 2 WHERE sno = 300; 

복수의 튜플 변경

UPDATE COUSE SET Credit = Credit + 1 WHERE dept  = '컴퓨터'; 

부속 질의를 통해 UPDATE 가 가능하다. 

컴퓨터과에 소속된 학번에 대해서 기말고사 성적을 5점씩 올려라. 

UPDATE ENROL SET Final = Final + 5 WHERE Sno IN ( SELECT Sno FROM STUDENT WHERE Dept = '컴퓨터');

부속질의로 안하고 조인을 통해 업데이트를 해도 된다. 조인으로 업데이트한 경우 조인 업데이트를 한다라고 한다.

UPDATE enrol e INNER JOIN students s ON e.sno = s.sno  SET e.final = e.final + 5 WHERE s.dept = '컴퓨터'; 

데이터베이스를 개설한 학과의 dept를 4로 바꿔라 

UPDATE STUDENT SET Dept = (SELECT Dept FROM COURSE WHERE Cname = ‘데이터베이스’) WHERE Year = 4;

데이터 베이스 개설한 과가 컴퓨터 공학과 하나인경우 제대로 하나가 리턴이 되지만,

경영학과도 데이터베이스 과목이 있는 경우도 year을 4로 바꿔버리므로 fail 

select e.* from student s, enrol e where s.sno = e.sno and s.dept = 'SW'; 

update students inner join enrol e on e.sno = s.sno set e.final = e.final + 5 where s.dept = 'SW';

e.* : 등록테이블의 모든 애트리뷰트 출력한다.

*조인을 통해 업데이트하는 것은 알아둘 필요가 있다. 

데이터의 삽입

직접 튜플값을 애트리별로 지정할 수도 있지만, select 결과를 통해 나온것을 insert 할 수도 있다.

* 검색결과를 바로 삽입한다. 실용적인 문장이다. 

INSERT INTO COMPUTER(Sno, Sname, Year) SELECT Sno, Sname, Year FROM STUDENT WHERE Dept = '컴퓨터';

insert into students (sno, sname, year , email, dept) select sno + 200 ,concat(sname, 'avengers') , year + 1 , concat(email, '-avengers')  from students;

*concat : 문자열 연결 

delete from 테이블 where 조건; 

하나의 레코드 삭제하는 구문 : 기본키를 가지고 삭제하면 하나의 레코드가 삭제된다. 

delete from students where sno = 100;  

delete from students where sno >= 3000;  // 가능

//key column을 명세하지 않고 delete 쓰면 에러가 난다.(sql의 safety 모드때문에)

부속질의를 사용해서 삭제를 할 수 있다. 부속질의도 조인을 통해 문장을 표현하는 것이 일반적이다. 

delete e from enrol e inner join students s on e. sno = s.sno where e.cno = 'C413' and e.final < 60 and s.dept = '컴퓨터'; 

 select e.* from enrol e inner join students on e.sno = s.sno where e.cno = 'PL' and e.final >= 90 and s.dept = 'SW';