[내일배움캠프] 데이터 트랙/본 캠프

[내일배움캠프] 14일 차 - SQL 코드카타, 아티클 스터디, SQLD

554083460 2025. 5. 29. 21:02

 

 

 

 SQL 코드카타

 

 

문제 48

즐겨찾기가 가장 많은 식당 정보 출력하기

(문제 49도 비슷한 풀이법 사용함)

 

 

처음 답안 (틀림)

SELECT FOOD_TYPE, -- GROUP BY에 쓴 COLUMN (O)
       REST_ID, -- (X)
       REST_NAME, -- (X)
       MAX(FAVORITES) AS FAVORITES -- 집계 함수 사용 (O)
FROM REST_INFO
GROUP BY FOOD_TYPE -- FOOD_TYPE으로 GROUP BY
ORDER BY FOOD_TYPE DESC;

 

최종 답안

SELECT FOOD_TYPE,
       REST_ID,
       REST_NAME,
       FAVORITES
FROM REST_INFO
WHERE FAVORITES IN -- 여러 값 반환하므로 IN으로 비교
(
SELECT MAX(FAVORITES) -- 다중행 서브쿼리
FROM REST_INFO
GROUP BY FOOD_TYPE
)
GROUP BY FOOD_TYPE
ORDER BY FOOD_TYPE DESC;

 

틀린 이유

1. GROUP BY 사용 규칙을 잘 몰랐다.

GROUP BY columnA 에서

SELECT 절에는 다음 두 가지가 올 수 있다.

1) 그룹화된 컬럼: columnA

2) 집계함수 사용한 column: MAX, MIN, SUM, AVG

 

처음 답안의  REST_ID, REST_NAME 두 column을 집계 함수 없이 쓸 수 없다.

 

2. 서브쿼리를 사용하지 않고 문제를 풀려고 했다.

 

개선점

집계 함수 사용한 컬럼을 GROUP BY에 사용하지 않은 컬럼과 함께 불러올 때, 서브쿼리를 사용한다.

 

새롭게 알게 된 것

1. 집계 함수 사용한 컬럼을 GROUP BY에 사용하지 않은 컬럼과 함께 불러올 때 템플릿


설명

집계 함수 포함된 서브쿼리를 WHERE절이나 HAVING절에 사용한다.

 

문법

SELECT column1,
       column2,
       column3
FROM table
WHERE column4 IN
(
SELECT MAX(column4)
FROM table
GROUP BY column1
)
GROUP BY column1
ORDER BY column;

 

예시

SELECT CATEGORY,
       PRICE AS MAX_PRICE,
       PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE CATEGORY IN ('과자', '국', '김치', '식용유')
AND PRICE IN 
(
SELECT MAX(PRICE)
FROM FOOD_PRODUCT
GROUP BY CATEGORY
)
GROUP BY CATEGORY
ORDER BY PRICE DESC;

 

2. 서브쿼리


1) 위치에 따른 분류

 

(1) 스칼라 서브쿼리: SELECT절

- 하나의 값 반환 (단일 행, 단일 열)

 

(2) 인라인 뷰: FROM절

- 테이블처럼 사용

 

(3) 중첩 서브쿼리: WHERE, HAVING절

- 메인 쿼리 데이터 필터링

- 여러 행, 여러 열 반환 가능

 

① 단일 행 

=, <>, >=, >, <, <= 사용해 비교

 

② 여러 행, 여러 열

IN, ANY, ALL, EXIST 사용해 비교

IN 서브쿼리에서 반환된 여러 값 중 일치하는 값이 있는가?
ANY 서브쿼리에서 반환된 여러 값 중 하나라도 만족하면 조건이 참이 된다.
ALL 서브쿼리가 반환한 모든 값을 만족해야 조건이 참이 된다.
EXIST 서브쿼리에서 결과가 반환되면 조건이 참, 아니면 거짓

 

 

 

 아티클 스터디

 

 

[아티클]

양질의 데이터를 판별하는 5가지 방법: ②믿을 수 있는 데이터인가?

https://yozm.wishket.com/magazine/detail/1074/

 

 


 

 

[요약]

 

데이터 신뢰성: 데이터가 실제 정보를 제대로 담고 있는가?

 

