실습문제 1.
[ 1. 문제 설명 ]
employee 테이블은 보험 회사 직원의 정보를 담고 있는 테이블입니다.
employee 테이블 구조는 다음과 같습니다.
name type nullable 설명
id number FALSE 직원아이디
name varchar FALSE 이름
salary number FALSE 월급
branch_id number FALSE 근무 대리점 아이디
sellings 테이블은 자동차 보험 판매 기록을 담고 있는 테이블입니다.
테이블 구조는 다음과 같습니다.
name type nullable 설명
car_id number FALSE 보험 대상 자동차 ID
employee_name number FALSE 보험 설계사 사원 ID
created_at date FALSE 계약일
price int number FALSE 보험료
employee 테이블과 sellings 테이블을 이용하여 대리점별로 보험을 몇 건이나 성사했는지 조회하는 SQL문을 작성.
간단히 해결하였다. 여기서 주의할 점은 count에 들어갈 컬럼이다. 일대다 관계일 경우 count는 없을 수도 있는 쪽을 파악하여야 한다.
잘못된 count 예제를 살펴보자.
만약 A 직원이 B 지점에 속해있는데 거래 건수가 한 건도 없다면?
B 지점에는 A직원만 소속되어있다고 가정하며 B 지점 count 결과가 0이 나와야 한다.
먼저 새로운 직원을 입력해보자
count에 e 테이블 컬럼을 불러오면 직원 한 명을 세어버리니 거래 건수가 0인 것을 출력해내지 못했다.
이렇게 출력해야 거래건수가 0인 것이 출력된다. 특히 count에 무조건 count(*) 하지 말 것에 대해 주의하여야 한다.
실습문제 2.
[ 2. 문제 설명 ]
places 테이블은 공간 임대 서비스에 등록된 공간의 정보를 담은 테이블입니다.
테이블 구조는 다음과 같습니다.
name type 설명
id number 공간아이디
name varchar 이름
host_name varchar 공간소유자 유저명
place_reviews 테이블은 공간을 임대한 사람이 남긴 후기를 담은 테이블입니다.
구조는 다음과 같습니다.
name type 설명
id number 게시글아이디(기본키)
place_id number 공간아이디
create_at date 후기남긴날짜
reviewer_id number 후기남긴유저아이디
comments varchar 후기내용
임대 서비스에서는 후기가 하나도 안 달린 공간, 50개 미만인 공간, 100개 미만인 공간,
100개 이상인 공간을 각각 몇 개인지 구하려 합니다.
공간 별로 후기가 몇 개인지 조회하는 SQL문을 작성.
이때 후기가 하나도 안 달린 공간은 0, 50개 미만인 공간은 < 50,
100개 미만인 공간은 < 100, 100개 이상인 공간이 >= 100으로 표시해야 합니다.
또한 결과는 후기수가 작은 순서대로 보여주세요.
먼저 내가 풀이한 결과이다.
먼저 각 공간별로 후기수에 대하여 늘어놓았다.
그 다음에 아래와 같이 공간 후기수를 group by하여 공간 후기수에 따른 공간 개수를 count 하였다.
여기서 내가 놓친 점은 출력할 때 공간 후기 수가 작은 순서대로 출력하여야 하는데, 공간 별로 count한 수가 적은 순서대로 정렬하였다.
선생님은 아래와 같은 단계로 풀이하셨다.
step4에서 정렬할 때 공간순서로 order by하는 방법을 기억해둬야겠다.
실습문제 3.
[ 3. 문제설명 ]
CART_PRODUCTS 테이블은 장바구니에 담긴 상품 정보를 담은 테이블입니다.
CART_PRODUCTS 테이블의 구조는 다음과 같으며, ID, CART_ID, NAME, PRICE는 각각 테이블의
아이디, 장바구니의 아이디, 상품 종류, 가격을 나타냅니다.
데이터 분석 팀에서는 우유(Milk)와 요거트(Yogurt)를 동시에 구입한 장바구니가 있는지
알아보려 합니다. 우유와 요거트를 동시에 구입한 장바구니의 아이디를 조회하는
SQL 문을 작성해주세요. 이때 결과는 장바구니의 아이디 순으로 나와야 합니다.
먼저 내 풀이 결과이다.
선생님은 두 가지 방법으로 해설해주셨다.
sol2 의 경우 가독성이 떨어진다고 하셨고 나도 이 코드가 아직도 이해가 가지 않는다. 이따 학원가서 질문해봐야겠다.
나는 self join을 했는데 이 방법은 성능에 좋지 않다고 하셨다. 단일쿼리로 할 수 있다면 단일쿼리로 진행하는 것이 좋다고 말씀하셨다. 최대한 table access를 줄이도록 해보자.
'배우기 > 복습노트[oracle sql]' 카테고리의 다른 글
[복습] SQL | Oracle SQL의 분류(DDL, DML, DCL, TCL, DQL) 중 DML의 UPDATE (0) | 2023.11.09 |
---|---|
[복습] SQL | Oracle SQL의 분류(DDL, DML, DCL, TCL, DQL) 중 DML의 INSERT (0) | 2023.11.09 |
[복습] data를 unload 하는 방법 및 데이터 DB화 방법 두 가지 + 복습(20231107) (1) | 2023.11.09 |
[복습] SQL | Oracle SQL의 분류(DDL, DML, DCL, TCL, DQL) 중 DDL의 TRUNCATE (0) | 2023.11.09 |
[복습] SQL | Oracle SQL의 분류(DDL, DML, DCL, TCL, DQL) 중 DDL의 ALTER (0) | 2023.11.08 |