SQL 문법 모음

머니헌터·2022년 9월 17일

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개의 댓글