일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- max
- 그래프 생성 문법
- merge
- 회귀분석 알고리즘
- loop 문
- Intersect
- 막대그래프
- Dense_Rank
- 총과 카드만들기
- count
- 정보획득량
- 회귀분석
- %in%
- 순위출력
- 상관관계
- 데이터분석가
- 여러 데이터 검색
- 단순회귀 분석
- 불순도제거
- sql
- 팀스파르타
- Sum
- 히스토그램 그리기
- sqld
- difftime
- 빅데이터
- 빅데이터분석
- 그래프시각화
- if문 작성법
- 데이터분석
- Today
- Total
ch0nny_log
SQLD_ 엑셀보다 쉬운, SQL 2-4주차 완강 본문
* tistory로만 개발일지 작성을 위해 네이버 블로그에 이전에 작성했던 글들을 긁어왔습니다.
* 강의들으면서 끄적이는 글 (일목묘연하지 않고, 이글을 보고 학습하기 적절하지 않을 것으로 사료됨, 틀린 부분 지적 환영)
**문법 총 정리**
1.where
조건문 subquery의 조건에 활용방식으로 사용
where 필드명 in -
2.select
결과를 출력해주는것 .
select 필드명 from 테이블
3.from
가장 많이 쓰는 서브쿼리
select와 테이블을 join 할때 사용함.
4.with
서브쿼리를 정리하는 문법
with 테이블명1 as (서브쿼리1), 테이블명2 as (서브쿼리2)
5.substtring_index
필드에서 기준값 설정하고 그 앞 뒤를 추출한다.
substtring_index (필드명, '기준이 되는 텍스트', 1)
1은 앞 -1은 뒤 텍스트'
6.substring
텍스트로 된 필드에서 기준값 설정하고, 기준값으로 설정된 수 뒷자리 까지 추출
substring (필드명, 텍스트자리수, 몇번째까지 추출할것인지)
7.case
경우에 따라 원하는 값 새 필드에 출력
case when ~ then '원하는 값'
else '원하는값' end
[2주차 목차]
- 통계: 최대/최소/평균/갯수 (쌓여있는 날것의 데이터-> 의미를 갖는 '정보'로의 변환)
- 통계구하기: 기존 방법의 한계
- 동일한 범주의 데이터를 묶어주는 Grop by
- 깔끔하게 데이터를 정렬하는 Order by
+ where 문으로 결과가 동일한지 검증해보기
users 테이블에서 성 별로 몇명인지 나타내기
-> SELECT name, count(*) FROM users
group by name
주차별로 '오늘의 다짐' 개수 구하기
select week, count(*) from checkins
group by week
주차별로 '오늘의 다짐'의 최솟값 구하기
select week, min(likes) from checkins
group by week;
주차별로 '오늘의 다짐'의 최솟값 구하기
select week, max(likes) from checkins c
group by week
주차별로 '오늘의 다짐'의 평균값 구하기
select week, avg(likes) from checkins
group by week;
+ 소수점이 길게 나올때 반올림하려면 ROUND ( ~~ ,2) =소숫자리 2개까지
주차별로 '오늘의 다짐'의 좋아요 합ㄱㅖ 구하기
select week, SUM(likes) from checkins
group by week
깔끔한 정렬이 필요할 땐? ORDER BY -> 할거 다하고 마지막에 하기
오름차순 order by 필드명 (asc)
내림차순 order by 필드명 desc
웹개발 종합반의 결제수단별 주문건수 세어보기 (오름차순으로)
select payment_method, count(*)FROM orders
WHERE course_title ='웹개발 종합반'
group by payment_method
삽질하기
에러메시지 읽기
원하는 결과가 나오지 않았는지 생각 및 수정하기
연습하기
문자열대로 정렬하기 =숫자와 동일
앱개발종합반의 결제수단별 준문건수 세어보기
select payment_method, count(*) FROM orders
WHERE course_title = '앱개발 종합반'
group by payment_method
Gmail을 사용하는 성씨별 회원수 세어보기
SELECT name, count(*) FROM users
where email like '%gmail.com'
group by name
course_id 별 '오늘의 다짐'에 달린 평균 like 갯수 구해보기 (소수점 두자리)
select course_id, ROUND(AVG(likes),2) FROM checkins
group by course_id
**꿀팁! 이렇게 쿼리 작성하면 편함**
1) show tables로 어떤 테이블이 있는지 살펴보기
2) 제일 원하는 정보가 있을 것 같은 테이블에 select * from 테이블명 limit 10 쿼리 날려보기
3) 원하는 정보가 없으면 다른 테이블에도 2)를 해보기
4) 테이ㅡㄹ을 찾았다! 범주를 나눠서 보고싶은 필드를 찾기
5) 범주별로 통계를 보고싶은 필드를 찾기
6) SQL 쿼리 작성하기
** 이외 유용한 문법 배우기
- 별칭기능: Alias
- 쿼리가 점점 길어지면서 종종 헷갈리는 일이 생길 수 있음. 그래서 SQL은 Alias 라는 별칭 기능을 지원함
SELECT payment_method,count(*)as cnt FROM orders o
WHERE o.course_title ='앱개발 종합반'
group by payment_method
숙제
네이버 이메일을 사용하여 앱개발 종합반을 신청한 주문의 결제 수단별 주문건수 세어보기
SELECT payment_method, count(*) FROM orders o
where email like '%naver.com' and course_title ='앱개발 종합반'
group by payment_method
3주차 목차
- JOIN: 여러정보(KEY 값)를 한눈에 보고싶다면 (실무에 굉장히 많이씀!) / 테이블들을 연결해서 한눈에 볼 수 있음
-> 테이블을 붙일 때 기준이 필요하다.
-> VLOOKUP이랑 비슷
- JOIN의 종류 : LEFT JOIN, INNER JOIN
LEFT JOIN
SELECT * FROM users u
LEFT JOIN point_users p
ON u.user_id = p.user_id
INNER JOIN
SELECT * FROM users u
inner JOIN point_users p
ON u.user_id = p.user_id
orders 테이블에 users 테이블 연결해보기
SELECT * FROM orders o
inner join users u on o.user_id = u.user_id
checkins 테이블에 users 테이블 연결해보기
SELECT * FROM checkins c
inner join users u on c.user_id = u.user_id
enrolleds 테이블에 courses 테이블 연결하기
SELECT * FROM enrolleds e
inner join courses c on e.course_id = c.course_id
위 쿼리가 실행되는 순서: from -> join -> select
checkins 테이블에 courses 테이블 연결해서 통계치 내보기
point_users 테이블에 users 테이블 연결해서 순서대로 정렬해보기
order 테이블에 users 테이블 연결해서 통계치 내보기
->과목별 오늘의 다짐 갯수 세어보기
SELECT c1.course_id, c2.title, count(*)as cnt FROM checkins c1
inner join courses c2 on c1.course_id = c2.course_id
group by c1.course_id
point_uses 테이블에 users 테이블 연결해서 순서대로 정렬해보기
-> 많은 포인트를 얻은 순서대로 유저 데이터 정렬해서 보기
select * from point_users p
inner join users u
on p.user_id = u.user_id
order by p.point desc
order 테이블에 users 테이블 연결해서 통계치 내보기
->네이버 이메일 사용하는 유저의 성씨별 주문건수 세어보기
select u.name, count(u.name) as count_name from orders o
inner join users u on o.user_id = u.user_id
where u.email like '%naver.com'
group by u.name
위 쿼리가 실행되는 순서: from -> join -> where-> group by -> select
결제 수단 별 유저 포인트의 평균값 구해보기(반올림)
SELECT o.payment_method, ROUND(avg(pu.point),2) FROM point_users pu
inner join orders o on pu.user_id = o.user_id
group by o.payment_method
결제하고 시작하지 않은 유저들을 성씨별로 세어보기
SELECT u.name , count(*) as cnt from enrolleds e
inner join users u on e.user_id =u.user_id
where e.is_registered = 0
GROUP by u.name
order by cnt desc
과목 별로 시작하지 않은 유저들을 세어보기
select c.course_id, c.title, count(*) as cnt_notstart from courses c
inner join enrolleds e on c.course_id = e.course_id
where is_registered = 0
group by c.course_id
웹개발, 앱개발 종합반의 week 별 체크인 수를 세어보세요
- join 할 테이블: courses, chekins 붙이기
SELECT c1.title , c2.week , COUNT(*) FROM courses c1
inner join checkins c2 on c1.course_id =c2.course_id
group by c1.title , c2.week
order by c1.title ,c2.week
+
8월 1일이후에 구매한 고객들만~
SELECT c1.title , c2.week ,COUNT(*)as cnt FROM courses c1
inner join checkins c2 on c1.course_id =c2.course_id
inner join orders o on c2.user_id = o.user_id
WHERE o.created_at >='2020-08-01'
group by c1.title , c2.week
order by c1.title , c2.week
left join 은 언제 사용하나?
회원가입은 했는데 포인트가 없는사람
SELECT u.name, COUNT(*) as cnt FROM users u
left join point_users pu on u.user_id =pu.user_id
where pu.point_user_id is NULL
group by u.name
count는 null을 세지않는다!
7월 10일 ~7월19일 가입한 고객중
포인트를 가진 고객의 숫자, 그리고 전체 숫자, 그리고 비율을 보여줘라
SELECT COUNT(pu.point_user_id) as pnt_user_cnt,
count(u.user_id) as tot_user_cnt,
round(count(pu.point_user_id)/count(u.user_id),2) as ratio
FROM users u
left join point_users pu on u.user_id =pu.user_id
where u.created_at BETWEEN '2020-07-10' and '2020-07-20'
union 에 대해서
숙제~
enrolled_id별 수강완료(done=1)한 강의 갯수를 세어보고, 완료한 강의 수가 많은 순서대로 정렬해보기 user_id도 같이 출력하기
SUBQUERY 연습해보기
Q1. 전체 유저의 포인트 평균보다 큰 유저들의 데이터 추출하기
SELECT * FROM point_users pu
WHERE POINT > (SELECT AVG(point) FROM point_users pu
)
Q2. 이씨 성을 가진 유저의 포인트 평균보다 큰 유저들의 데이터 추출하기
SELECT * FROM point_users pu
WHERE POINT > (SELECT AVG(pu.point) FROM point_users pu
INNER JOIN users u on pu.user_id = u.user_id
WHERE u.name = '이**')
Q3. checkins 테이블에 course_id 별 평균 likes 수 필드 우축에 붙여보기
SELECT c.checkin_id ,
c.course_id ,
c.user_id ,
c.likes,
(select AVG(likes) from checkins c
where course_id ='5f0ae408765dae0006002817'
) as course_avg
FROM checkins c
'빅데이터 분석(with 아이티윌) > SQL' 카테고리의 다른 글
[빅데이터분석]SQL_TIL2 (0) | 2024.05.10 |
---|---|
[빅데이터분석]SQL_TIL1 (0) | 2024.05.10 |
SQLD_ 비전공자&직장인 SQL개발자(SQLD) 턱걸이 합격!_한달 공부 (0) | 2024.04.22 |
SQLD_ 엑셀보다 쉬운, SQL 1주차 (0) | 2024.04.22 |
SQLD_ 엑셀보다 쉬운, SQL 등록 & 진로걱정 (0) | 2024.04.22 |