sqlite3 실습 - SELECT 활용

DB 2016. 4. 29. 20:23

지난번에, sqlite3를 설치 한 후, 메모장을 이용하여 DB table을 구성하도록 하였습니다.

(http://jwprogramming.tistory.com/90)

오늘은 DB의 여러 질의문(검색, 삽입, 삭제, 수정) 중에 '검색(SELECT)' 부분을 다루도록 하겠습니다.


1. 학생(STUDENT) 테이블에 어떤 학과(Dept)들이 있는지 검색하라.

->먼저, test.db라는 Sqlite3 데이터베이스 파일명으로 지정하여 sqlite3를 실행합니다.

그 후, 사용자가 보기 편하도록 하기 위하여 아래의 명령을 입력해 주면 기존 Oracle의 인터페이스와 유사하게 표현됩니다.

>.header on

>.mode column

그 후, SELECT DISTINCT Dept FROM STUDENT; 명령을 통하여 중복된 결과는 제거하고(DISTINCT) STUDENT테이블로부터 Dept를 전부 출력해줍니다.

결과로 보면 컴퓨터, 전기, 산공이 표현되는 것을 알 수 있습니다.


2. 학생(STUDENT) 테이블 전부를 검색하라.

전부라는 키워드는 ' * '로써 표현할 수 있습니다. 

따라서 SELECT * FROM STUDENT; 

를 통하여 STUDENT테이블의 전부를 확인할 수 있습니다.

  

3. 학생(STUDENT) 테이블에서 학과(Dept)컴퓨터이고 학년(Year)4인 학생의 학번(Sno)과 이름(Sname)을 검색하라.

- DB의 검색에서 조건에 대한 부분은 WHERE 절을 통해 설정할 수 있습니다.

Dept = '컴퓨터' -> 학과가 컴퓨터를 전부 조회

Year = 4  -> 학년이 4 를 전부 조회

-> AND조건이므로 둘 다 만족하는 데이터를 검색하게 되면, 결과로 나수영과 송병길이 해당되고,

그에 대한 학번과 이름을 조회해야하므로 

SELECT Sno, Sname FROM STUDENT WHERE Dept='컴퓨터' AND Year=4; 

 학번과 이름만을 출력하게 합니다.

 

4. 등록(ENROL) 테이블에서 중간 성적(Midterm)90점 이상인 학생의 학번(Sno)과 과목번호 (Cno)를 검색하되 학번(Sno)에 대해서는 내림차순으로, 또 같은 학번에 대해서는 과목 번호 (Cno)의 오름차순으로 검색하라.

- WHERE절까지는 위의 부분과 유사하므로 생략하도록 하겠습니다. 추가적으로 살펴볼 부분은 ORDER BY 를 통하여 내림차순으로 볼 것인지, 오름차순으로 볼 것인지에 대한 부분입니다.

Sno는 내림차순으로, Cno는 오름차순으로 검색할 것이므로

ORDER BY Sno DESC, Cno ASC;

(DESC -> 내림차순,  ASC -> 오름차순)

을 통하여 데이터를 보여주게 됩니다.

>SELECT Sno, Cno FROM ENROL WHERE Midterm >= 90 ORDER BY Sno DESC, Cno ASC;



5. 등록(ENROL) 테이블에서 과목 번호(Cno)‘C312'인 중간 성적(Midterm)3점을 더한 점수를 학번‘, ’중간성적 = ‘이란 텍스트 내용을 시험‘, 그리고 점수라는 열 이름으로 검색하라.

- AS란 앨리어스를 사용할 때 이용하게 됩니다.

SELECT 필드 AS A FROM 테이블; 과 같은식으로 사용하게 되며

이때, 문제에서 Cno가 'C312'이라는 것이 조건이기 때문에,

WHERE Cno='C312' 가 됩니다.

Sno를 학번으로, 바꿔준 후, 두번째 칼럼에는 시험, 세번째 칼럼은 점수로 AS를 통해 설정을 해줍니다.

그 후 각각의 값은 Sno는 그대로, 시험 칼럼에는 '중간시험 =' 을, 점수칼럼에는 Midterm의 값 + 3 을 해준 상태로 검색을 하게 해주는 부분입니다.

SELECT Sno AS 학번, '중간시험 =' AS 시험, Midterm+3 AS 점수 FROM ENROL WHERE Cno='C312';



6. 과목번호(Cno) 'C413'에 등록한 학생의 이름(Sname), 학과(Dept), 성적(Grade)를 검색하라.

- 이번에는 테이블에 대한 제한이 없습니다. 즉 과목번호 'C413'에 해당한다면 STUDENT건, ENROL이건 관계없이 전부 출력해주어야 하는 부분입니다.

따라서 FROM STUDENT S, ENROL E 라 하여 STUDENT테이블의 데이터에 대해서는 S.xxx로, ENROL테이블의 데이터에 대해서는 E.xxx 로 접근하게 됩니다.

이름,학과,성적에 대한 검색이므로 SELECT S.Sname, S.Dept, E.Grade 이며,

조건으로 설정된 부분 S.Sno = E.Sno AND E.Cno='C413'; 을 살펴보겠습니다.

WHERE 조건절을 이용하여 STUDENT테이블과 ENROL테이블 사이에 S.Sno = E.Sno 의 관계를 맺어주고, 

ENROL테이블 내에 과목번호가 있으므로( STUDENT테이블에는 없습니다!), E.Cno = 'C413'; 부분을 추가해줍니다.

>SELECT S.Sname, S.Dept, E.Grade FROM STUDENT S, ENROL E WHERE S.Sno = E.Sno AND E.Cno='C413';


 

7. 같은 학과 학생들의 학번을 쌍으로 검색하라. , 첫 번째 학번은 두 번째 학번보다 작게 하라.

- 어려운 내용이 아니므로 위의 부분들을 참고하면 이해할 수 있을것이라 생각되어 설명은 생략하도록 하겠습니다.


 

8-1. 학생 테이블에 학생 수가 얼마인가를 검색하라.

- 단순히 COUNT 키워드를 이용하여 학생수가 얼마인지를 검색하는 부분입니다.


 8-2. 학번(Sno)300인 학생이 등록한 과목(Cno)은 몇 개인가?

 

- 위의 내용들과 중복되므로 생략합니다.

 

 

8-3. 과목 ‘C413'에 대한 중간 성적의 평균은 얼마인가?

- AVG키워드를 이용하여 중간성적의 평균을 계산해주는 부분입니다.


9. 과목별 기말성적(Final)의 평균을 검색하라.

-  과목별에 대하여 GROUP BY 절을 이용하여 검색하는 부분입니다.

GROUP BY절은 데이터들을 원하는 그룹으로 나눌 수 있고,

나누고자 하는 그룹의 컬럼명을 SELECT절과 GROUP BY절 뒤에 추가하면 됩니다.

집계함수와 함께 사용되는 상수는 GROUP BY절에 추가하지 않아도 됩니다.

 

10. 3명 이상 등록한 과목의 기말 평균 성적을 검색하라.

- HAVING 절을 이용하여 3명 이상 등록한 과목에 대하여 기말평균 성적을 검색하는 부분입니다.

HAVING절은 WHERE절에서는 집계함수를 사용할 수 없으므로, GROUP BY절과 함께 사용이 되며 집계함수를 가지고 조건비교를 할 때 사용하게 됩니다. 

 

 

11-1. 과목 번호(Cno) 'C413' 등록한 학생이름(Sname)을 검색하라.

- 조건절안에 SELECT가 삽입된 중첩 SELECT 문입니다. 복잡해보이지만 해석하면 단순한 내용이므로 생략하도록 하겠습니다.

이때, 조건절에 SELECT문을 추가로 해주기 위해서 WHERE Sno IN 을 사용하는 것에 주의하시면 되겠습니다.


 

11-2. 과목 번호 ‘C413'에 등록하지 않은 학생의 이름을 검색하라.

- 위와 유사한 내용입니다. 생략합니다.


11-3. 학생 정기태와 같은 학과에 속하는 학생의 이름과 학과를 검색하라.

- 위와 유사한 내용이므로 생략합니다.


 

11-4. 등록(ENROL) 테이블에서 학번이 500인 학생의 모든 기말 성적보다 좋은 학기말 성적을 받은 학생의 학번과 과목번호를 검색하라.

 


12. 과목번호(Cno)C로 시작하는 과목의 과목번호와 과목이름(Cname)을 검색하라.

- C로 시작하는 부분에 대하여 LIKE 키워드를 이용하여 'Cx' 와 같이 설정해주면, x에 대한 부분에 관계없이 과목번호(Cno)중에 첫글자가 C로 시작되는 과목번호는 전부 검색하게 됩니다.

 


13. 학과(Dept)NULL인 학생의 학번과 이름을 검색하라.

------> Dept(학과)NULL인 학생이 없으므로 아무 값도 검색되지 않습니.(아래 그림은 참고)


따라서 학생테이블에 학번이 600, 이름이 김길동’, 학과가 NULL인 투플을 삽입하고 다시 검색하면,

아래와 같이 원하는 화면을 검색할 수 있게 됩니다.

 

 

14-1. 과목 ‘C413'에 등록한 학생의 이름을 검색하라.

- 과목번호 'C413'에 등록한 학생을 검색하기 위한 조건으로 EXISTS를 사용하였으며 

WHERE조건절 안의 SELECT문에서, Sno = STUDENT.Sno 를 통해 밖의 STUDENT테이블과 ENROL테이블의 관계를 맺어주고, Cno='C413'과 AND조건으로 묶어주면 됩니다.

 

14-2. 과목 ‘C413'에 등록하지 않은 학생의 이름을 검색하라.

- 등록되지 않은 부분은 EXITSTS앞에 NOT을 붙여주어 NOT EXISTS로 조건을 정해주면 됩니다.

 

 

15. 3학년이거나 또는 과목 'C324'에 등록한 학생의 학번을 검색하라.

- UNION을 이용하여 SELECT문 두 개를 '또는' 으로 이어주게 됩니다.

 

다음에는 UPDATE에 대해 다뤄보겠습니다.

'DB' 카테고리의 다른 글

sqlite3 실습 - INSERT 활용  (0) 2016.04.29
sqlite3 실습 - UPDATE 활용  (0) 2016.04.29
Sqlite3 설치 및 사용  (0) 2016.04.27
시스템 카탈로그(System Catalog)  (0) 2016.04.24
커서(Cursor)의 개념과 관련 명령어  (0) 2016.04.24

WRITTEN BY
SiriusJ

,