1. 데이터 자체의 신뢰성 판단

 

1) 데이터 오류

- 의미: 사실이 아닌 잘못된 정보 포함된 경우

- 발생 원인: 프로그래밍 오류, 데이터 수집 시 잘못된 정보가 제공되는 경우

- 대응: 데이터 분석가는 분석 초기에 데이터 분석 방법을 파악하고, 데이터 전체를 꼼꼼히 검토해야 한다.

 

2) 결측 데이터 오류

- 의미: 데이터 수집, 적재 과정에서 누락된 데이터

- 발생 원인: 컴퓨터 에러, 수집 시 누락

- 대처법: 결측치 삭제, 특정 값이나 평균 중앙값으로 대체

- 대응: 결측 데이터가 없거나 적게 존재하는 데이터로 분석을 하면 높은 신뢰성 얻을 수 있다.

 

2. 데이터 가공 정도 파악

 

1) 원천 데이터

- 의미: 데이터 수집 후 정제하지 않은 데이터

- 오류 발생 원인: 프로그래밍 오류 등 수집 당시 오류

- 신뢰성: 일반적으로 원천 데이터는 복잡해서 형식, 내용 이해하기 어렵다. 최소한의 가공 거친 것이 신뢰성이 더 높을 수 있다.

 

2) 가공 데이터

- 의미: 지수 개발, 필요 데이터 추출 등 심화된 데이터 가공을 거친 데이터

- 신뢰성: 가공을 많이 할수록 데이터 신뢰성은 낮아진다. 분석가가 가공한 데이터는 결국 추정치, 예측치이기 때문이다.

→ 원천 데이터(데이터 신뢰성)와 가공 데이터(데이터 활용성) 간 균형이 중요

 

3. 결론

데이터 오류 허용 범위 명확하게 설정한 뒤, 이를 기준으로 얼마나 가공된 데이터 선택할지, 어떤 내용의 데이터 선택할지 결정해야 한다.

 

[핵심 개념 및 용어 정리]

 

머신 러닝

- 정의: 인공지능의 하위 집합.

많은 양의 데이터를 제공하여 명시적으로 프로그래밍하지 않고 신경망과 딥 러닝을 사용하여 시스템이 자율적으로 학습하고 개선할 수 있게 한다. 머신러닝을 통해 컴퓨터 시스템은 더 많은 '경험'을 쌓으면서 스스로 지속적으로 조정하고 향상시킬 수 있게 된다.

- 사용 범위: 거의 모든 산업, 비즈니스 활동

예시) 소매업계에서 쇼핑 경험 맞춤 설정, 재고 관리, 조직 보안 유지

- 머신 러닝의 중요성: 데이터 생성 속도가 빨라지고 있다. 머신 러닝으로 방대한 데이터를 분석하고 비즈니스에 활용할 수 있다. 사기 감지, 보안 위협 식별, 맞춤설정 및 추천, 챗봇 통한 자동화된 고객 서비스, 스크립트 작성 및 번역, 데이터 분석 등을 머신 러닝으로 수행할 수 있다.

 

참고 자료

https://cloud.google.com/learn/what-is-machine-learning?hl=ko

 

[인사이트]

원천 데이터와 가공 데이터는 스펙트럼에 놓여 있다. 원천 데이터에 많은 가공을 할수록 심화된 가공을 거친 데이터가 된다. 가공을 많이 할수록 데이터가 정제된다. 분석가의 주관이 많이 개입된다. 데이터 신뢰성이 낮아진다.

원천 데이터와 가공 데이터 간 균형이 중요하다고 아티클에서 언급되었는데, 실무에서 이 균형점을 어떻게 찾아나가는지 궁금하다. 데이터 팀 내부의 미팅으로 균형을 찾는 것일까? 전사 구성원이 모두 모인 미팅에서 이 주제를 논하는 것일까?

 

 

 

 SQLD 헷갈리는 내용만 정리 - Oracle 기반

 

 

참고 자료

SQL 자격검정 실전문제, 한국데이터산업진흥원

GPT 검색

 

더보기

데이터 모델링의 특징

추상화

단순화

정확화

오답: 시스템 구현만을 위해 진행하는 사전단계의 작업 (X)

 

