velog에서 이전한 글 입니다.
from, order by, group by 쉼표로 조합한다.
select * from A, B
select course_id, week, count(c.likes) from checkins c
group by course_id, week
join 연속
a inner join b on ~~
inner join c on ~~
a+b join한 table에 c를 join한다.
- 없는 것 들을 포함해서 통계를 내고 싶을 때 left join이 필요하다.
- count는 null을 세지 않는다.
- union에서는 개인 order by가 적용되지 않는다. 전체에 order by를 할 수 있다.
서브쿼리
select절 서브쿼리, join절 서브쿼리, from절 서브쿼리
select *, (subquery select ~~) from ~~
a inner join (subqeuery) //조인할 테이블 서브쿼리
select tb.~ from (subqeury) as tb //가져올 테이블 서브쿼리
다중행 쿼리
where ~ in (subquery 다중행)
where ~ > (subquery 다중행)
이런 뉘앙스로 쓴다.
- 조인이 안돼있어 조건에 걸 컬럼이 없는 경우는 대개 where절 서브쿼리로도 해결가능하다.
함수들
select *, substring_index(u.email, '@', -1) from user u
select *, substring(u.created_at, 1, 10) from user u
위처럼 함수를 통해 만든 select 항목으로
select *, substring(u.created_at, 1, 10) ss from user u
group by ss
group by나 where절에 활용할 수 있다.
case when
(1)
select * from (
select pu.point_user_id, pu.point,
( case
when pu.point > (select avg(pu.point) from point_users pu) then '평균 이상이예요!'
else '평균 아래에요ㅠㅠ' end ) as lv
from point_users pu
) a
select 항목을 when의 조건에 따라 값을 바꿀 수 있다.
(2)
select * from (
select pu.point_user_id, pu.point,
( case
when pu.point > avg(pu.point) then '평균 이상이예요!'
else '평균 아래에요ㅠㅠ' end ) as lv
from point_users pu
) a
그리고 (1)을 (2)와 같이 작성한다면 하나의 row만 나온다.
(3)
select *, avg(pu.point) from point_users pu
(3)의 경우도 마찬가지이다.
(3)의 경우 avg(pu.point)의 row는 하나이므로 거기에 맞춰 하나가 나온다고 생각할 수 있고
(2)를 보면 select로 보여주지 않고 조건으로만 활용해도 row가 하나가 나오는 것을 볼 수 있다.
row가 하나로 나오는 함수들은 select에 찍지않고 where에 쓰여도 row를 하나로 만든다는 것을 주의하자.
row가 하나인 함수결과를 각 row에 붙이고자 한다면 (1)과 같이 서브쿼리를 쓴다.
'Language > SQL' 카테고리의 다른 글
sql JOIN(Inner, Outer, Cross, Self) (0) | 2023.09.06 |
---|---|
데이터베이스 정규화 (0) | 2023.08.05 |