부트캠프/SQL 도전기

SQL 문법 정리

BTSBRINGMEHERE 2022. 2. 3. 17:13

# SQL 4주차 숙제

4주차 숙제는 지금까지 배웠던 SQL 문법을 정리하는 시간을 가졌습니다.

 

SELECT, FROM

1주차에 가장 먼저 배운 select와 from 입니다. 

SELECT 특정 필드 FROM 특정 테이블

이렇게 사용하며 특정 테이블에 있는 특정 필드를 볼 수 있습니다. 특정 필드에 *을 사용하면 모든 필드를 볼 수 있습니다.

 

WHERE

where은 특정 필드의 조건을  걸어줄 때 사용합니다.

WHERE 특정 필드1 = '조건1' and 특정 필드2 = '조건2'

WHERE 특정 필드 부호(=,>,<,!= ...) 원하는 숫자

# between은 특정 숫자의 사이입니다.
WHERE 특정 필드1 BETWEEN '조건1' and '조건2'

# x는 임의의 숫자, between과는 다르게 사이의 값이 아니라 x의 값만
WHERE 특정 필드1 in (x,x)

# 여기서 조건에 %를 사용할 수 있습니다. %는 앞, 뒤에 사용 가능하며 임의의 글자, 상수, 기타 등등
WHERE 특정 필드 like '조건'

 

GROUP BY

범주의 통계를 나타낼 때 사용합니다.

GROUP BY 특정 필드

ORDER BY

오름차순 내림차순 정렬 할 때 사용합니다. 특정필드에 보통 count(*)를 넣어 숫자로 오름, 내림 차순을 합니다.

# 오름차순 ASC는 생략가능
ORDER BY 특정필드 (ASC)

# 내림차순
ORDER BY 특정필드 DESC

ALIAS

결과값을 출력할 때 특정 필드값에 별칭을 줄 때 사용합니다. 보통 필드의 결과값이 길어지거나 간략하게 출력을 할 때 사용합니다.

COUNT(*) as cnt

JOIN

두 테이블의 공통된 정보 (key값)를 기준으로 테이블을 연결해서 한 테이블처럼 보는 것을 의미합니다.

예를 들면, 서로 다른 테이블의 공통된 필드를 기준으로 결과를 도출 할 수 있습니다. 테이블을 번갈아가며 볼게 아니라 한꺼번에 출력도 되고 서로 다른 테이블의 문법도 작성 할 수 있습니다.

SELECT * FROM table1 t1
INNER(LEFT) JOIN table2 t2 ON t1.field = t2.field
WHERE ...
GROUP BY ...

주로 INNER 조인을 사용하며 그 이유는 LEFT 조인은 NONE까지 다 보여주지만 INNER 조인은 NONE값을 없애주고 볼 수 있습니다.

문법의 순서는 from -> join -> where -> group by -> select 순서입니다.

 

UNION

조인과 매우 비슷합니다. SELECT를 2번 하지 말고 한번만 사용해서 출력을 할때 사용되며 필드명이 같아야하는 조건이 필요한 UNION 함수 입니다. 솔직히 join의 활용도가 더 높지 않나 싶습니다.....

(
	select '7월' as month, c.title, c2.week, count(*) as cnt from checkins c2
	inner join courses c on c2.course_id = c.course_id
	inner join orders o on o.user_id = c2.user_id
	where o.created_at < '2020-08-01'
	group by c2.course_id, c2.week
  order by c2.course_id, c2.week
)
union all
(
	select '8월' as month, c.title, c2.week, count(*) as cnt from checkins c2
	inner join courses c on c2.course_id = c.course_id
	inner join orders o on o.user_id = c2.user_id
	where o.created_at > '2020-08-01'
	group by c2.course_id, c2.week
  order by c2.course_id, c2.week
)

따로 설명하기보단 눈으로 보고 직접 해봐야 이해가 되는 UNION 이었습니다.....

 

CASE

if 절과 똑같습니다. 특정 조건이 성립했을 때 결과값을 출력합니다.

CASE
WHEN 특정 필드1 > 10000 THEN '만점 초과'
WHEN 특정 필드1 > 5000 THEN '오천점 초과'
ELSE '오천점 이하'
END

간략하게 작성했습니다.

 

그 밖의 문법

# 필드의 값을 더해주는 SUM
SUM()

# 평균을 나타내는 AVG
AVG()

# 소수점자리를 표현하는 ROUND
ROUND(필드,0부터 원하는 곳)
EX) 1이면 소수점 첫 째자리 까지 표현하고 둘 째자리에서 반올림

# 숫자를 세어주는 COUNT
COUNT()
*이면 모든 필드의 합, ()안에 조건 사용 가능

# 중복을 없애주는 DISTINCT
DISTINCT()

# 원하는 문자열 뽑을 때
SUBSTRING_INDEX(특정 필드,'끊어 주는 곳',1 and -1)
1은 끊는 곳 앞, -1은 뒤
EX)sparta_coding@google.co.kr 가 있는 'EMAIL' 필드라면
SUBSTRING_INDEX(EMAIL,'@',1) == sparta_coding 추출
SUBSTRING_INDEX(EMAIL,'@',-1) == google.co.kr 추출

SUBSTRING(특정 필드,시작되는 지점,몇 번째 글자까지)
EX)2022-02-22 가 있는 'DATE' 필드라면
SUBSTRING(DATE,6,5) == 02-22 가 추출