묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결김영한의 실전 데이터베이스 - 기본편
애플리케이션 코드 관리
안녕하세요 스승님!질문드립니다! 데이터 정합성을 위한 확인 절차는 front, back, DB에서 3중으로 처리하는게 좋은가요? 아니면 애플리케이션 레이어에서 처리하는게 좋을까요? (3중으로 하면 처리가 빠르고 정확할 수 있다는 장점이 있지만 처리 조건이 변경되는 경우 3군데에서 모두 변경이 있어야한다는 점이 꽤 번거로울 것 같습니다...)이후 설계에서 다뤄주시겠지만, 1:1 관계의 테이블로 연결된 두 테이블에서 FK에 UNIQUE 제약을 거는게 일반적인지도 궁금합니다.매번 덕분에 성장하고있슴다!감사합니다!
-
미해결김영한의 실전 데이터베이스 - 기본편
SELECT 절에서 CASE문을 사용한 이후, ORDER BY 절에서도 동일한 CASE 문을 사용하는 경우
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 대상 위치]강의 영상:03:00 지점강의록:6. CASE 문.pdf - CASE 문 기본2 - CASE 문과 사용 위치[질문 내용]안녕하세요, 영한님.다음과 같이 'SELECT 절에서 사용한 CASE 문을 그대로 복사-붙여넣기 해서 ORDER BY 절에서 사용(THEN 결과는 1, 2, 3으로 변경)' 하셨는데요(아래 코드. 방법1).ORDER BY CASE WHEN price >= 100000 THEN 1 WHEN price >= 30000 THEN 2 ELSE 3 END ASC 실습하던 중 아래 코드(방법2)와 같이 'SELECT 절에서 정의한 컬럼 별칭(price_label)과 THEN 값('고가', '중가', 저가')을 이용'해서 정렬할 수도 있겠다고 생각해서 시도해봤고, 실행이 성공하여 영한님 코드와 동일한 결과가 나왔습니다.ORDER BY CASE WHEN price_label = '고가' THEN 1 WHEN price_label = '중가' THEN 2 WHEN price_label = '저가' THEN 3 END ASC 이때 자바와 같은 프로그래밍 언어 입장에서 보면 방법2의 경우가 'SELECT 절의 CASE 문 로직이 바뀌더라도 ORDER BY 절의 CASE 문 로직은 변경할 필요가 없으므로' 유지보수성 측면에서 더 좋겠다고 판단했습니다. 그런데 다음과 같은 반론(?)도 생각나더라구요.(애플리케이션 로직과 달리) 쿼리 문은 엄청나게 길고 복잡해질 가능성이 적으므로, 그냥 방법1처럼 복사-붙여넣기 해서 써도 무방하다.오히려 ORDER BY 절의 CASE 문을 새롭게 작성하는 과정에서 오타가 발생하여 오류를 일으킬 위험이 존재하니, 그냥 방법1처럼 복사-붙여넣기 해서 써도 무방하다.간단한 쿼리의 경우 ORDER BY 절의 CASE 문을 새롭게 작성하는 데에 비교적 많은 시간이 소모되는 비효율성이 존재하니, 그냥 방법1처럼 복사-붙여넣기 해서 써도 무방하다.이에 대해서 영한님의 의견은 어디에 가까우신가 의견 여쭙고 싶어서 글 남깁니다!
-
미해결강의 하나로 끝내는 백엔드 모든 지식!
PDF로 내보내기 기능 활성화 부탁드립니다.
안녕하세요! 강의를 이제 시작하려고 하는데, 노션에 PDF 내보내기 기능 활성화 부탁드려도 될까요? ctrl + P 를 눌렀을때 잘리는 부분이 있어서 그렇습니다ㅠ
-
해결됨김영한의 실전 데이터베이스 - 기본편
[수정 건의] 문제3의 실행 결과
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요, 영한님. 중요한 내용은 아니지만, 강의자료 개선에 조금이나마 도움이 될까 해서 글 남깁니다.요약: 문제3의 [실행 결과]의 행 순서를 변경하는 것을 제안합니다. 본론:문제3: 회사 주요 이벤트 타임라인 만들기의 경우 '최신 이벤트가 가장 위에 오도록 내림차순으로 정렬'할 것을 요구하고 있습니다. 현재 강의록의 [실행 결과]에는 다음 사진과 같이 고객 가입 이벤트가 모두 상품 주문 이벤트 보다 아래에 위치하고 있고, "고객 가입 이벤트의 날짜는 쿼리 실행 시점의 created_at 값에 따라 달라질 수 있다" 고 명시되어 있습니다. 수강생들이 위 사진만 얼핏 보고 섣불리 접근한다면, "(고객 생성 일시)가 쿼리 실행 시점에 따라 달라지기는 하지만, 그래도 모든 상품 주문 이벤트 이후에 위치하는게 올바른 결과겠구나"라고 판단할 위험이 있다고 생각해서 다음과 같이 수정하면 어떨까 의견을 제시합니다.수정 이후: 모든 고객 가입 이벤트 행이 모든 상품 주문 행보다 위에 위치. 즉, 현재 [실행 결과]에서 두 이벤트의 위치를 맞바꿈. 수정 제안에 대한 근거는 다음과 같습니다.예제 데이터를 삽입할 때 users.created_at 컬럼의 경우 DEFAULT CURRENT_TIMESTAMP로 추가했음.수강생은 강의 오픈 날짜인 2025-08-01 이후에 쿼리를 실행하는 것이 보장되기 때문에 users.crated_at 컬럼의 값 또한 마찬가지로 보장됨.상품_주문 이벤트의 이벤트_날짜 중 가장 최근은 2025-06-17로 강의 오픈 날짜보다 이전임. 따라서 모든 상품_주문 이벤트 또한 마찬가지로 보장됨.따라서 모든 users.created_at 데이터는 orders.order_date보다 최근임이 보장됨. 아래 사진은 참고용으로, 수강생인 제 경우의 실행 결과입니다. 위에서 설명한 바와 같이 고객 가입 이벤트가 항상 상품 주문 이벤트보다 그 시점이 최근임을 확인할 수 있습니다.
-
해결됨김영한의 실전 데이터베이스 - 기본편
코드성 테이블과 캐시에 대한 질문
안녕하세요, 영한님. 다른 수강생 분의 질문 글에 남겨주신 답변에다가 제 질문을 작성했는데 혹시 이에 대한 알람은 가지 않을까봐 질문글을 따로 올리고, 아래에 그 링크를 첨부하도록 하겠습니다..!!(현재 글은 추후 자체 삭제 예정입니다)질문 글 링크https://inf.run/Rywjc
-
해결됨김영한의 실전 데이터베이스 - 기본편
실무에서 인덱스 설계는 보통 개발 어느 시점에 진행하나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]영한님이 제시해주신 가이드라인을 보면서'모든 기능 요구사항을 기본적으로 구현한 후, 작성된 쿼리를 전반적으로 훑어보면서 인덱스를 설계' 하는 것이 가장 효율적일 것이라고 생각이 들었는데요.영한님은 실무에서 인덱스 설계는 보통 개발 어떤 시점에 진행하시는지 궁금합니다.
-
미해결김영한의 실전 데이터베이스 - 기본편
서브쿼리 메인쿼리 논리적 순서
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강의에서 서브쿼리가 먼저 실행된다고 설명해주셨는데, 그럼 메인쿼리 입장에서는 WHERE절이 먼저 실행되는거 아닌가요? 메인쿼리 입장에서는 FROM절 -> WHERE절 실행이니까 FROM먼저 실행되고, 그 다음에 서브쿼리(서브쿼리 내에서도 논리적 실행 순서 동일)가 실행되는건지 아니면 서브쿼리 즉 메인쿼리 입장에선 WHERE절이 먼저 실행되는건지 궁긍합니다.
-
해결됨Real MySQL 시즌 1 - Part 1
ep12. (2) LEFT JOIN 사용 방법 준수 - 오타 질문
안녕하세요(2) LEFT JOIN 사용 방법 준수 - 오타 질문 (3:58 부근) 에서 첫 번째 SQL이 아래와 같이 써있는데요 select u.id, u.name, ua.value from user u left join user_attribute ua on ua.user_id=u.id where ua.name='address' where 조건에 ua.name이 아니고, ua.value가 아닐까 의미적으로 맞는게 아닌가 싶어서 질문드립니다. 전체 스키마가 있는게 아니다보니 제가 오해한 걸수도 있어서, user, user_attribute 테이블 전체 스키마를 주시면 감사하겠습니다!
-
해결됨Real MySQL 시즌 1 - Part 1
ep.12 count(*) 질문
안녕하세요, count(1) 대신 count(*)을 쓰라고 하셨는데요, count(1)이 성능이 더 좋다고 알고 있는데 제가 잘못 알고 있는 부분일까요? 성능적인측면에서도 답변 부탁드리면 감사하겠습니다~
-
해결됨김영한의 실전 데이터베이스 입문 - 모든 IT인을 위한 SQL 첫걸음(SQL부터 차근차근)
문제5번 - 함수 코드 중복 방지를 위한 방법 중 서브쿼리와 CTE의 차이
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]질문이 서론과 본론으로 구분되어 있으며, 실제 질문 내용은 본론에 있습니다! 서론안녕하세요 영한님.문제5번에서는 SUBSTRING_INDEX(email, '@', 1) 함수를 user_id와 id_length에서 두 번 반복해서 사용하게 됩니다.중복 문제를 개선하기 위해 초기에는 다음과 같이 CHAR_LEGNTH(user_id) AS id_length로 시도를 했으나 실패했습니다. -- 에러 발생 코드 SELECT email, SUBSTRING_INDEX(email, '@', 1) AS user_id, CHAR_LENGTH(SUBSTRING_INDEX(user_id) AS id_length FROM customers ;그 이유는 SELECT 절의 모든 표현식이 논리적으로 동시에 평가되기 때문이라고 판단했고, 이를 해결하기 위한 방법 중 서브쿼리와 CTE(Common Table Expression) 방식을 찾았고 이를 직접 적용해봤습니다. -- sol1. 서브 쿼리 SELECT email, user_id, CHAR_LENGTH(user_id) AS id_length FROM (SELECT email, SUBSTRING_INDEX(email, '@', 1) AS user_id FROM customers ) AS dt ;-- sol2. CTE WITH email_parts AS ( SELECT email, SUBSTRING_INDEX(email, '@', 1) AS user_id FROM customers ) SELECT email, user_id, CHAR_LENGTH(user_id) AS id_length FROM email_parts; 본론이 과정에서 "서브 쿼리와 CTE의 성능 차이가 있는가?"에 대한 의문이 들어서 리서치를 했으나 제 수준이 부족한 탓인지 이에 대한 명확한 답변을 찾지 못했는데요(현재 '상황에 따라 다르다' 수준으로만 이해한 상태입니다).혹시 실무에서는 서브 쿼리와 CTE 중 (성능, 가독성, 개발팀 관례 등의 이유로 인해) 무엇을 선호하는지 의견을 들을 수 있을까 싶어 질문 남깁니다!혹시 다음 강의에서 다루는/다룰 내용이라면 제가 추후에 해당 강의를 들을 때 학습하도록 하겠습니다!
-
미해결김영한의 실전 데이터베이스 - 기본편
중복제거
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]풀이 시간에SELECT distinct u.name, u.email FROM users u JOIN orders o on u.user_id = o.user_id WHERE o.quantity > 1;한 번의 주문으로 상품을 2개 이상 구매한 고객의 쿼리는 중복제거를 해주셨는데요,SELECT u.name AS 고객명, u.email AS 이메일 FROM users u JOIN orders o on u.user_id = o.user_id JOIN products p on o.product_id = p.product_id WHERE p.category = '전자기기''전자기기' 카테고리 상품을 한 번이라도 구매한 고객은 중복제거를 해주지 않았더라구요. 하나의 그룹에 고객이 두명이 나오는 게 이상해서이 경우 distinct 혹은 GROUP BY u.name, u.email을 추가해주어 중복제거 해주면 될까요? distinct 와 GROUP BY 중 어떤걸 사용하는 게 더 좋을까요? 집계함수를 사용하지 않으니 distinct가 더 나을까요?
-
미해결김영한의 실전 데이터베이스 - 기본편
아우터 조인 기준 테이블 우선순위
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]안녕하세요, 영한님.강의를 수강하던 중 아우터 조인과 관련하여 고민이 생겨 질문드립니다. 아우터 조인의 기준 테이블은 질문의 의도에 따라 선정해야 함을 배웠습니다. 그러나 LEFT JOIN 사용의 편의성과 1:N 관계에서 발생하는 행 중복을 피해야 한다는 원칙이 서로 충돌하는 상황에서 어떤 기준을 우선하여 테이블을 선정해야 할지 판단이 서지 않아 문의드립니다. 이 두 가지 원칙이 상충될 때, 어떤 기준으로 우선순위를 결정하고 쿼리를 설계해야 하는지 영한님의 실무 팁에 대해서 바쁘신 와중에 답변해주시면 진심으로 감사하겠습니다.
-
미해결김영한의 실전 데이터베이스 입문 - 모든 IT인을 위한 SQL 첫걸음(SQL부터 차근차근)
order 테이블 생성이 안되네요
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]스크린샷과 쿼리문은 다음과 같습니다..CREATE TABLE orders ( order_id INT AUTO_INCREMENT PRIMARY KEY, customer_id INT NOT NULL, product_id INT NOT NULL, quantity INT NOT NULL, order_date DATETIME DEFAULT CURRENT_TIMESTAMP, status VARCHAR(20) NOT NULL DEFAULT '주문접수', CONSTRAINT fk_orders_customers FOREIGN KEY (customer_id) REFERENCES customers(customer_id), CONSTRAINT fk_orders_products FOREIGN KEY (product_id) REFERENCES products(product_id));
-
미해결김영한의 실전 데이터베이스 입문 - 모든 IT인을 위한 SQL 첫걸음(SQL부터 차근차근)
ifnull()과 default 차이
ifnull(인자1, 인자2) 은 인자1이 null이면 인자2를 값으로 사용한다고 설명하셨는데요.이것을 보고 생각나는 것이 테이블 생성시에 필드에 지정하는 default 가 생각나는데요.이 default도 필드 값이 null이면 지정한 default값을 사용하는데 그렇다면 ifnull()과 default의 차이점은 뭔가요?당장 제 수준에서 생각나는건 ifnull()은 매 쿼리 작성할때 기본값을 유연하게 변경할 수 있다? 이정도일 것 같은데이것말고 특별한 차이점 같은 것이 있을까요?
-
미해결김영한의 실전 데이터베이스 - 기본편
섹션3. 조인2 - 외부 조인과 기타조인 / 문제와 풀이2 강의 문의
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요~문제와 풀이2의 문제2(모든 상품 옵션 조합에 재질 추가하기)에서 선생님 실행 결과가 (사이즈) S -> M -> L -> XL 순서로 나오던데요, 제 생각에는 기본 문자열 정렬이라면 L -> M -> S -> XL 순서가 맞는 것 아닌가요? 혹시 제가 놓친 부분이 있을까요?
-
해결됨김영한의 실전 데이터베이스 - 기본편
배치 처리 방식과 파이프라인 처리 방식
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]안녕하세요 영한님! 데이터베이스 입문/기본편 강의에서 GROUP BY, 집계함수, CASE 문 등을 배우고 공부하면서, DBMS에서 레코드를 읽고 표현식을 처리하는 내부 과정에 대해 관심을 갖게 되었습니다.이번 강의에 조건부 집계 같은 나름 복잡한? 쿼리를 이해하려고 노력하면서 몇 가지 궁금증이 떠올랐습니다. 질문1) 배치 처리 방식 vs 파이프라인 처리 방식영한님의 자바 고급편 강의에서, 데이터 요소들의 처리하는 방식에는 파이프라인 방식과, 배치 처리 방식이 있다고 하셨던 부분이 떠올랐습니다. 데이터베이스 쿼리의 논리적 순서는 FROM -> WHERE -> (GROUP BY -> HAVING -> ) SELECT -> .... 과정으로 이뤄지는데, 실제 DBMS에서는 FROM 절 -> WHERE 절 배치처리 -> SELECT 절 배치처리 이런 과정으로 이뤄지는지,아니면 레코드 하나를 단위로 FROM -> WHERE -> SELECT 파이프라인을 거쳐 처리가 되는 것인지 궁금합니다.질문 2) GROUP BY와 집계 함수 처리 시점COUNT()나 SUM()과 같은 집계함수는 select 절에 존재하고, 쿼리의 논리적 순서에 따르면 GROUP BY 다음 SELECT 절이 실행되는데요. (HAVING 제외) 실제로는 GROUP BY를 실행하면서 SELECT 절에서 필요한 집계 값을 누적시키는지,아니면 특별한 자료구조에 그룹별로 레코드를 모아두고 SELECT절 수행 시점에 집계함수 값을 얻어내는건지 궁금합니다.
-
미해결김영한의 실전 데이터베이스 - 기본편
잡담
[질문 내용]4:13초에 아잇아아아잇 이런 인간적인 모습까지 ㅋㅋㅋㅋ 당황하시는 모습에 빵터졌네요 ㅋㅋㅋㅋㅋ 이런 거 편집 안해주셔서 감사합니다ㅋㅋㅋㅋㅋㅋㅋ
-
미해결김영한의 실전 데이터베이스 - 기본편
문제4 - orders를 기준으로 할 경우
1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]users 말고, orders 기준으로 쿼리를 작성 중인데요 여기서 봉착한 난관이... 주문 기록이 없다면, null로 표현되는 부분을 어떻게 풀어나가야 할지 모르겠어서 문의드립니다ㅠㅠSELECT u.name as user_name, p.name as product_nameFROM orders AS oLEFT JOIN users AS u ON o.user_id=u.user_idLEFT JOIN products AS p ON o.product_id=p.product_idORDER BY u.name, p.name;
-
미해결김영한의 실전 데이터베이스 - 기본편
외부조인2 - 실습2 - is NULL
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]외부 조인2강 - 실습2 관련 질문입니다!SELECT *FROM products AS pLEFT JOIN orders AS o ON p.product_id = o.product_idWHERE o.product_id is NULL; WHERE 절에 o.order_id is NULL로 작성해주셨는데, 위와 같이 WHERE o.product_id is NULL; 써도 괜찮은 걸까요?
-
미해결중고급 SQL과 실전 데이터 분석 101 문제 풀이
where 컬럼에 함수를 적용하는건 좋지 못하다고 들었습니다.
강의 연습문제 where 컬럼에 함수를 래핑해서 조건을 만족하는 문제를 보았는데요, 테이블 행수가 적을 땐 문제가 안된다고 들었는데, 행 수가 많을때는 컬럼에 함수를 래핑하면 인덱스 적용 불가 및 모든 컬럼에 함수를 적용해야해서 성능이 안좋아진다고 들었는데, 선생님의 의견 궁금합니다.