2023.09.14.<SQL>MySQL_문법정리
2023. 9. 14. 16:42ㆍ콛/Til
스파르타 코딩클럽_엑셀보다 쉬운 SQL
1. 정의
- 쿼리문이란
- subquery란 : 쿼리문 안에 쿼리가 있는 것을 의미한다.
2. 문법
2-1. Database의 모든 Table 보기
Show tables;
2-2. Where
- where + in → 1,3주차 사람들의 '오늘의 다짐' 데이터만 보고 싶을 경우
select * from checkins
where week in (1, 3);
- where + like → % 값 % 가능
2-3. Limit
- 원하는 개수만 가져오기
select * from orders
where payment_method = "kakaopay"
limit 5;
2-4. Distinct
- 중복 제거
select distinct(payment_method) from orders;
2-5. Group by
- Group by name ; name값이 같은 필드끼리 묶어서 합쳐준다.
- 함께 사용할 때 select절에 min, max, sum, avg 등 사용가능
- 콤마를 통해서 두가지 묶기 가능
select 범주별로 세어주고 싶은 필드명, count(*) from 테이블명
group by 범주별로 세어주고 싶은 필드명;
2-5. Order by
- Order by point ; point순으로 정렬
- 콤마를 통해서 두가지 묶기 가능
- 자동 오름차순, 내림차순 정렬 원할 시 Order절 마지막에 desc 붙이기
select * from 테이블명
order by 정렬의 기준이 될 필드명;
2-6. As(Alias)
2-7. ( inner) Join
- 자동으로 탐
2-8. Left Join
- 값이 없는 경우 Null값 반환
- wherewjf + is NULL, is not NULL을 통해서 통계내기 가능
- name별로 is Null인 사람을 count해라
select name, count(*) from users u
left join point_users pu on u.user_id = pu.user_id
where pu.point_user_id is NULL
group by name
2-9. Union
- 7월과 8월을 붙여주고 싶을 경우 → ( ) union all ( )
(
select '7월' as month, c.title, c2.week, count(*) as cnt from checkins c2
inner join courses c on c2.course_id = c.course_id
inner join orders o on o.user_id = c2.user_id
where o.created_at < '2020-08-01'
group by c2.course_id, c2.week
order by c2.course_id, c2.week
)
union all
(
select '8월' as month, c.title, c2.week, count(*) as cnt from checkins c2
inner join courses c on c2.course_id = c.course_id
inner join orders o on o.user_id = c2.user_id
where o.created_at > '2020-08-01'
group by c2.course_id, c2.week
order by c2.course_id, c2.week
)
2-10. Substring_index, Substring
- 문자열 데이터 추출
1.SUBSTRING_INDEX
- email 필드의 값 → @을 기준으로 앞쪽의 문자 (1,-1 사용가능)
select user_id, email, SUBSTRING_INDEX(email, '@', 1) from users
1.SUBSTRING
- created_at 필드의 값 → 1번째부터 10번째까지의 문자를 가져와라.
select order_no, created_at, substring(created_at,1,10) as date from orders
- 활용 : 일별로 주문이 몇개씩인지 알아보기
substring을 사용하지 않을 경우 시간,분,초 단위까지 나오기 때문에 일별 데이터 뽑기 곤란 select created_at, count(*) from orders o group by created_at |
|
substring을 사용하여 시간, 분, 초 단위를 잘라서 사용할 경우 일별 데이터 뽑기 가능 select substring(created_at,1,10) as date, count(*) as cnt_date from orders group by date |
2-11. Case
- 기본 형식
- 타 언어 IF절이라 생각하면 편함
select 필드1, 필드2,
case
when 조건1 then '출력할 문장1'
when 조건2 then '출력할 문장2'
else '출력할 문장3'
End as 별명
from 테이블명
3. Subquery
- where + 필드명 in (subquery) / 카카오 페이로 결제한 유저들만 출력하고 싶을 경우
select * from users u
where u.user_id in (select o.user_id from orders o
where o.payment_method = 'kakaopay');
- Select 필드명, 필드명, (Subquery) from ...
예를들어
1.'4b8a10e6'의 평균 좋아요의 개수
select avg(likes) from checkins c2
where c2.user_id = '4b8a10e6'
2. subquery를 활용한 모든 유저의 평균 좋아요의 개수
select c.checkin_id, c.user_id, c.likes,
(select avg(likes) from checkins c2
where c2.user_id = c.user_id) as avg_like_user
from checkins c;
- Select 필드명, 필드명, (Subquery) from ...
예를 들어
1. 유저별 평균 좋아요의 수
select user_id, round(avg(likes),1) as avg_like from checkins
group by user_id
2. subquery를 통한 포인트와 like의 상관관계 출력
select pu.user_id, a.avg_like, pu.point from point_users pu
inner join (
select user_id, round(avg(likes),1) as avg_like from checkins
group by user_id
) a on pu.user_id = a.user_id
4. With
- 쿼리문 제일 위쪽에 with table1(테이블명 지정) as (서브쿼리문) 을 통해 별명을 붙여서 사용할 수 있다.
- with문까지 스크롤해서 실행시켜야 오류가 나질 않는다!
with table1 as (서브쿼리문1), table2 as (서브쿼리문2)
예를 들어
with table1 as (
select course_id, count(distinct(user_id)) as cnt_checkins from checkins
group by course_id
), table2 as (
select course_id, count(*) as cnt_total from orders
group by course_id
)
select c.title,
a.cnt_checkins,
b.cnt_total,
(a.cnt_checkins/b.cnt_total) as ratio
from table1 a inner join table2 b on a.course_id = b.course_id
inner join courses c on a.course_id = c.course_id
'콛 > Til' 카테고리의 다른 글
2023.10.12.<Java>문법1_Java, 변수 (0) | 2023.10.12 |
---|---|
2023.09.19.<강의>SQL 3주차_Join (0) | 2023.09.19 |
2023.09.13.<SQL>MySQL 2_Group by , Order by, SQL 쿼리 순서 (0) | 2023.09.12 |
2023.09.12<SQL>MySQL 1_Select, Where (0) | 2023.09.12 |
2023.09.08.<HTML,CSS>웹개발 종합반 5_배포,깃허브 기초 (0) | 2023.09.08 |