소개
잔재미코딩, Dave Lee
주요 경력: 쿠팡 수석 개발 매니저/Principle Product Manager, 삼성전자 개발 매니저 (경력 약 15년)
학력: 고려대 일어일문 / 연세대 컴퓨터공학 석사 (완전 짬뽕)
주요 개발 이력: 삼성페이, 이커머스 검색 서비스, RTOS 컴파일러, Linux Kernel Patch for NAS
저서: 리눅스 커널 프로그래밍, 리눅스 운영 체제의 이해와 개발, 누구나 쓱 읽고 싹 이해하는 IT 핵심 기술, 왕초보를 위한 파이썬 프로그래밍 입문서
풀스택/데이터과학 관련 무료 자료를 공유하는 사이트입니다.
IT 학습에 도움이 되는 팁/ 짧은 무료 강의를 공유하고자, 조금씩 시작하고 있습니다~
최신 현업과 IT 강의를 병행하며, 8년째 꾸준히 견고한 풀스택과 데이터과학 강의를 만들고 있습니다.
강의
전체 12로드맵
전체 3수강평
- 풀스택을 위한 도커와 최신 서버 기술(리눅스, nginx, AWS, HTTPS, flask 배포) [풀스택 Part3]
- 처음하는 파이썬 데이터 분석 (쉽게! 전처리, pandas, 시각화 전과정 익히기) [데이터분석/과학 Part2]
- 파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)
- [2024 리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]
- 파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)
게시글
질문&답변
2024.11.20
중급 연습문제 25번
안녕하세요. 답변 도우미입니다. 문의가 두개 인것 같아요. 각각에 대해 참고해보시면 좋을 만한 부분을 작성하여 공유드립니다.하나도 행이 안나오는 문제1. 조인 순서와 조건 확인연결되는 테이블들은 아래와 같은 구조를 가집니다:category → film_category (카테고리와 영화 연결)film_category → film (영화 상세 정보)film → inventory (재고 연결)inventory → store (스토어 연결)store → staff (스태프 정보)staff → payment (결제 정보)이 연결 구조에서 하나의 조인이라도 조건에 맞는 데이터가 없다면 전체 결과가 비게 됩니다.2. 에러 원인 확인(1) 테이블 간 데이터 누락 가능성특정 테이블들 간의 매칭이 정확히 이루어지지 않을 가능성이 있습니다. 예를 들어:inventory와 store 간 연결에서, 특정 store_id가 없을 수 있음.staff와 payment 간 연결에서, 특정 스태프의 결제 데이터가 없을 수 있음.이는 주어진 조인 조건들이 INNER JOIN을 사용하는데, 조건을 만족하지 못하는 경우 해당 데이터가 필터링되기 때문입니다.(2) 데이터 정확성 점검각 테이블에서 연결 기준이 되는 열에 적절한 데이터가 있는지 확인해야 합니다. 예를 들어:inventory.film_id와 film.film_id의 데이터가 매칭되는지 확인.payment.staff_id가 staff.staff_id에 모두 존재하는지 확인.3. 해결 방안(1) 각 테이블의 데이터 점검아래와 같은 방식으로 각 조인 간의 데이터가 잘 연결되는지 확인합니다:-- Step 1: category와 film_category 간 연결 확인 SELECT * FROM category C JOIN film_category FC ON C.category_id = FC.category_id LIMIT 10; -- Step 2: film_category와 film 간 연결 확인 SELECT * FROM film_category FC JOIN film F ON FC.film_id = F.film_id LIMIT 10; -- Step 3: inventory와 film 간 연결 확인 SELECT * FROM inventory I JOIN film F ON I.film_id = F.film_id LIMIT 10; -- Step 4: payment와 staff 간 연결 확인 SELECT * FROM payment P JOIN staff STA ON P.staff_id = STA.staff_id LIMIT 10;이 과정을 통해 어느 조인에서 데이터가 없어서 결과가 반환되지 않는지 확인할 수 있습니다.(2) LEFT JOIN으로 데이터 누락 확인INNER JOIN 대신 LEFT JOIN을 사용하면 누락된 데이터를 확인할 수 있습니다:SELECT C.name AS category_name, P.amount FROM category C LEFT JOIN film_category FC ON C.category_id = FC.category_id LEFT JOIN film F ON FC.film_id = F.film_id LEFT JOIN inventory I ON F.film_id = I.film_id LEFT JOIN store STO ON I.store_id = STO.store_id LEFT JOIN staff STA ON STO.store_id = STA.store_id LEFT JOIN payment P ON STA.staff_id = P.staff_id WHERE P.amount IS NULL -- 누락된 데이터 확인 LIMIT 10;(3) 최종 쿼리 수정조건부로 LEFT JOIN을 검토하고, 중복 열 문제를 피하기 위해 필요한 열만 SELECT 및 GROUP BY에 명시적으로 기입하세요:CREATE OR REPLACE VIEW top5_genres AS SELECT C.name AS Genre, SUM(P.amount) AS Total_Sales FROM category C JOIN film_category FC ON C.category_id = FC.category_id JOIN film F ON FC.film_id = F.film_id JOIN inventory I ON F.film_id = I.film_id JOIN store STO ON I.store_id = STO.store_id JOIN staff STA ON STO.store_id = STA.store_id JOIN payment P ON STA.staff_id = P.staff_id GROUP BY C.name ORDER BY SUM(P.amount) DESC LIMIT 5;4. 추가적인 점검 사항데이터 무결성: sakila 데이터베이스는 샘플 데이터베이스로, 특정 데이터가 누락되었을 가능성이 있습니다.결과 확인: 각 조인 단계에서 LIMIT를 사용해 중간 결과를 확인하여 문제의 원인을 좁힙니다.에러 코드 문제에러 코드 1060: Duplicate column name 'category_id'여러 테이블을 조인할 때 동일한 이름의 열(category_id)이 두 개 이상의 테이블에 존재하는 경우 발생할 수 있습니다.이는 SELECT 문의 *를 사용할 때 중복된 열 이름을 구별할 수 없기 때문입니다.결과 행이 반환되지 않음조인 조건이 적절하지 않거나 테이블 간 연결 기준이 충족되지 않을 때 발생할 수 있습니다.데이터가 누락되었거나, 조건이 정확히 일치하지 않는 문제가 있을 수 있습니다.원인:중복된 열 이름category_id 같은 중복 열 이름이 SELECT 시 충돌을 일으킴.조인 결과에 명시적으로 별칭을 지정하지 않으면 시스템은 어떤 category_id를 반환할지 결정하지 못합니다.조인 조건의 문제INNER JOIN을 사용할 경우 조건이 맞는 행만 반환합니다. 조건이 맞는 데이터가 없는 경우 결과가 빈 상태로 반환됩니다.테이블 간에 연결 고리가 되는 키 값이 실제 데이터에서 존재하지 않을 수도 있습니다.해결책:SELECT 절에 명시적 컬럼 지정SELECT a.column_name1, b.column_name2, a.category_id AS a_category_id, b.category_id AS b_category_id FROM table_a a INNER JOIN table_b b ON a.category_id = b.category_id;* 대신 사용할 열을 명시적으로 지정하고, 필요한 경우 별칭(AS)을 추가합니다.데이터 확인 및 조인 조건 점검데이터가 정확히 매칭되는지 확인하세요:SELECT * FROM table_a WHERE category_id IS NOT NULL; SELECT * FROM table_b WHERE category_id IS NOT NULL;두 테이블 간의 연결 키(category_id)에 데이터가 정확히 존재하고 일치하는지 점검합니다.LEFT JOIN 사용 (필요 시)데이터 누락 가능성을 확인하기 위해 LEFT JOIN을 사용해 보세요:SELECT a.*, b.* FROM table_a a LEFT JOIN table_b b ON a.category_id = b.category_id;이렇게 하면 table_a의 모든 데이터와 매칭되지 않은 table_b 데이터를 확인할 수 있습니다.감사합니다.
- 0
- 1
- 11
질문&답변
2024.11.07
sql 설치 문제
안녕하세요. 답변 도우미입니다.정확히는 알기 어렵지만, 왠지 회사 PC 에서 작업을 하시거나, 아니면 어떤 권한이 제한된 사용자 ID 로 작업을 하신 것이 아닌가 싶어요. 그래서 설치 폴더등에 어떤 권한이 없어서 에러가 난것으로 추측이 됩니다. 한번 다음 내용도 참고해보셔도 좋고요. 아예 다른 PC 에서 설치를 해보시는 것도 추천드립니다. Database initialization failed 에러는 여러 원인으로 발생할 수 있으며, 특히 exit code -1073741819 오류는 MySQL이 초기화하는 과정에서 프로세스가 강제 종료되었음을 나타냅니다. 몇 가지 해결 방법을 안내드리겠습니다.1. 권한 문제 확인: - MySQL 설치 폴더와 데이터 폴더에 대한 충분한 접근 권한이 있는지 확인합니다. - MySQL이 설치된 폴더(예: C:\Program Files\MySQL\MySQL Server 9.1), 데이터 폴더(기본적으로 C:\ProgramData\MySQL\MySQL Server 9.1\data)에 대해 관리자 권한으로 설정되어야 합니다. - 특히, NT AUTHORITY\NetworkService 계정에 대한 권한을 설정해주어야 합니다.2. 비정상 종료 코드 확인 (-1073741819): - 이 오류 코드는 주로 Visual C++ Redistributable 패키지가 누락되었거나 손상된 경우 발생할 수 있습니다. MySQL Server는 Visual C++ 라이브러리에 의존하는 경우가 많습니다. - MySQL 9.1 버전에 필요한 Microsoft Visual C++ Redistributable 패키지를 설치합니다. 일반적으로 [Microsoft Visual C++ 2015-2022 Redistributable](https://aka.ms/vs/17/release/vc_redist.x64.exe) 버전을 설치하면 문제가 해결될 수 있습니다.3. Windows Event Viewer 로그 확인: - 윈도우 이벤트 뷰어 (Event Viewer)를 열고, Windows Logs -> Application 항목을 확인하여 MySQL과 관련된 추가 오류 로그가 있는지 확인해 보세요. 여기서 발생 원인에 대한 더 상세한 정보를 얻을 수 있습니다.4. my.ini 설정 확인: - my.ini 설정 파일에 문제가 있을 수 있습니다. 특히, 특정 설정이 OS나 환경과 충돌을 일으킬 수 있습니다. 예를 들어, lower_case_table_names=1 설정이 원인이 될 수 있으니 일단 해당 설정을 제거한 후 다시 시도해 보세요. - 또한, --initialize-insecure 옵션 대신 --initialize 옵션을 시도해 보거나, --console 옵션을 제거하고 실행해 보는 것도 방법입니다.5. MySQL 이전 버전 사용 시도: - MySQL 9.1이 현재 사용하는 환경과 호환성 문제가 있을 수 있습니다. MySQL 8.x 또는 MySQL 5.7과 같은 안정적인 버전을 설치해 보시는 것도 방법입니다.위의 방법들을 하나씩 시도해 보신 후에도 문제가 지속된다면, 추가 로그를 바탕으로 더 상세히 확인해 보도록 하겠습니다.감사합니다. 잔재미코딩 드림
- 0
- 2
- 60
질문&답변
2024.11.01
서브쿼리를 JOIN으로 바꾸기
안녕하세요. 답변 도우미입니다.현재 JOIN 쿼리에서 WHERE 조건이 잘못되어 원하는 결과가 나오지 않고 있습니다.기존 WHERE 절 조건에서는 fc.category_id > (c.name = 'Comedy')로 되어 있는데, 이 조건은 SQL에서 논리적으로 잘못된 방식입니다. (c.name = 'Comedy')는 불리언 값으로 처리되어, 모든 category_id에 대해 불리언 비교가 이루어지기 때문에 올바른 필터링이 되지 않습니다.해결 방법JOIN을 사용하면서, Comedy라는 이름을 가진 category_id보다 큰 category_id만 선택하려면, 먼저 Comedy의 category_id를 가져와서 그 값보다 큰 category_id를 필터링해야 합니다. 이를 위해서는 서브쿼리로 Comedy의 category_id를 가져와 직접 비교하는 방식을 사용해야 합니다.수정된 쿼리 예시아래와 같이 Comedy의 category_id를 구하는 서브쿼리를 WHERE 절에서 활용하면 원하는 결과를 얻을 수 있습니다.SELECT fc.category_id, COUNT(*) AS film_count FROM film_category fc JOIN category c ON fc.category_id = c.category_id WHERE fc.category_id > ( SELECT category_id FROM category WHERE name = 'Comedy' ) GROUP BY fc.category_id;쿼리 설명JOIN을 통해 film_category 테이블과 category 테이블을 연결합니다.WHERE 조건에서 fc.category_id가 Comedy의 category_id보다 큰 항목만 선택하도록 합니다.GROUP BY로 category_id 별 COUNT를 수행하여 결과를 집계합니다.예상 결과위와 같은 쿼리를 실행하면 Comedy 카테고리보다 큰 category_id에 해당하는 영화 개수(film_count)를 정확히 얻을 수 있습니다.감사합니다. 잔재미코딩 드림
- 0
- 1
- 29
질문&답변
2024.10.29
skill
안녕하세요. 우선 불편을 드려 죄송합니다. AI 가 자동 답변을 하여서, 제가 새로운 문의가 있는지를 놓쳤습니다.해당 데이터도 수업자료 다운로드에 업로드하였습니다. 관련 데이터를 다운받으시면 sakila 데이터베이스 SQL 파일들을 확인하실 수 있으실꺼예요.추가로 다음 강의를 다시 한번만 확인해보시면 파일이 두개 있습니다. 하나는 스키마를 만드는 파일이고, 또다른 하나는 해당 스키마에 데이터를 넣는 파일입니다. 화면 상으로 보았을 때, 왠지 스키마만 만드신 것 같아요. 새로 다운받으신 자료와 함께 다음 영상 후반부를 꼭 한번만 봐주시면서 따라해보시면 바로 정상동작하실 것 같습니다.MySQL Workbench 기본 사용법과 데이터 셋업 가이드혹시 관련하여 또다른 문제가 있다면, dream@fun-coding.org 로 알려주시면 또 바로 가이드드리겠습니다. 감사합니다.
- 0
- 3
- 77
질문&답변
2024.10.27
특별한 형태의 javascript배열에서
안녕하세요. 답변 도우미입니다.코드에서 console.log(data3[0][0]); 부분이 예상한 결과를 출력하지 않는 원인은 JavaScript에서 배열 또는 객체가 정의된 후 특정 위치의 데이터에 접근할 때 일반적으로 데이터가 제대로 초기화되지 않았거나 해당 위치에 값이 없을 때 발생할 수 있는 문제입니다. 이 경우 원인으로 다음 사항들을 확인해 볼 수 있습니다.1. 초기화 확인만약 data3의 [0][0] 위치에 데이터가 정확하게 할당되지 않았다면, console.log로 접근 시 아무런 결과가 출력되지 않거나 에러가 발생할 수 있습니다. 하지만 [0][1], [0][2]는 정상적으로 접근이 되므로, 배열을 선언하고 초기화하는 과정에 문제가 있을 가능성이 큽니다.2. 개발 환경 캐시 이슈코드를 실행하는 개발 환경(예: 브라우저 콘솔, IDE 콘솔 등)에서 캐시가 문제가 될 때 특정 값이 누락될 수 있습니다. 이 경우, 환경의 캐시나 버퍼링 문제가 원인이 될 수 있으며, 캐시를 지우고 다시 실행해보는 것도 하나의 방법입니다.3. 구조적인 문제위 코드에서 data3[0][0]에 접근 시 아무런 결과가 나타나지 않는 경우, 일부 JavaScript 엔진에서 발생하는 버그일 수도 있으며, 콘솔이 결과를 누락하는 경우도 드물게 발생합니다. 이런 경우 다른 콘솔로 확인해보는 것도 도움이 됩니다.문제 해결 방법코드 실행 전 캐시와 실행 환경을 초기화합니다.console.log(data3); 또는 console.log(data3[0]);와 같은 방식으로 배열 전체 또는 부분을 출력하여 구조를 한 번 더 확인합니다.예시아래 코드를 통해 배열이 정상적으로 초기화된 상태인지 확인할 수 있습니다.const data3 = [ [1, 2, 3], [4, 5, 6], ]; console.log(data3); // 배열 전체 확인 console.log(data3[0]); // 첫 번째 배열 요소 확인 console.log(data3[0][0]); // 첫 번째 배열의 첫 번째 요소 확인이렇게 확인하면 data3[0][0]가 1로 출력되는지 확인할 수 있습니다.감사합니다. 잔재미코딩 드림
- 0
- 1
- 21