SQL이란
관계형 DBMS를 연구할 때 관계형 대수와 관계형 해석을 기반으로 개발된 데이터 언어
관계형 데이터베이스의 표준 언어
SQL 특징
대화형질의어와 고급 프로그래밍 언어내에 SQL이 삽입된 형태로 사용이 가능EX)
create table 수강(
학번 integer not null,
과목코드 char(5) not null,
점수 integer,
성적 char(2),
primary key(학번,과목코드),
foreign key(학번) references 학생(학번)
on delete cascade
on update cascade,
foreign key(과목코드) references 과목(과목코드)
on delete cascade
on update cascade,
check(성적 >=0 and 성적 <=100);
)
밑에서 사용하는 테이블들은 앞 글에 있다.
기본적 구조
select ${가져올 칼럼} from ${테이블} where 조건;
ex) 컴퓨터과 학생의 학번과 성명 검색
select 학번, 성명 from 학생 where 학과 = '컴퓨터';
SQL과 이론적인 관계형 데이터 모델의 차이점
투플의 유일성을 만족하지 않는다.disticnt를 명시적으로 작성해야한다.기본 구조
select [ALL|Distinct] ${가져올 칼럼} from ${테이블} where 조건 group by ${col} having 조건 order by ${col} [ASC|DESC];
select * from 학생;
Distinct를 이용한 검색/ 학생테이블에 어떤 학과가 있는지 검색해라
select distinct 학과 from 학생
select 과목코드,과목명 from 과목 where 학점 = 3 and 학년 = 4;
select 과목코드,과목명 from 과목 where 과목코드 like 'CO%';
select 교수번호, 과목코드 from 강의 where 강의실 is null;
select * from 수강 where 점수 between 80 and 90;
정렬된 값을 원한다면 order by를 사용해 asc(오름), Desc(내림)으로 볼 수 있다.
수강 테이블에서 점수가 80이상인 학생의 학번과 성적을 검색하되, 학번은 오름차순, 같은학번에 대해서 성적은 내림차순으로 검색해라
select 학번, 성적 from 수강 where 성적 >= 80 order by 학번 asc, 성적 desc;
select 학번 as DB수강학번, '최종점수=' as 내용, 점수 +2 as 수정점수 from 수강 where 과목코드 = 'co123';
두개 이상의 테이블로부터 데이터를 조인하는 복수테이블 질의
과목코드 'co423'에 수강한 학생의 성명,학과,성적을 검색하라
select 성명, 학과, 성적 from 학생, 수강 where 학생.학번 = 수강.학번 and 과목코드 = 'co423';
select s1.학번, s2.학번 from 학생 s1, 학생 s2 where s1.학과 = s2.학과 order by s1.학번;
select count(*) as 학생수 from 학생;
select avg(점수) as 평균 from 수강 where 과목코드 = 'co123';
select 과목코드, avg(점수) as 평균 from 수강 group by 과목코드;
select 과목코드, avg(점수) as 평균 from 수강 group by 과목코드 having count(*) >=2;
select 성명 from 학생 where 학과 = (select 학과 from 학생 where 성명 = '김철수');
select 성명 from 학생 where 학번 in (select 학번 from 수강 where 과목코드 = 'co123');
반환되는 결과는 여러개이다.
과목코드 'co123'에 수강하지 않은 학생의 성명을 검색해라
select 성명 from 학생 where 학번 not in (select 학번 from 수강 where 과목코드 = 'co123')
수강테이블에서 학번 20181234의 점수보다 좋은 점수를 받은 학생의 학번과 과목코드를 검색해라
select 학번, 과목코드 from 수강 where 점수 > all (select 점수 from 수강 where 학번 = 20181234);
과목 'co123'에 수강한 학생의 성명을 검색해라
select 성명 from 학생 where exists (select * from 수강 where 수강.학번 = 학생.학번 and 과목코드 = 'co123');
컴퓨터과 학생이거나 EE123에 수강한 학생의 학번을 검색하라
select 학번 from 학생 where 학과 = 컴퓨터 union select 학번 from 수강 where 과목코드 = EE123;
insert into table(도메인들) values(값들);
insert into table values (값들);
insert into 테이블A(넣을 속성) select 속성 from 테이블 B where 조건
delete from table where 삭제할 투플의 조건
delete from 테이블;
delete from table where 조건 in (서브 쿼리)
update 테이블 set 바꿀 속성 where 바꿀 행
update 테이블 set 바꿀 속성 where 바꿀 행들
update 테이블 set 바꿀 속성 where 바꿀 테이블 in (서브쿼리)
복잡하니 예를 들자면
컴퓨터과 학생의 점수를 2점씩 증가시켜라 라는 쿼리에는
update 수강 set 점수 = 점수 + 2 where 학번 in (select 학번 from 학생 where 학과 = 컴퓨터)
이렇게 사용해야한다.
즉 서브쿼리로 바꿀 행들을 가져오고 이후 갱신하면 된다.
ex) 학생 테이블의 컴퓨터과 학생들로 구성된 학생 뷰를 생성해라
create view 학생뷰(학번,성명,전화번호)
as select 학번,성명,전화번호
from 학생
where 학과 = '컴퓨터'
with check option;
create view 학과별통계(학과,학생수)
as select 학과, count(*)
from 학생
group by 학과;
create view 우수학생(성명,학과,점수)
as select 학생.성명,학생.학과,수강.점수
from 학생,수강
where 학생.학번 = 수강.학번 and 수강.점수>=90;
drop view 뷰이름 {RESTRICT | CASCADE}
ex)
이중모드 특성을 가진다호스트변수는 :를 붙인다.호스트 변수는 사용되기 전에 BEGIN DECLARE SECTION에서 선언되어야 한다.
EXEC SQL BEGIN DECLARE SECITON;
int sno;
char sname[21];
char dept[7];
char SQLSTATE[6];
EXEC SQL END DECLARE SECTION;
sno = 20181234
EXEC SQL select 학번,성명,학과
into :sno, :sname. :sdept
fron 학생
where 학번 = :sno;
IF (SQLSTATE = '00000')
...
else
...
c 언어를 기반으로
int main(){
EXEC SQL BEGIN DECLARE SECITON;
int sno;
char sname[21];
char dept[7];
EXEC SQL END DECLARE SECTION;
sno = 20181234
EXEC SQL CONNECT TO 데이터베이스 이름 USER 유저 이름
EXEC SQL select 학번,성명,학과
into :sno, :sname. :sdept
fron 학생
where 학번 = :sno;
printf("출력 %s %s %s",sno,sname,sdept);
return(0);
}
호스트 변수에 저장된다.학번 20181234 학생이 수강한 학생의 점수를 호스트 변수 x만큼 증가시켜라
EXEC SQL UPDATE 수강
SET 점수 = 점수 + :x
where 학번 = 20181234
커서를 사용EXEC SQL DECLARE cur CURSOR FOR //커서 정의
select 학번, 성명, 학과
from 학생
where 학과 = :sdept;
EXEC SQL OPEN cur; // select 실행
DO // 반복
EXEC SQL FETCH cur INTO :sno,:sname.:sdept; // 다음 레코드 가져옴
...
ENDl
EXEC SQL CLOSE cur; // 커서 종료
변경
EXEC SQL UPDATE 학생
SET 학과 =:sdept
WHERE CURRENT OF cur;
삭제
EXEC SQL DELETE FROM 학생
WHERE current of cur;
PREPARE
EXECUTE