데이터 모델링

정보시스템 구축 위한 데이터 관점 업무 분석 기법

업무 정보 기초 정보를 일정 표기법으로 표현

분석된 모델로 데이터베이스 생성해 개발 및 데이터관리에 사용

데이터 모델링 자체로 업무의 흐름 설명하고 분석하는 의미 가짐

오답: 업무에 대한 설명은 별도의 표기법 이용 (X)

 

데이터 모델링 유의점

중복: 중복되지 않도록 한다

비유연성: 데이터의 정의를 데이터 사용 프로세스와 분리하여 데이터 모델링은 데이터 혹은 프로세스의 작은 변화가 애플리케이션과 데이터베이스에 중대한 변화 일으킬 수 있는 가능성 줄인다.

비일관성: 데이터와 데이터 간 상호 연관 관계에 대해 명확하게 정의해서 비일관성 사전에 예방 가능. 사용자가 처리하는 프로세스 혹은 이와 관련된 프로그램과 테이블의 연계성 높이는 것은 데이터 모델이 업무 변경에 대해 취약하게 만드는 단점에 해당한다.

 

비유연성

데이터 모델을 어떻게 설계했냐에 따라 사소한 업무변화에도 데이터 모델이 수시로 변경되어 유지보수의 어려움을 가중시킬 수 있다. 데이터의 정의를 데이터의 사용 프로세스와 분리함으로써 데이터 모델링은 데이터 혹은 프로세스의 작은 변화가 애플리케이션과 데이터베이스에 중대한 변화를 일으킬 수 있는 가능성을 줄인다.

 

데이터 독립성 구성요소

개념스키마: 통합된 모든 사용자의 관점

내부스키마: 물리적인 저장구조 표현하는 스키마

외부스키마: 여러 사용자 관점으로 구성

외부단계, 개념적 단계: 논리적 데이터 독립성 고려

 

개념 스키마

- 모든 사용자 관점 통합한 조직 전체 관점의 통합적 표현

- 모든 응용시스템들이나 사용자들이 필요로 하는 데이터를 통합한 조직 전체의 DB를 기술한 것으로 DB에 저장되는 데이터와 그들 간의 관계를 표현하는 스키마

 

ERD

작성 시 엔터티 도출 - 엔터티 배치 - 관계 설정 - 관계명 기술 흐름으로 작업 진행

관계의 명칭 매우 중요

 

엔터티의 특징

- 반드시 해당 업무에서 필요하고 관리하고자 하는 정보여야

- 유일한 식별자에 의해 식별 가능해야

- 영속적으로 존재하는 두 개 이상의 인스턴스의 집합이어야

- 업무 프로세스에 의해 이용되어야

- 반드시 속성이 있어야

- 다른 엔터티와 최소 한 개 이상의 관계 있어야 (공통 코드 등은 관계 생략 가능)

 

엔터티 발생 시점에 따라

기본 엔터티

중심 엔터티

행위 엔터티

 

엔티티 명명 기준

가능하면 현업 업무 용어 사용

약어 사용하지 않음

단수명사 사용

모든 엔터티 통틀어서 유일하게 이름 부여

엔터티 생성의미대로 이름 부여

 

속성

업무에서 필요로 하는 인스턴스에서 관리하고자 하는 의미상 더 이상 분리되지 않는 최소의 데이터 단위

 

엔터티, 인스턴스 속성, 속성값의 관계

한 개의 엔터티는 두 개 이상의 인스턴스의 집합

한 개의 엔터티는 두 개 이상의 속성 가짐

한 개의 속성은 한 개의 속성값 가짐

 

파생 속성

데이터 조회할 때 빠른 성능 낼 수 있도록 하기 위해 원래 속성값 계산하여 저장할 수 있도록 만든 속성

 

기본 속성

데이터베이스 설계에서 기본적으로 충족해야 하는 규칙과 관련된 속성

데이터베이스의 구조적 무결성과 기본적인 특성을 정의

 

설계 속성

데이터베이스 설계의 품질과 관련된 속성

정규화, 성능 최적화, 확장성 등을 고려하여 데이터베이스를 설계할 때 중요한 역할을 함

 

도메인

엔터티 내에서 속성에 대한 데이터 타입과 크기, 제약사항 지정하는 것

 

