소개
<기획자의 SQL> 저자 - 인사이트
데이터 엔지니어 및 분석가 현업 재직 경험 보유 (SSG.COM, 크몽, 놀이의발견)
SQL 출강 경험 다수 (다수의 기업 및 개인 대상)
강의
수강평
- [개념반]배워서 바로 쓰는 SQL 쿼리
- [입문반]서버와 인터넷 그리고 데이터 이야기
게시글
질문&답변
리밋 입력 시 에러
안녕하세요 tori061211님답변이 늦어 죄송합니다. 실습 환경인 w3school 내에서 일부 쿼리 기능이 막힌 것으로 보이는데요, LIMIT도 그 중 하나인 것 같아요. 수강생 분들을 위한 개별 실습공간을 따로 만들었습니다. LIMIT도 정상 동작하는 것으로 확인해서 아래의 url을 통해 접속하셔서 실습 진행해주시면 될 것 같습니다. 링크:https://easysqls.w3spaces.com/감사합니다.
- 0
- 2
- 432
질문&답변
쿼리 작성시 작은 따옴표와 큰 따옴표
안녕하세요! 아래에 인프런 인턴이 답변을 이미 작성해줬네요..?!아래에 나온 내용을 참고해주시면 될 것 같은데요, 작은 따옴표와 큰 따옴표 둘 다 문자열(String)을 표현하기 위해 동일하게 사용된다고 봐주시면 돼요. 따라서 둘 다 동일하게 사용하실 수 있는데요 가독성을 위해서는 일관성 있게 사용해주시는게 좋습니다. 다만 일부 DB에 따라서 사용 가능한 따옴표 종류가 지정되어있는 경우도 있기 때문에 데이터베이스에 따라 사용가능한 따옴표를 파악하고 사용해주시면 됩니다. :)
- 0
- 2
- 4.7K
질문&답변
SQLD 자격증 관련 질문
안녕하세요 :) SQLD 시험에 나오는 SQL을 해석하는 유형의 문제나 기본적인 SQL 이론을 이해하는 데에도 쿼리지식이 기반이 되는 것은 맞지만, 본 강의는 SQL 활용에 초점을 두고 있기 때문에 DB관련한 이론과 지식 내용이 포함되어있는 SQLD 시험 대비를 위해서는 추가로 해당 시험에 나오는 유형들을 준비하셔야 할 것으로 보입니다. 이외에 질문 있으시면 편하게 알려주세요. 감사합니다.
- 0
- 1
- 348
질문&답변
PK 컬럼에 대한 DISTINCT 적용
안녕하세요 reinsaz님 질문주셨는데 오래 기다려주셔서 감사합니다. 위의 PK를 대상으로 count를 하는 부분에 대해서 질문을 주셨는데요, 이 부분에 대해서는 단일 테이블이 아닌 상황을 생각하고 말씀드린 것으로 봐주시면 좋을 것 같아요. 강의 내에서 설명이 부족했던 것 같아 부연 설명을 남깁니다. 말씀대로 단일 테이블 내의 PK는 중복되지 않고 null을 허용하지 않기 때문에 테이블 내의 무결성이 확보되었다면 PK의 수 = 전체 row의 수인 것이 맞습니다. 그렇기 때문에 count(*)를 하거나 count(distinct PK)를 하거나 동일한 결과를 보실 수 있을거에요. 실무에서 지표를 추출할 때에는 1:N관계 등의 여러 테이블과 JOIN을 수행하게 되면서 원천 데이터가 PK를 포함하여 중복이 생기는 상황이 발생하는데요, 이 때에 count(distinct PK)를 통해 이러한 중복을 제거하고 추출하고자 하는 지표의 원래 의미에 가장 부합하는 PK 컬럼을 중복없이 카운트해주어야 한다는 의미로 받아들여주시면 좋겠습니다. 추가로 COUNT(DISTINCT PK)COUNT(PK)COUNT(*)각각의 의미에 대해서 질문을 남겨주셨었는데요,count(*)의 경우에는 대상 테이블이 되는 테이블의 모든 행 수를 반환하게 됩니다.count는 각 행에 주어진 인풋값이 할당된 횟수를 보여주는 것이기 때문에 count(1)도 동일하 결과를 보여줍니다.count(PK)도 위와 동일하게 PK라는 컬럼의 모든 카운트 값을 반환해주지만, null값의 경우에는 카운트를 하지 않으며 중복은 제거하지 않습니다.count(distinct PK)의 경우에는 위의 count(PK)와 동일하지만 중복값을 제외하고 카운트해줍니다.이외에 해결되지 않은 부분 있으면 질문 또 남겨주세요.감사합니다.
- 0
- 1
- 522
질문&답변
질문드립니다.
안녕하세요 :)실습환경에서의 like 연산자의 경우에는 대소문자를 구문하지 않는 case insensitive한 조건이 디폴트 값으로 설정 되어있습니다. 실습에 참고 부탁드립니다.저희 실습환경은 모의환경이다 보니 실제 디비환경과는 다를 수 있는데요, 만약 대소문자 구분이 되는 case sensitive한 조건을 설정하고 싶으신 경우 사용하시는 디비에 따라 지원하는 함수가 있는지, 혹은 case sensitive하게 바꿔주는 Syntax가 있는지 등을 확인하시어 적용해주시거나 원래 컬럼값을 대소문자 변경해주는 함수등을 통해 적절히 정제하여 사용해주시면 될 것 같습니다.
- 0
- 1
- 271
질문&답변
질문드리겠습니다.
안녕하세요 :) 혹시 실행 환경을 여쭤볼 수 있을까요?제가 강의한 환경은 크롬 브라우져를 통해 해당 사이트 접속해서 진행했었는데간혹가다 다른 브라우져의 경우 쿼리 해석 조건이 달라지는 경우를 종종 확인하곤 합니다. 실행환경 알려주시면 좀 더 빠른 확인 가능할 것 같습니다. + 소문자로도 크롬 브라우져 상에는 정상실행이 확인돼요. (사진)
- 0
- 1
- 278
질문&답변
질문드리겠습니다.
안녕하세요 :)질문 감사합니다. in에 해당하는 and 조건의 다중 조건 필터링을 질문 주신 것으로 이해했는데요, 잠시 생각해보면 and 조건을 여러개 사용해야 하는 경우는 의미가 없다는 것을 알 수 있습니다. or의 경우는 둘 중 하나라도 참인 경우를 반환하기에 다중 조건이 가능한데요, 한 개의 컬럼에 대한 and 조건은 사실상 의미가 없어집니다. 여러 개의 컬럼이 아닌 한 개의 컬럼 내의 값은 1개 값만 가지고 있기 때문에 A 와 B를 모두 만족하는 값이 없기 때문이에요.
- 0
- 1
- 321
질문&답변
질문드리겠습니다.
안녕하세요 :)질문 감사합니다. 1968-12 년도는 employees 테이블의 가장 첫줄에 등장하는 사원의 생일값이에요. (사진)그루핑을 하지 않고 집계연산을 사용할 경우, DB에 따라 집계연산 사용을 막거나 가장 처음 값을 출력해주곤 합니다. (그루핑과 보통 같이 사용하는 것이 일반적인 용법이에요) 그루핑이 어떻게 작동하는지 살펴보면 이해에 도움이 되는데요, GROUP BY를 사용할 경우 해당 절에 설정해준 값을 기준으로 컴퓨터가 여러개의 주머니를 만들기 위해 해당 컬럼을 처음부터 끝까지 탐색하게 됩니다. 하지만 GROUP BY를 설정하지 않은 경우 birthdate 컬럼의 맨 처음에 등장한 값을 반환하는 것이죠. 그래서 이 경우는 해당 1968-12 값은 대표 기준값이 아닌 단순히 컴퓨터가 맨 처음 값을 반환한 값으로 봐주시면 됩니다.
- 0
- 1
- 269
질문&답변
count(distinct) 구문 오류 질문드립니다.
안녕하세요 지은님, 시간써서 질문 남겨주셔서 감사합니다.ORDER BY가 작동하지 않는 것과 LIMIT이 작동하지 않는 두 가지로 질문 주신 것으로 이해하고 답변을 남길게요. 1.ORDER BY가 작동하지 않는 원인은, ORDER BY절 내에서는 count.. 등의 함수를 사용할 수가 없기 때문입니다. 아래 방법을 단계별로 따라 주시면 좋을 것 같은데요,--> count(distinct CustomerID) 뒤에 as cnt 등으로 원하는 별칭을 설정해주신 뒤--> ORDER BY cnt 로 다시 정렬 수행--> (혹은) ORDER BY 2 와 같이 컬럼 순서에 해당하는 값을 설정하여 정렬(사진)(사진)아마 GROUP BY에서 count 함수를 작성해도 작동이 되는 것을 보셨거나, 컬럼명과 동일한 개념으로 그대로 count(distinct CustomerID)를 작성해주셨을 수 있을 것 같은데요, ORDER BY절에서는 함수명, 혹은 as를 통해 별칭으로 설정해준 명칭, 컬럼의 인덱스(순서)를 통해서만 컬럼 정렬이 가능합니다. 그리고 그 원인은 컴퓨터가 SQL을 실행하는 순서와 연관이 있습니다. 아래를 참고해주시면 이해에 도움이 될 것 같아요. SELECT … ⑤ FROM … ① WHERE … ② GROUP BY … ③ HAVING … ④ ORDER BY … ⑥위와 같이 SELECT 절은 FROM > WHERE > GROUP BY를 거치며 로우 데이터를 모으고 필터링하고 그루핑해서 연산을 할 준비를 하게 됩니다. 그리고 그 이후에 SELECT이 실행되면서 저희가 작성해주었던 count() 등의 함수들이 실행되고 계산값이 나오게 됩니다. 저희 예시에서는 GROUP BY를 국가별로 지정을 해주었으니 여기서는 국가별 회원수 카운팅이 이 지점에서 이루어집니다.ORDER BY가 실행되는 순서는 바로 이 다음인데요, 이미 SELECT절이 실행되면서 컴퓨터의 자원을 써서 다 계산해둔 상태이기 때문에 컴퓨터는 이미 나온 결과값을 정렬하는 작업만을 할 수 있도록 SQL상 설계가 되어있습니다.count(distinct CustomerID)를 ORDER BY에 넣어줄 경우 만약 이게 실행이 가능하다면 이미 SELECT절에서 계산한 값들을 단지 정렬을 위해서 컴퓨터가 다시 계산을 해줘야 합니다. 중복 연산이 발생하게 되는 것이죠. 이런 연산 낭비를 방지하기 위해서 ORDER BY에서는 위와 같이 컬럼명/별칭/인덱스만 사용할 수 있도록 되어있습니다. 이 셋 중 하나를 넣어주시면 잘 작동할거에요. 2혹시 싶어 LIMIT의 경우에는 방금 테스트를 해보았는데 일단은 실습환경 사이트에서는 작동을 하는 것으로 보입니다.(사진) LIMIT을 작성해주신 순서나, 사이트 환경이 다른 것일까 싶은데요, LIMIT이 작동하지 않는다고 말씀주신 해당 쿼리를 공유해주실 수 있을까요?쿼리 공유주시면 확인해보도록 하겠습니다 :) 감사합니다.
- 0
- 1
- 642
질문&답변
group by
예은님 안녕하세요? :)고민하셨던 질문 남겨주셔서 감사합니다. 1번 질문group by 챕터에서 알려준대로 실행했을 때 궁금증이 생겼는데요, group by를 안 쓰고,select country, count(*) from customers ;위와 같이 쓰면 germany 91로 나오는 데 수 많은 나라 중 독일만 나오는 건 왜일까요? (GROUP BY랑 where이랑 차이점을 모르겠어요. ) 이유만 먼저 말씀드리면 독일(Germany)에 해당하는 row가 가장 먼저 등장했기 때문입니다.아래 이미지를 한번 볼까요? 먼저 group by를 빼고 작성한 쿼리의 결과값입니다.(사진)count(*)의 경우에는 전체 row의 값인 91건을 출력하고 있지만 country는 germany만 출력되고 있습니다. 다시한번 원래 customers 테이블의 rows들을 보면은 아래 이미지와 같습니다. (사진)맨 첫번째 row의 country값이 Germany인 것을 확인할 수 있습니다. Group By와 Count가 어떻게 작동하는지 한번 다시 생각해보면 왜 Germany만 나왔는지 알 수 있습니다.Count는 Aggregate Function로 집계함수의 한 종류에요. 즉, 여러줄의 row를 집계하여 결과를 출력해주는 역할을 해주기 때문에 기본적으로 결과값을 1개로 요약하려는 성질을 가지고 있습니다. 우리가 뭔가를 세거나 할 때 결과값은 하나인 것 처럼요 (학교의 총 학생수 30명, 제품의 총 갯수 382개...) Group By는 이러한 집계함수와 함께 쓰여 집계출력값을 각 기준별로 여러개를 출력할 수 있도록 해주는 역할을 해줍니다. 학교의 학생수가 30명인데, 그 중 한국 학생, 해외학생.. 별로 카운트를 하고 싶다면 그루핑을 지어서 묶어주는 것이죠. (학교의 한국 학생 19명, 해외 학생 11명..) 그렇기 때문에 group by를 제외하면 count는 customers 테이블의 전체 회원에 대하여 row의 갯수를 세려고하게 됩니다. 그런데 쿼리에서 Select절에서 Country를 출력하도록 했지만 Country는 1개가 아니기 때문에 여기서는 컴퓨터가 테이블을 읽을 때 가장 먼저 발견한 1행의 Country값을 단순 출력만 해주고 있는 것이죠.이러한 결과는 사실 큰 의미가 없는 결과입니다. 독일에 살고있는 회원 수가 91건이 아니니까요. 그래서 우리 모의쿼리환경에서는 실행이 되고는 있지만 원천적으로 이러한 쿼리가 막혀있는 DB환경도 더러 있습니다. 여기서는 원리를 이해하는 데에만 집중해주시면 좋을 것 같습니다. 2번 질문더불어, count(distinct customerID)라고 쓰셨는데, ID는 무엇을 의미하는건가요? 같은 명의 컬럼이 없는데, 임의로 id라고 쓰는 이유는 뭔가요(사진)이 부분은 "CustomerID"가 전체 컬럼명인데요 아무래도 ID 부분이 대문자로 되어있어서 혼동을 드리지 않았나 싶습니다.ID는 Identifier의 약자로 식별자라는 뜻인데요, DB의 세계에서는 테이블에 있는 각 행을 구분해주기 위한 식별자로 이러한 ID를 꼭 추가해서 식별하고 있습니다. 여기서 CustomerID는 고객의 고유식별번호로 중복되지 않는 값을 가집니다. 그렇기 때문에 저 CustomerID를 중복되지 않게 세도록 하는 부분이 count(distinct CustomerID)인 것이죠. (우리 모의쿼리 환경에서는 컬럼을 대소문자 구분없이 써도 작동이 되고 있습니다.) 3번 질문실습문제4에서는 group by customerid에 o.customerid라고 안써도 작동이 되었는데, 왜 실습문제5에서는 select o.customerid라고 해야 작동될까요? 이유만 먼저 말씀드리면 조인(Join)을 했기 때문입니다. 조인은 강의에서 설명하고 있듯이 여러 테이블을 하나로 합치는 것인데요, 그러다보니 같은 이름의 컬럼명이 여러 테이블에 존재할 수 있는 상황이 생기게 됩니다. 이것을 컴퓨터에게 헷갈리지 말라고 조인을 할 때에는 각 테이블별로 별칭(alias)를 지정해주는데요, o라는 별칭을 지정한 테이블의 customerid를 지칭하도록 해줘야만 작동되는 쿼리이기 때문이에요. 4번 질문그리고, select에 구문을 쓰는 것과 where에 구문을 쓰는 것은 차이가 있을까요? 가령 count라는 것을 where에 같은 컬럼에 쓰는 거랑 select에 쓰는 거랑 뭔 차이예요?그 역할에 차이가 있어요. select은 우리 눈에 보이는 컬럼을 어떤 컬럼을 가져올까? 하는 부분을 컨트롤 하는 부분이고 where는 원하는 부분만 가져오도록 필터링하는 부분이에요.그렇기 때문에 count를 select에 쓰면 컬럼명으로(세로) 무엇인가를 카운트한 결과값을 출력할 수 있지만 where에 쓰게되면 무엇인가를 카운트한 결과를 가지고 필터링(가로)하는 로직만 사용할 수 있는 것이죠. 5번 질문개념적 질문인데요, 하나의 질문에 sql statement가 사람당 셀 수도 없는 다양한 답이 나올 수가 있는건가요?네 맞습니다. SQL뿐만 아니라 코드라는 것이 사람마다 작성하는 스타일이 어느정도 다르기 때문에 결과값은 같지만 여러가지 스타일의 쿼리가 등장할 수 있어요.다만 SQL은 어느정도 형식이 정해져있는 편이기 때문에 어느정도 대동소이하다 라고는 말씀드릴 수 있으며, 회사별 개별팀별로 협업하는 사람들간에 가독성을 확보하기 위해 팀별로 우리는 이건 이렇게짜자~ 하는 약속과 같은 코드 컨벤션을 따로 두는 편이에요. 6번 질문띄어쓰기를 여러번하나 한 번 하나 똑같은 값이 나오는 건가요? 띄어쓰기의 정도는 지문 쓰는 데 상관 없나요? 네 맞습니다. 띄어쓰기를 해주어야 하는 부분에서 안하면 에러가 날 수는 있지만 기본적으로 스페이스가 1번 이상인 경우에는 코드를 해석하는 파서에서 알아서 처리해주기 때문에 결과에는 영향이 없습니다.
- 1
- 1
- 425