mySQL
group by란?
group by name // name 이라는 속성을 기준으로 중복없이 각 데이터를 그룹핑 하는 것.
select name, count(*) from a
group by name // name으로 그루핑 된 필드들을 카운팅
count() 이외에, min(),max(),avg(),round(),sum() 등 다양한 값을 구할 수 있다.
order by란?
- 데이터 정렬 : 오름차순 혹은 내림차순으로 정렬한다.
order by count(*) // 무엇을 기준으로 order by를 실행할지 결정하고, 마지막에 order by를 실행한다.
// 기본: 오름차순
order by count(*) desc // 내림차순 정렬
alias : 별칭
- 여러개의 테이블을 조인할 때, 어떤 테이블의 속성임을 표시하기 위해 별칭을 설정
select * from users u// users 라는 테이블의 별칭은 u
Join이란?
- 한번에 두 개 이상의 테이블을 연결할 수 있다.
- inner join, left join 을 가장 많이 사용함
- left join은 왼쪽 테이블을 기준으로 붙이는 것, inner join은 교집합
select * from users u
inner join orders o
on u.user_id = o.user_id
//inner join ** on 의 형식. 각 테이블에 기준이 되는 공통 키를 이용해 join
Union all
- 각각의 select 를 하나의 테이블 형식으로 묶어줌
- (select) union all (select)
서브쿼리란?
- 쿼리 안에 또 하나의 쿼리가 있는 것. 괄호로 묶어서 사용한다.
- 크게 where절, select 절, from 절 사용 방식으로 구분할 수 있다.
select * from a
where ♠ in (select ** from b)
//괄호 안의 서브쿼리 : 이미 추려진 결과값
//전체 내용 중 서브쿼리 내에 들어있는 ♠을 찾아 추리겠다!!
//실행 순서는 괄호 안에서 밖으로. 괄호 안의 결과값을 이용해 바깥의 쿼리를 동작.
select a,
b,
(select avg(*) from ♠)
from ...
// 하나의 테이블에서 이미 추려진 결과값을 붙여 하나의 테이블로 붙일 때 쓴다.
// 이건 내가 만든 기준인데, 난 이것도 보고싶고 저것도 보고싶어...
select * from a
inner join (select ♠ from ♤) b
on a.a1 = b.a1
// 이 경우 서브쿼리로 추린 결과값이 하나의 테이블인 것 처럼 쓸 수 있다.
// 테이블 a의 전체 결과값과 서브쿼리 테이블 b 를 a1이라는 기준 속성으로 inner join
서브쿼리 끼리의 inner join
select c. title,
a. cnt_users,
b. cnt_total
from
(
select course_id, COUNT(distinct(user_id))as cnt_users from checkins
group by course_id
) a
inner join
(
select course_id, count(*)as cnt_total from orders
group by course_id
)b on a. course_id = b. course_id
inner join courses c on c.course_id = a. course_id
- 각각의 서브쿼리를 a, b로 묶은 후 inner join을 실행한다.
- 각 서브쿼리 내의 속성 접근은 a.속성, b.속성 으로 할 수 있다.