데이터 모델링의 관계

ERD에서는 관계 연결할 때 존재와 행위 구분하지 않고 단일화된 표기법 사용

연관관계는 소스코드에서 멤버변수로 선언하여 사용

의존관계는 오퍼레이션에서 파라미터 등으로 이용

UML에서 연관관계와 의존관계는 실선과 점선으로 다르게 표현이 됨

연관관계는 항상 이용하는 관계, 존재적 관계

의존관계는 상대방 클래스의 행위에 의해 관계가 형성되는 행위적 관계

관계 표기법은 관계명, 관계차수, 선택성

 

물리적 독립성

데이터베이스의 파일 구조의 변화가 논리 스키마에 영향 주지 않음

데이터베이스 색인 구조 변화가 응용 프로그램에 영향 주지 않음

 

관계 표기법

관계명: 관계의 이름

관계차수: 1:1, 1:M, M:N

관계선택사양: 필수관계, 선택관계

 

주식별자의 특징

유일성

최소성

불변성

존재성: NULL 허용 안됨

 

식별자 분류 체계

주식별자: 엔터티 내에서 각 어커런스를 구분할 수 있는 구분자, 타 엔터티와 참조관계 연결할 수 있는 식별자

보조식별자: 엔터티 내에서 각 어커런스를 구분할 수 있는 구분자이나, 대표성을 가지지 못해 참조관계 연결을 못함

내부식별자: 엔터티 내부에서 스스로 만들어지는 식별자

외부식별자: 타 엔터티와의 관계를 통해 타 엔터티로부터 받아오는 식별자

단일식별자: 하나의 속성으로 구성된 식별자

복합식별자: 둘 이상의 속성으로 구성된 식별자

본질식별자: 업무에 의해 만들어지는 식별자

인조식별자: 업무적으로 만들어지지는 않지만 원조식별자가 복잡한 구성을 가지고 있기 때문에 인위적으로 만들어진 식별자

 

도메인

속성이 가질 수 있는 값의 범위

엔터티 내에서 속성에 대한 데이터 타입, 크기, 제약 사항 등 지정하는 것

 

속성

기본 속성: 업무 분석을 통해 바로 정의한 속성

설계 속성: 업무상 존재하지는 않지만 설계를 하면서 도출해 내는 속성

파생 속성: 다른 속성으로부터 계산이나 변형이 되어 생성되는 속성

일반 속성: 엔터티 구성방식에 따른 분류 속성, 엔터티에 포함되어 있고 PK, FK에 포함되지 않은 속성

 

정규형

제1정규형: 모든 속성은 반드시 하나의 값을 가져야 한다.

제2정규형: 엔터티의 일반속성은 주식별자 전체에 종속이어야 한다.

학생 정보 테이블에서 학생 번호(주식별자)만으로는 과목명을 알 수 없지만, 학생 번호 + 과목명이 있어야 점수를 알 수 있다. 이때 점수는 학생 번호와 과목명이 결합된 것에 의존한다. 이처럼, 주식별자 일부(학생 번호)에 의존하면 안 된다는 것이다.

제3정규형: 엔터티의 일반속성 간에는 서로 종속적이지 않다.

 

정규화의 성능

중복 속성 제거해 용량 최소화

데이터 처리 성능 향상

조회성능 저하될 수 도 있다 - 반정규화 고려

반정규화가 조회 성능 항상 향상시키는 것 아님

 

A유형분류코드1, B유형분류코드2, · · ·와 같은 컬럼이 반복되는 경우

컬럼에 의한 반복적인 속성값 가져 속성의 원자성 위배, 1차 정규화 대상

유형분류코드 각각에 대해 개별로 인덱스 모두 생성 시 입력, 수정, 삭제 때 성능이 저하되므로 제 1차 정규화 수행 후 인덱스 적용하는 것이 좋다.

 

어떤 릴레이션 R이 제2정규형이고 기본 키에 속하지 않은 속성 모두가 기본 키에 이행적 함수 종속이 아닐 때 제 3정규형에 속한다.

 

정규화

논리 데이터 모델의 일관성 확보, 중복 제거해 속성들이 가장 적절한 엔터티에 배치되도록 함

