
이번 주는 SQL을 배우기 전에 먼저 데이터베이스에 대한 이론을 학습하였습니다. 또한 SQL 문법에 대해 배우기 시작하면서 DML언어 위주로 스터디를 시작하였습니다. 데이터베이스의 기본적인 개념과 특징에 대한 이해와 SQL을 이용하여 원하는 데이터를 확인하는 것을 목표로 삼았습니다.
이번 주는 데이터베이스의 개념과 특징, 그리고 어떠한 종류와 방식이 있는지 스터디를 하였습니다
SQL의 DML을 이용하여 데이터베이스를 다루는 법을 배웠습니다
이번주 에 실습하면서 겪었던 어려움이나 궁금증의 해결과정을 기록하였습니다
다음은 SQL의 서브쿼리 파트를 배우면서 막혔던 문제입니다
각 제품의 마지막 주문일을 기준으로 제품의 주문단가를 추출하는 연습문제였는데 마지막 주문일의 단가만 뽑는 방법을 생각해내지 못해 문제를 해결하지 못하였습니다
-- 각 제품의 마지막 주문일의 주문단가
SELECT 제품명
, (SELECT 단가*(1-할인율)
FROM 주문세부
JOIN 주문
ON 주문세부.주문번호 = 주문.주문번호
WHERE 주문세부.제품번호 = 제품.제품번호
ORDER BY주문일 DESC
LIMIT 1
) AS 주문단가
FROM 제품;
그러다가 같이 수업을 듣는 동기 분께서 주신 LIMIT 함수를 이용하라는 힌트로 위 코드와 같이 해결을 하였습니다
LIMIT 함수를 사용하지 않았던 이유는 LIMIT 함수를 이용하면 각 제품 별 마지막 주문 단가가 아닌 모든 제품 중 마지막 주문 단가만 나온다고 생각을 하였기 때문입니다.
이는 상관 서브쿼리에 대한 이해가 부족해서 생긴 문제였는데 내부쿼리 내의 LIMIT가 전체 테이블이 아닌 WHERE절에서 필터링 된 특정 제품의 마지막 주문일에만 적용이 되는 것임을 알게 되었습니다.
원리를 살펴보자면 외부쿼리는 제품의 각 행마다 순차적으로 반복하여 데이터를 추출해주는데 내부쿼리 내에 있는 WHERE절로 인해 주문세부와 제품 테이블에 공통으로 존재하는 제품번호를 가져와 이 제품번호에 속하는 항목들을 주문날짜를 기준으로 내림차순 정렬을 하고 LIMIT 함수로 최상단에 있는 값만 가져오는 것입니다.
즉 쉽게 말해서 서브쿼리는 메인 쿼리의 각 제품(제품번호)에 대해 한 번씩 실행되기 때문에 각 제품 별로 마지막 주문번호가 추출이 가능했던 것이었습니다
SELECT로 기본키를 호출하였을 떄 발생하는 버그..?
테이블의 기본키를 포함하여 데이터를 검색하였을 때 마지막 행에 NULL로 이루어진 행이 생긴다는 것을 발견 하였습니다.
USE wntrade;
SELECT *
FROM 제품;

첨부한 위의 사진과 같이 NULL 값으로 이루어진 행이 마지막에 존재한다는 것을 확인할 수 있습니다
아직 원인은 발견하지 못하였지만 NULL에 값이 입력이 가능하고 심지어 APPLY까지 될 수 있다는 것을 발견하였고 NULL에 임의의 값을 입력해서 데이터를 손상시키지 않도록 주의해야 할 것 같다는 생각을 하였습니다.
혹시 원인을 아시는 분은 알려주시면 감사하겠습니다.
이번 주말에는 정보처리기사의 필기 시험을 대비하여 3과목 스터디와 기출문제를 풀 계획이며, 생활이동 데이터 해커톤을 위해 팀원들과 같이 기획서 작성 작업을 할 예정입니다. 마지막으로 이번주에 배운 SQL을 복습할 겸 교재에서 주어진 데이터를 바탕으로 실습을 해볼 계획입니다
따봉 드리겠습니다