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