목록코딩공부/SQL (25)
영국 척척석사 유학생 일기장👩🏻🎓
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/NuoAb/btsHBDin316/BZNu6ma3NGBKUGWzl70Fik/img.png)
1. LEFT, RIGHTLEFT : 왼쪽에서부터 지정된 개수의 문자를 추출하는 함수RIGHT : 오른쪽에서부터 지정된 개수의 문자를 추출하는 함수하나의 열에 너무 많은 정보가 섞여있을때 사용됩니다.즉, 필요한 정보가 해당 열에서 왼쪽이나 오른쪽에 존재할 때 사용됩니다.첫번째 인수 : 분리할 열 그 자체 두번째 인수 : 해당 문자열로부터 추출하려는 문자의 개수 예시 : 학생들의 행동을 분석하기 위해 학생 ID와 급여 정보 추출하기student_information3839581, F, san francisco, 3.7, 1000002842940, M, chicago, 3.8, 1500002842940, F, new york city, 3.9, 2000002849201, M, boston, 3.5, 1250..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/c1mO8I/btsHymMS5v0/1XkZMY6bizWXnoQvFSKLs0/img.png)
예제) 각 channel의 하루 평균 이벤트 수먼저, DATE_TRUNC를 이용해 날짜별로 그룹을 만들어줍니다.DATE_TRUNC개념 🔻 (SQL) DATE_TRUNC DATE_PART 개념 및 연습문제1) DATE_TRUNC날짜, 시간 열의 특정 부분으로 날짜를 자를 수 있습니다.RESULTINPUT2024-04-01 12:15:01DATE_TRUNC('second', 2024-04-01 12:15:01)2024-04-01 00:00:00DATE_TRUNC('day', 2024-04-01 12:15:01)2024-04-01 00:00:00DATE_TRUNC('month',life-of-nomad.tistory.comSELECT DATE_TRUNC('day', occurred_at) AS day, ch..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/cMCWwC/btsHsrnOPMm/zVqjbBIFk0uz2exWcOuBC1/img.png)
1. 문제1) total_amt_usd 판매액이 가장 많은 각 region에서 sales_rep의 name을 제공하십시오.sales_rep과 관련된 total_amt_usd 총계, region 나타내기SELECT s.name rep_name, r.name region_name, SUM(o.total_amt_usd) total_amtFROM sales_reps sJOIN accounts aON a.sales_rep_id = s.idJOIN orders oON o.account_id = a.idJOIN region rON r.id = s.region_idGROUP BY 1,2ORDER BY 3 DESC; 각 region에 대한 total_amt_usd 가져오기SELECT region_name, MAX(tot..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/Wgszv/btsHrwhZLWa/h5NOmDE9pFyWoRIf8blsE1/img.png)
1. 문제각 계정에서 제품을 마케팅하는 데 가장 많이 사용한 (최댓값) 채널은 무엇입니까?같은 채널이 얼마나 자주 사용되었습니까?1) channel과 각 channel이 발생환 횟수 파악하기SELECT a.id, a.name, we.channel, COUNT(*) ctFROM accounts aJOIN web_events weON a.id = we.account_idGROUP BY a.id, a.name, we.channelORDER BY a.id; 2) 위의 서브쿼리를 t1으로 하고 계정 이름별 채널 집계치의 최댓값 구하기SELECT t1.id, t1.name, MAX(ct)FROM (SELECT a.id, a.name, we.channel, COUNT(*) ct FROM accounts a JO..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/nPbCb/btsHq0jknPn/rV40K7LLjA1yrweUDiSe80/img.png)
1. With기존 테이블에서 테이블을 "의사 생성" 하고 메인 쿼리 상단에 임시 테이블을 시각적으로 범위를 정하려는 경우WITH subqurery_name (column_name1, ...) AS (SELECT ..._)SELECT ... 2. Nested임시 테이블이 더 큰 쿼리 내에서 필터 역할을 하도록 할 때 사용WHERE 절 안에 위치SELECT s.s_id, s.s_name, g.final_gradeFROM student s, grades gWHERE s.s_id = g.s_id IN (SELECT final_grade FROM grades g WHERE final_grade > 3.7 );3. Inlinewith와 동일한 방식으로 사용되나 메인 쿼리 위에 있는 임시 테이블 대..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/NvFrl/btsHmQvIduK/kjdT8qQgFkQUuDEvrY2Tbk/img.png)
1) CASECASE 문은 항상 SELECT 절에 써야 함CASE는 WHERE, THEN, END 구성요소를 포함해야함ELSE는 다른 CASE 조건을 충족하지 않는 경우를 위한 선택적 구성 요소WHEN 사이에 조건 연산자 (WHERE) 를 사용하여 조건문 만들 수 있음 (AND, OR 사용 가능)예시 SELECT id, account_id, occurred_at, channel, CASE WHEN channel = 'facebook' OR channel = 'direct' THEN 'yes'ELSE 'no' END AS is_facebookFROM web_eventsORDER BY occurred_at SELECT account_id, occurred_at, total,CASE WHEN total > 5..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/UwJhm/btsHornBg4s/NM2gTutv04lLgtKMciLzX1/img.png)
1) DATE_TRUNC날짜, 시간 열의 특정 부분으로 날짜를 자를 수 있습니다.RESULTINPUT2024-04-01 12:15:01DATE_TRUNC('second', 2024-04-01 12:15:01)2024-04-01 00:00:00DATE_TRUNC('day', 2024-04-01 12:15:01)2024-04-01 00:00:00DATE_TRUNC('month', 2024-04-01 12:15:01)2024-01-01 00:00:00DATE_TRUNC('year', 2024-04-01 12:15:01) 2) DATE_PART하루 중 특정 부분만 빼내고 싶은 경우dow : day of week, 0(일요일)~6(토요일) 사이의 값을 반환RESULTINPUT1DATE_PART('second', ..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/YjI1X/btsHm0LlTtS/PX0az6XFqE9x9VOCtNTLU0/img.png)
1) HAVING집계된 쿼리를 조건에 의해 필터링 할 때 씁니다.WHERE을 쓰지 않은 이유는 WHERE 절은 집계 열에 대한 필터링을 허용하지 않기 때문입니다.이 때 HAVING 을 씁니다.SELECT account_id, SUM(total_amt_usd) sum_total_amt_usdFROM ordersGROUP BY 1HAVING SUM(total_amt_usd) >= 250000 2) 연습문제sales reps 중 자신이 관리하는 계정이 6개 이상인 사람은 몇 명입니까? 34명 21개 이상의 주문이 있는 accounts는 몇 개입니까? 120개 주문이 가장 많은 계정은 어디입니까? Leucadia National 모든 주문에서 총 30,000 USD 초과를 지출한 계정은 어디입니까? 가장 많이..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/ccgx38/btsHncLpvQa/y51fw8B8Oj9zUuMbqJCTz0/img.png)
1) DISTINCTDISTINCT문은 중복된 데이터를 제거하고 데이터를 조회할 때 사용합니다.DISTINCT문을 사용하면 테이블에 중복되는 데이터를 한번만 출력하여 고유 값만을 추출합니다.일부 열을 기준으로 그룹화하고 싶지만 집계를 포함하지 않을 때 GROUP BY 대신 사용합니다.SELECT 문에서 사용되며 SELECT 문에 작성된 모든 열에 대해 고유한 행 제공합니다.SELECT DISTINCT column1, column2, column3FROM table1;아래는 잘못된 예시입니다.SELECT DISTINCT column1, DISTINCT column2, DISTINCT column3FROM table1;결과 예시 2) 연습문제DISTINCT를 사용하여 둘 이상의 지역과 연결된 계정이 있는..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/dNIpOc/btsHnK8kIki/rBOvkuC0dUbhhxAtjXGahk/img.png)
1) GROUP BY 여러 열로 그룹화하기여러 segment에 걸쳐 집계하는데 유용열 이름의 순서는 중요하지 않음. 결과는 상관없이 동일함. GROUP BY절에서 동일 쿼리를 실행하고 순서를 반대로 해도 동일 결과를 얻을 수 있음주의 : 집계에 포함되지 않은 모든 열은 GROUP BY 문에 표시되어야 함. 2) 연습문제각 계정에 대해 주문에서 구매한 각 용지 유형의 평균 금액을 결정합니다. 결과에는 계정 name에 대한 열과 각 계정의 각 용지 유형에 대해 구매한 평균 수량에 대한 열이 있어야 합니다.각 계정에 대해 각 용지 유형에 대해 주문당 평균 지출 금액을 결정합니다. 결과에는 4개의 열이 있어야 합니다. 하나는 계정 name에 대한 열이고 다른 하나는 각 용지 유형에 지출된 평균 금액입니다.각 s..