불러온 DB의 모든 table 들의 목록을 보여준다.
조회(read)를 위한 명령어이다. 기본적으로 어떤 table로 부터 어떤 field를 조회할지 정한다.
select [field1 명],[field2 명], ... from [table 명]
[field명]
부분에는 산술식을 이용하여 새로운 field를 만들어 조회할 수 있다.
select 뒤에서 어떤 table을 조회할지를 정한다. 뒤에는 subquery나 join한 table등 다양한 형태의 table이 올 수 있다.
조건을 걸어 조회할 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
조회할 데이터의 갯수를 제한한다. 데이터가 너무 많을 경우 본격적으로 분석, 정리하기 전 대략적인 형태를 파악할 때 사용하기 좋다.
select * from users
limit 5
field에 어떤 값들이 존재하는지 볼 때, 일일히 읽을 필요 없이 중복되는 값을 제거하여 보여준다.
select distinct(name) from users;
지정된 field의 조회할 record 들의 통계값을 계산하는 함수들이다. 각각 최소/최대 값, 평균, 총 갯수, 합산 값을 의미한다. count의 경우 NULL
값인 record는 세지 않는다.
select과 having 절에서만 사용가능하다.
select count(*) from users;
특정 field를 기준으로 record들을 범주화한다. 주로 집계함수와 함께 사용된다. ,
를 사용해 여러 field를 기준으로 범주화 할 수 있다.
select name, count(*) from users
group by name
특정 field를 기준으로 record들을 정렬한다. ,
를 사용해 여러 field를 기준으로 정렬 할 수 있다. asc
, desc
옵션을 통해 내림차순/오름차순도 정할 수 있다. 여러 field를 기준으로 쓸 경우각 field마다 따로 오름차순/내림차순을 적용가능하다. 배운 select절에서 사용하는 문법중 가장 마지막에 실행된다.
select name, count(*) from users
group by name
order by count(*) desc
두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것을 말한다. 옵션으로 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
두 테이블의 field가 모두 동일하다면 둘을 Union을 통해 record를 밑에 붙이는 형식으로 합칠 수 있다. subquery도 가능하다.
(select [필드1],[필드2] from [table1])
union all
(select [필드1],[필드2] from [table2])
orderby를 이용한 정렬이 최종 조회 결과물에서 먹히지 않는다.
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');
subquery를 이용한 쿼리문을 깔끔하게 만들어주기 위한 문법이다. 다음과 같이 작성한다.
with table1 as (
subquery_1
group by course_id
), table2 as (
subquery_2
)
select * from ...
문자열 데이터를 원하는 형태로 한번 정리하기 위한 함수이다.
substring_index: 특정 문자를 기준으로 문자열을 자르고 그 일부분을 가져온다.
SUBSTRING_INDEX([문자열 field], '기준 문자', n번째 조각)
select user_id, email, SUBSTRING_INDEX(email, '@', -1)
from users
위와같이 입력할 경우 email의 도메인부분(마지막 조각)만 잘라내 가져온다.
substring: 위치와 길이값을 지정해 문자열 중 원하는 부분만 가져온다.
SUBSTRING(문자열, 출력을 하고싶은 첫 글자의 위치, 출력할 문자 개수)
경우에 따라 다른 값을 출력하는 새로운 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;
From → On → Join → Where → Group by → Select → Distinct → Order by