[개발일지] [왕초보] 엑셀보다 쉬운, SQL 4주차 과제 - 문법 총 정리
1. 기본
-- table 목록 확인하기
show tables
-- table 열기
select * from tbl1
-- 처음 몇 개의 행만 열기
select * from tbl1 limit 10
2. Select
1) 필요한 필드 추출하기
테이블 tb1l에서 var1, var2를 추출하자.
select var1, var2 from tbl1
2) 통계
as 이름
을 통해 통계낸 필드의 이름을 정할 수 있다.- 테이블 tbl1에서 course_title별 개수를 cnt 필드로 추출하자.
select course_title, count(course_title) as cnt from tbl1
함수 | 설명 |
---|---|
count()/avg()/min()/max() | 개수/평균/최소값/최대값 |
round(var1,n) | var1을 n자리까지 나타낸다. |
distinct(var1) | var1의 종류를 나타낸다. ex)distinct(payment_method), 결제수단 종류 |
substring_index(var1,’구분값’,1 or -1) | var1에서 ‘구분값’을 기준으로 1(왼쪽)/-1(오른쪽) 문자를 추출한다. |
substring(var1, n1, n2) | var1에서 n1번째부터 n2번째까지의 문자만 추출한다. |
3. Where
조건 | 설명 |
---|---|
=/!= | 같다/같지 않다. |
>/>=/</<= | 크다/크거나 같다/작다/작거나 같다 |
is NULL/is not NULL | NULL이면 TRUE/NULL이 아니면 TRUE |
between a and b | a보다 크거나 같고 b보다 작다 |
like ‘패턴’ | 패턴과 같으면 TRUE ex)’%naver.com’ 이메일 주소가 네이버이면 TRUE |
in (a, b, c) | a이거나 b 또는 c이면 TRUE |
4. Group by / Order by
1) Group by
- where 문도 같이 쓸 경우 group by보다 선행되어야 한다.
- 테이블 tbl1에서 grp별 개수를 구해보자.
select grp, count(*) as cnt from tbl1 group by grp
2) Order by
- 정렬은 맨 마지막에 실행되어야 한다.
- 기본값은 오름차순, 내림차순은 끝에
desc
를 추가한다. - var1에 대해 내림차순으로 정렬해보자.
select * from tbl1 order by var1 desc
6. Inner Join / Left Join
1) Inner Join
- 두 테이블에 모두 존재하는 key만 결합한다.
- 테이블의 별칭을 이용하면 편리하다.
- table1 : mykey, var1, var2
table2 : mykey, var3, var4
table1(별칭, t1)과 table2(별칭, t2)를 inner join해보자.select * from table1 t1 inner join table2 t2 on t1.mykey = t2.mykey
2) Left Join
- 왼쪽 테이블의 key에 맞춰 결합한다.
- 왼쪽 테이블의 key에 맞는 오른쪽 테이블의 정보가 없으면
NULL
로 표현된다. - table1 : mykey, var1, var2
table2 : mykey, var3, var4
table1(별칭, t1)과 table2(별칭, t2)를 left join해보자.select * from table1 t1 left join table2 t2 on t1.mykey = t2.mykey
7. Union
- 테이블을 위 아래로 합칠 때 사용한다.
- table1 : mykey, var1, var2
table2 : mykey, var1, var2
table1(별칭, t1)과 table2(별칭, t2)를 union으로 합쳐보자.( select * from table1 t1 ) union ( select * from table2 t2 )
8. With
- 쿼리로 이루어진 테이블들을 결합할 때 With를 이용하여 임시 테이블을 만들어 쿼리를 더 보기 쉽게 정리할 수 있다.
- 쉽게 이해할 수 있도록 임의의 테이블, 필드명을 지정하자.
table1: ID, course_ID, user_ID, course_title, email
table2: ID, course_ID, user_ID, week, likes - course별로 강의를 등록한 사람 중 강의를 들은 사람의 비율을 구하자.
with tbl1 as (
select course_ID, course_title, count(*) as cnt from table1
group by course_ID
), tbl2 as (
select course_ID, count(distinct(user_id)) as tot_cnt from table2
group by course_ID
)
select t1.course_ID, t1.course_title, t1.cnt, t2.tot_cnt,
round((cnt/tot_cnt)*100,2) as perc
from tbl1 t1
inner join tbl2 t2 on t1.course_ID = t2.course_ID
9. Case when
- 쉽게 이해할 수 있도록 임의의 테이블, 필드명을 지정하자.
table1: ID, name, age, email, points - 포인트를 5천, 1만을 기준으로 그룹을 나누자.
select ID, points,
case when t1.point < 5000 then '5천 미만'
when t1.point >= 10000 then '1만 이상'
else '5천 이상' end as lvl
from table1
10. 복잡한 코드 정리 : Subquery
- 쉽게 이해할 수 있도록 임의의 테이블, 필드명을 지정하자.
table1: ID, name, age, email, points
table2: ID, method, likes
1) Where + Subquery
- method가 “A”인 유저의 ID, name, email만 추출하자.
select ID, name, email from table1
where ID in (
select ID from table2
where method = "A"
)
2) Select + Subquery
- table2에 ID에 대한 likes의 평균인 average 열을 추가하자. 이때 평균은 소수점 한자리까지 나타내자.
select t2.ID, t2.method,
(
select round(avg(likes),1) from table2
where ID = t2.ID
) as average
from table2 t2
3) From + Subquery
- table1에 table2의 ID별 likes 평균 average를 결합하고, ID, name, points, average만 추출하자. 이때 평균은 소수점 한자리까지 나타내자.
select t1.ID, t1.points, t2.average from table1 t1
inner join (
select ID, round(avg(likes),1) as average from table2
group by ID
) t2 on t1.ID = t2.ID
댓글남기기