학교 수업/DB시스템 구현

[DB 시스템 구현] 틀리기 쉬운 SQL문제 정리하기

부농쿼카 2023. 7. 4. 22:35
728x90

이번 포스팅에선, 많은 사람들이 SQL 문제를 풀면서 틀리는 혹은 헷갈리는 문제를 학교 교수님께서 하신 강의를 바탕으로 정리하였습니다.

우선, 사용하는 테이블들의 관계도는 다음과 같습니다.

테이블 관계도

연결되어 있는 것들은 foreign key 입니다.

1. 컴퓨터 공학과 학생의 학번과 이름 찾기

위와 같은 관계도를 가진 데이터 베이스에서, 컴퓨터 공학과 학생의 학번과 이름을 찾으라고 하면 대부분 다음과 같이 진행합니다.

문제는 없을지 몰라도, 시간은 매우 오래걸립니다. SQL에서 서로 다른 두 테이블을 바탕으로 원하는 결과값을 찾을 때, 두 테이블을 합집합한 후 해당 값을 찾습니다. 이렇게, 아무 조건 없이 그냥 찾으라고 하면 중복된 값들도 계속 체크하기 때문에 실행시간이 매우 오래걸립니다.

그래서 애초에 찾을 때, dept_id가 서로 같은 것들중에 찾으라는 식으로, 찾는 범위를 줄여주면 좋다. 다음에 나오는 식이 모범 답안이다.

모범 답

2. 데이터 베이스를 수강하지 않는 학생의 학번 찾기

대부분 초보자들은 이렇게 SQL문을 작성합니다. 이렇게 되면, 단순히 데이터베이스를 수강하지 않은 학생 뿐만 아니라 수강신청 자체를 하지 않은 학생들도 포함된다는 문제점이 있습니다. 

그래서 이 경우에는 not in 연산자를 사용하여 수강신청 한 학생들 중, 데이터베이스를 수강한 학생들을 제외시키는 방식으로 학번을 검색해야 합니다.

검색

이렇게 검색할 수 있습니다. 여기서, not in 연산자를 사용할 때 주의할 사항이 있습니다. not in 연산자의 왼쪽 select 옆 찾는 값고,오른쪽 selectr 옆 찾는 값의 갯수가 같아야 한다는 것입니다.

3. 데이터베이스, 운영체제 중 적어도 한 과목을 수강한 학생의 이름을 찾아라

이 문제가 제일 많이 틀리고, 헷갈려하는 문제입니다.

오답

이 답안이 왜 틀렸을까요? 바로 연산자의 우선순위를 고려하지 않았기 때문입니다. SQL에선, and 연산자가 or연산자보다 우선순위가 높습니다. 이 문제는 2+(3x1) 에서 괄호가 빠진 것이라고 생각하면 됩니다. 위와같이 작성한 SQL문은 데이터베이스를 수강한 학생의 이름 혹은 운영체제 를 찾아, 학생의 이름을 출력한 것입니다. 

이 문제는 두 가지 방식으로 풀 수 있습니다.

먼저 가장 쉬운 방법은 괄호를 치는 것입니다.

또는 합집합 연산인 union을 사용할 수도 있습니다.

식이 길지만 이해하기 쉽다는 장점이 있습니다.

4. 데이터베이스, 운영체제 모두를 수강한 학생의 이름 찾기

그렇다면 모두 수강한 학생은 어떻게 찾을까요? 이 문제에 대해 가장 많이 나오는 오답은 다음과 같습니다.

우리는 관계형 데이터베이스를 배울 때, 데이터베이스 내 필드는 원자값을 가진다는 특징이 있다고 공부했습니다.

https://quokka-deeplearning.tistory.com/entry/DB-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EA%B5%AC%ED%98%84-%EA%B4%80%EA%B3%84%ED%98%95-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%E2%91%A0-%EA%B4%80%EA%B3%84%ED%98%95-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8

 

[DB 시스템 구현] 관계형 데이터베이스① : 관계형 데이터 모델

관계형 데이터베이스는 관계형 데이터 모델, 관계형 데이터베이스, 관계 대수 이렇게 총 세 파트로 나눠서 설명드리겠습니다. 관계형 데이터 모델 관계형 데이터 모델을 알기 전에 데이터 모델

quokka-deeplearning.tistory.com

기억이 나지 않거나, 모르시는 분들은 다음 포스팅을 확인하시고 오시는 것을 추천드립니다:)

위처럼 title을 두 개를 넣어버리면 title이 '데이터베이스' , '운영체제' 인 레코드를 찾습니다. 그러나, 원자값을 가지는 레코드에 저런 값은 없습니다. 그래서, 선택된 레코드가 없다는 문구가 출력됩니다.

그렇다면 이문제는 어떻게 풀어야 할까요? 위 문제에서 합집합을 사용하였으니, 이번엔 교집합을 이용해 문제를 풀어주면 됩니다. 올바른 답은 다음과 같습니다.

 

이번 포스팅에서는 SQL에서 많이 틀리는 것들에 대해 알아보았습니다. 다음 포스팅은 Oracle에서만 사용 가능한 내장함수에 대해 조금 공부해보도록 하겠습니다!

728x90