SQL 문법 모음

머니헌터·2022년 9월 17일
0

SQL은 하나의 프로그래밍 언어이다. 데이터베이스(DB)에서 필요한 정보를 추출하기 위한 명령문을 내려야 하는데, 그게 SQL.

즉, 데이터베이스에서 쿼리를 내려 원하는 데이터를 뽑아오는 언어이다.

제일 기본적인 Select, Where -> 각각 데이터를 불러오고 (Select) , 필요한 부분을 위해 조건 필터링 (Where)을 한다.

                  Group by, Order by -> 데이터를 묶어 통계치를 구하고, 정렬

                  Join -> 여러 데이터 즉 테이블을 합쳐서 분석하기 위한 join과 더 디테일한 데이터를 뽑기 위한 Subquery

이외에 데이터를 효율적으로 뽑아내기 위한 여러 문법이 있다.

이 엑셀 전체를 테이블 / order_no 같은 열은 필드라고 한다.

예를 들면, orders 테이블에서 payment_method가 카카오페이인 유저를 추출한다고 가정한다면.

Select * from orders

where payment_method = 'kakaopay'

이런식으로 쿼리를 작성할 수 있다.

*은 전체를 말하니, 여기에 특정 필드값을 넣으면 또 그 값만 추출 할 수 있다.

*) where 절과 함께 쓰이는 문법

  1. 같지 않음

-> != / ex. 웹개발 종합반을 제외한 주문데이터

select * from orders

where course_title != '웹개발 종합반'

2.범위 조건

-> between A and B

3.포함 조건

-> in / 1,3주차 사람들의 '오늘의 다짐' 데이터

select * from checkins

where week in (1, 3)

4.패턴 조건

-> like / 다음 이메일만 쓰는 유저

select * from users

where email like '%daum.net'

( %값%은 '값'포함한 데이터, 값1%값2 값1로 시작해서 값 2로 끝나는 데이터)

  1. 일부 데이터 가져오기

-> limit / 다 가져오지 않고 몇개만 가져올지 체크

select * from orders

where payment_method = "kakaopay"

limit 5 -> 이렇게 실행하면 딱 5개의 값이 출력되는 것임.

6.중복데이터 제거하고 가져오기

-> DISTINCT / 수많은 중복값이 있어도 다 거르고 보여줌

select distinct(payment_method) from orders

하면 딱 결재수단 갯수가 나올듯.

*) group by / order by

~별로 어떤 데이터가 있는지 알아볼때 '~별', 즉 묶어주는 기준점을 만드는 함수가 Group by이다.

from으로 데이터를 불러오고 group by로 묶어준 후 select로 출력을 하는 순서로 이해하면 될 것 같다.

ex. '신'씨 성을 가진 사람 데이터 몇 개인가?

select name, count(*) from users

group by name

여기서 출력한 신씨성을 체크하면 되시겠다~

Order by는 정렬이다. 다 준비된 데이터를 어떻게 정렬하는지를 정해주는 데이터이다. 기본은 오름차순인데, desc 로 내림차순

정렬도 가능하다. 그래서 Order by는 가장 늦은 실행 순서에 속한다.

select name, count(*) from users

group by name

order by count(*) desc

*) JOIN

생각보다 쉽지 않다고 여긴 부분이 JOIN / 이는 두 테이블의 공통된 정보 (주로 PK) 테이블을 연결해 하나의 테이블로 보는 것.

(user_id 필드를 기준으로 users 테이블과 orders 테이블을 연결하는게 가능하다는 것.)

Left join ( SQLD의 Left outer join과 같다) 는 왼쪽 방향을 기준으로 왼쪽 데이터를 불러오고 이어 오른쪽에서 왼쪽과 겹치는 데이터를 불러 연결하는 것이다. 즉 left join은 순서가 중요하다.

Inner join은 각 테이블의 교집합

UNION은 내가 추출한 결과물을 합치는 것이다.

-> SQLD 개념을 살짝 넣자면, UNION은 결과의 중복값을 삭제하지만, union all은 중복도 다 표시

그리고 order by가 되지 않으니 유의

*) 서브쿼리

데이터를 불러오거나, 조건을 걸거나, 실행할때 단순 하나의 테이블 단위가 아닌 절차가 복잡한 경우가 있음.

이를 괄호안에 또 select 문을 넣어 서브쿼리로 실행하는 경우가 있다.

where,select,from 절에 유용하게 사용한다.

  1. where 에 들어가는 서브쿼리

where (필드명) in (서브쿼리) / 여기서 범위를 서브쿼리로 좀 더 자세하게 나타낼 수 있는 것임.

ex.카카오페이로 결제한 주문 유저만, 유저 테이블에 출력하는 경우

select * from users u

where u.user_id in (select o.user_id from orders o

                                 where o.payment_method = 'kakaopay')

이렇게 범위를 건 - 유저아이디를 출력할 수 있게 해준다.

  1. select 에 들어가는 서브쿼리

셀렉트는 결과값을 출력하는 부분으로, 어떤 데이터를 가져오고 싶은지 세부적으로 정해줄 때 서브쿼리를 쓴다.

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 -> 이건 Alias 별칭을 정해주는 개념

from checkins c

  1. From에 들어가는 서브쿼리 ( 가장 잘 쓰는 유형 )

내가 지정한 select문과 이미 있는 테이블을 join할때 쓰면 좋은 경우

ex. 유저별 좋아요 평균과 그 해당 유저 별 포인트를 본다고 가정해보자.

select * from point_users pu

inner join ( select c.user_id, round(avg(c.likes),1) as avg_like from checkins c

                group by c.user_id

) a on pu.user_id = a.user_id

이걸 아예 with 절로 묶어서 앞에 표시해서 더 깔끔하게 표기할 수도 있음.

select * from point_users pu

inner join ( select c.user_id, round(avg(c.likes),1) as avg_like from checkins c

                group by c.user_id

) a on pu.user_id = a.user_id

이 경우에

with table1 as( select c.user_id, round(avg(c.likes),1) as avg_like from checkins c

                group by c.user_id

)

select * from point_users pu

inner join tabel1 a on pu.user_id = a.user_id

이런식으로.

마지막으로, 실전에서 잘 쓰는 SQL 문법 정리

  1. SUBSTRING , SUBSTRING_INDEX

문자열을 쪼개서 일부만 가져오는 경우를 말함.

이거는 이메일 아이디만 가져오는 예시 ->

select user_id, email, SUBSTRING_INDEX(email, '@', 1) from users

->가운데 @를 기준으로 텍스트를 쪼개고, 그 중 첫번째 조각을 가져오라는 의미, 도메인만 추출하면 -1으로.

select order_no, created_at, substring(created_at,1,10) as date from orders

->이거는 created_at에 있는 텍스트를 첫번째 글짜부터 10개를 추출하고 싶다는 의미

  1. CASE - 경우에 다라 원하는 값을 새 필드에 출력

select pu.point_user_id, pu.point,

case

when pu.point > 10000 then '잘 하고 있어요!'

else '조금 더 달려주세요!'

END as '구분'

from point_users pu;

그럼 케이스에 맞는 결과가 하나의 필드로 또 출력 되는 것~
[출처] |작성자

profile
그냥 저냥 살고 있어요~

0개의 댓글