제3정규형 만족하는 엔터티의 일반속성은 주식별자 전체에 종속적

반정규화는 성능 위해 데이터 중복 허용하는 것, 성능의 향상을 항상 보장하는 것은 아니다

 

관계

부모의 식별자를 자신의 식별자에 포함하면 식별 관계

부모의 식별자를 자식의 일반 속성으로 상속하면 비식별관계

 

NULL

NULL값과 어떤 숫자를 비교한 결과는 항상 UNKNOWN

NULL = NULL 연산의 결과는 FALSE 또는 UNKNOWN

집계 함수를 계산할 때 NULL값은 0이 아니라 계산에서 제외됨

 

인조식별자

인조식별자는 대체로 본질식별자가 복잡한 구성을 가질 때 만들어진다

인조식별자 사용하면 중복 데이터 막기 어려워진다.

인조식별자 사용하면 본질식별자 사용할 때와 비교하여 추가적인 인덱스 필요해짐

인조식별자 꼭 필요할 때만 쓰기

 

DML

INSERT 테이블에 데이터 입력

UPDATE 입력한 정보 중 잘못 입력했거나 변경 발생해 정보 수정할 때 사용

DELETE 테이블의 정보가 필요 없을 경우 데이터 삭제 수행

 

DDL

데이터 구조 정의 

CREATE, ALTER, DROP, RENAME

 

WHERE절에는 집계 함수를 사용할 수 없다.

GROUP BY 절에는 ALIAS 사용할 수 없다.

 

오라클 날짜 연산

1/24 = 1시간 (하루 / 24시간)

1/24/60 = 1분 (하루 / 24시간 / 60분, 즉 1시간 / 60분)

1/24/(60/10) = 10분 (1시간 / 6분)

 

NULL 함수

NVL(표현식1, 표현식2) - Oracle

ISNULL(표현식1, 표현식2) - SQL Server

표현식1의 결과가 NULL이면 표현식2의 값 출력

 

NULLIF(표현식1, 표현식2)

표현식1이 표현식2와 같으면 NULL, 같지 않으면 표현식1

 

COALESCE (표현식1, 표현식2)

NULL이 아닌 최초의 표현식 나타냄

 

단일행 문자형 함수

LOWER()

소문자로 바꿈

 

UPPER()

대문자로 바꿈

 

ASCII()

ASCII 코드 번호로 바굼

 

CONCAT(문자열1, 문자열2)

문자열1과 문자열 2 연결

 

STBSTR(문자열, M, N)

문자열 중 M 위치에서 N개의 문자 길이에 해당하는 문자 돌려줌

 

LTRIM

RTRIM

TRIM

지정 문자 나타나면 해당 문자 제거

왼쪽부터, 오른쪽부터, 양쪽 모두

 

SELECT 문장 실행 순서

FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY

 

JOIN 조건

JOIN 시 ON절에 A.COLUMN=B.COLUMN 외에도

AND로 연결해 조건을 넣을 수 있다.

조건에 해당하는 부분만 가져오고 나머지는 NULL 처리

 

NULL 연산

컬럼끼리 연산할 때 NULL 포함하면 값은 NULL

레코드끼리 연산할 때 NULL 포함하면 결과는 NULL 아니다.

 

UNION

UNION 각각 집합에 GROUP BY 사용 가능

UNION 각각 집합에 ORDER BY 사용 가능하지 않음

 

집합 연산자 적용 순서

SQL에서 위에 정의된 연산자가 먼저 수행

UNION ALL

UNION

이 순서라면 UNION이 나중에 수행되어 중복 제거

 

계층형 쿼리

계층형 데이터 조회할 때 사용

START WITH: 계층 구조의 시작점

CONNECT BY: 계층 관계 정의, 한 행이 다른 행과 어떻게 연결되는지 정의

PRIOR: 부모-자식 관계 규정, PRIOR A1 = A2이면 A1이 부모 행, A2가 자식 행일 때 A1 값이 A2와 같으면 부모 행과 자식 행이 연결됨

ORDER SIBLINGS BY: 형제 노드 간 순서 정의,  ORDER SIBLINGS BY A3 DESC이면 동일 부모 가진 행들을 A3기준으로 내림차순 정렬