SQL 문법정리 - 1

최창수·2023년 2월 27일
0

SQL

목록 보기
5/5

0. show tables

불러온 DB의 모든 table 들의 목록을 보여준다.

1. Select

조회(read)를 위한 명령어이다. 기본적으로 어떤 table로 부터 어떤 field를 조회할지 정한다.

select [field1 명],[field2 명], ... from [table]

[field명]부분에는 산술식을 이용하여 새로운 field를 만들어 조회할 수 있다.

2. from

select 뒤에서 어떤 table을 조회할지를 정한다. 뒤에는 subquery나 join한 table등 다양한 형태의 table이 올 수 있다.

3. where

조건을 걸어 조회할 record를 제한한다.
다음의 비교/논리 연산자 들을 이용할 수 있다.

비교연산자의미논리 연산자의미
=같다AND두 조건문 모두 만족
!=다르다OR하나이상 만족
>크다NOT조건을 만족하지 않음
<작다in ( )( )안의 값 중 일치하는것이 있음
>=크거나 같다
<=작거나 같다

NULL을 where절에서 사용할 경우, =!=가 아닌 is,is not을 사용하면 된다.

이외에도 문자열의 패턴을 비교할 수 있는 like나 두 수치 사이의 값만 선택하는 between A and B등도 가능하다.

select * from users
where email like '%gmail.com'
select * from point_users
where point between 2 and 5

4. limit

조회할 데이터의 갯수를 제한한다. 데이터가 너무 많을 경우 본격적으로 분석, 정리하기 전 대략적인 형태를 파악할 때 사용하기 좋다.

select * from users 
limit 5

5. disticnt

field에 어떤 값들이 존재하는지 볼 때, 일일히 읽을 필요 없이 중복되는 값을 제거하여 보여준다.

select distinct(name) from users;

6. 집계함수: min/max/avg/count/sum

지정된 field의 조회할 record 들의 통계값을 계산하는 함수들이다. 각각 최소/최대 값, 평균, 총 갯수, 합산 값을 의미한다. count의 경우 NULL값인 record는 세지 않는다.
select과 having 절에서만 사용가능하다.

select count(*) from users;

7. gruop by

특정 field를 기준으로 record들을 범주화한다. 주로 집계함수와 함께 사용된다. ,를 사용해 여러 field를 기준으로 범주화 할 수 있다.

select name, count(*) from users
group by name

8. order by

특정 field를 기준으로 record들을 정렬한다. ,를 사용해 여러 field를 기준으로 정렬 할 수 있다. asc, desc 옵션을 통해 내림차순/오름차순도 정할 수 있다. 여러 field를 기준으로 쓸 경우각 field마다 따로 오름차순/내림차순을 적용가능하다. 배운 select절에서 사용하는 문법중 가장 마지막에 실행된다.

select name, count(*) from users
group by name
order by count(*) desc

9. join

두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것을 말한다. 옵션으로 inner(기본)/left join이 있다.

inner: 어떤 record의 field의 값이 두 테이블중 하나만이라도 없다면 결과에 포함되지 않는다. 따라서 비어있는 field가 없다.

left join: [table 1]에 존재하는 field 값을 기준으로 하여 합친다. 어떤 record의 해당 field의 값이 [table 2]에는 없는 경우, 두번째 테이블에 있던 field들은 NULL로 채워넣는다. [table 2]에는 있지만 [table 1]에는 없는 경우는 결과에 포함되지 않는다. 왼쪽 테이블의 한개의 record에 여러개의 오른쪽 테이블 레코드가 일치할 경우, 해당 왼쪽 record를 여러번 표시하게 된다.

select c1.title, c2.week, count(*) as cnt from checkins c2
inner join courses c1 on c2.course_id = c1.course_id
group by c1.title, c2.week
order by c1.title, c2.week

10. union

두 테이블의 field가 모두 동일하다면 둘을 Union을 통해 record를 밑에 붙이는 형식으로 합칠 수 있다. subquery도 가능하다.

(select [필드1],[필드2] from [table1])
union all
(select [필드1],[필드2] from [table2])

orderby를 이용한 정렬이 최종 조회 결과물에서 먹히지 않는다.

11. subquery

subquery는 하위 query문을 상위 query문의 () 안에 넣어 데이터를 더 쉽게 조회할 수 있는 문법이다. select문, where문, from문 안에 넣을 수 있다. 실행순서는 하위 query 부터 실행된다.

select 문에 넣을 경우 보통 단일 값을 출력하는 query를 넣어 하나의 field를 형성하게 한다.기존 테이블에 함께 보고싶은 통계 데이터를 손쉽게 붙이는 것에 사용한다.

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
from checkins c;

from 문에 넣는 경우는 가장 많이 쓰이는 사용법으로, join과 함께 사용해 이미 있는 table과 조회하여 얻은 table을 합칠 수 있다.

select pu.user_id, a.avg_like, pu.point from point_users pu
inner join (
	select user_id, round(avg(likes),1) as avg_like from checkins
	group by user_id
) a on pu.user_id = a.user_id

where 문에 넣는 경우는 in과 함께 사용하여 유동적인 조건문을 만들 수 있다.

select * from users u
where u.user_id in (select o.user_id from orders o 
					where o.payment_method = 'kakaopay');

12. with

subquery를 이용한 쿼리문을 깔끔하게 만들어주기 위한 문법이다. 다음과 같이 작성한다.

with table1 as (
	subquery_1
	group by course_id
), table2 as (
	subquery_2
)
select * from ...

13. 문자열 처리: SUBSTRING_INDEX, SUBSTRING

문자열 데이터를 원하는 형태로 한번 정리하기 위한 함수이다.

substring_index: 특정 문자를 기준으로 문자열을 자르고 그 일부분을 가져온다.
SUBSTRING_INDEX([문자열 field], '기준 문자', n번째 조각)

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

위와같이 입력할 경우 email의 도메인부분(마지막 조각)만 잘라내 가져온다.
substring: 위치와 길이값을 지정해 문자열 중 원하는 부분만 가져온다.

SUBSTRING(문자열, 출력을 하고싶은 첫 글자의 위치, 출력할 문자 개수)

14. case

경우에 따라 다른 값을 출력하는 새로운 field를 만드는 데 사용할 수 있다.

case when (조건문_1) then '출력값_1'
	 when (조건문_2) then '출력값_2'
     ...
     else '출력값_N+1' end

예시:

select pu.point_user_id, pu.point,
case 
when pu.point > 10000 then 'well done'
else 'not good'
END as '구분'
from point_users pu;

번외: select문 내 처리 순서

From → On → Join → Where → Group by → Select → Distinct → Order by

profile
Hallow Word!

0개의 댓글