총정리
도대체 sql이 왜 필요한가???
장사를 하는 중 문제가 생겼을 때 빠르고 정확하게 특정 데이터를 받아오기 위해서 사용한다.
장점: DATA BASE에 방대한 양을 저장할 수 있다, 방대양 양을 빠르게 불러올 수 있다.
@즉 데이터를 잘 꺼내오기 위해서 사용하는 것이다.
CRUD:
C:Create -> 데이터 생성
R:Read -> 저장된 데이터를 읽어 오는 것
U:Update -> 저장된 데이터를 변경!
D:Delete -> 저장된 데이터를 삭제하는 것을 의미.
SELET -> 어떤 테이블에서 어떤 필드에서 데이터를 가져오는 가??
ex) SELECT order_no, created_at, user_id, email FROM orders
문법 필드 문법 데이터
자동완성시 별칭이 붙을 수 있다. ex) e,d
select 에 부속 조건 where
show tables ---> 테이블의 목록을 볼 수 있다.
where절에 따라오는 부속
* != 같지않다.
* between and --> 어디부터 어디 사이
* in (1,3) 괄호안에 있는 숫자 즉 포함된 숫자를 나타내라
*like -> 문자열 비교 '%daum.net' %-> 앞에 뭐가 있던 간에 뒤에 문장으로 끝나는 것을 의미한다.
퀴즈
1. 결제수단이 CARD가 아닌 주문데이터만 보기
SELECT * FROM orders
WHERE payment_method != 'CARD'
2. 20000~30000 포인트 보유하고 있는 유저만 추출해보기
SELECT * FROM point_users
where point BETWEEN 20000 and 30000
3. 이메일이 s로 시작하고 com으로 끝나는 유저만 추출해보기
SELECT * FROM users
WHERE email like 's%.com'
4. 이메일이 s로 시작하고 com으로 끝나면서 성이 이씨인 유저만 추출해보기
SELECT * FROM users
WHERE email like 's%.com' and name LIKE '이%'
Limit -> 많은 목록 들중에 원하는 갯수만큼만 보고싶을 때 사용
distinct -> 중복을 제거하고 출력
통계적인 숫자를 뽑아보자
SELECT name, COUNT(*) from users group by name
group by ---->묶어라
이름별로 묵어 줘라
주차별로 묶은 것을 카운트해라
SELECT week ,COUNT(*) from checkins
group by week
round(avg(like))
---->평균을 반올림하자
count() 숫자를 세는 것
order by ---> 순서정렬
desc --->내림차순으로 정렬
group by와 별계로 사용된다.
앱개발 종합반의 결제 수단별 주문 건수 세어보기
SELECT payment_method ,COUNT(*) from orders
WHERE course_title LIKE '앱개발 종합반'
GROUP BY payment_method
Gmail을 사용하는 성씨별 회원수 세어보기
SELECT name, COUNT(*) from users
WHERE email LIKE '%gmail.com'
GROUP BY name
*조회하는 팁
먼저 테이블을 전체를 관람하고.
내가 무엇을 원하는 지 파악한다.
필드를 확인하고 통계를 낸다.
courde_id별 평균 like 갯수를 구하기
SELECT course_id, ROUND(AVG(likes)) from checkins
group by course_id
별칭 ---> alias
쿼리가 길어질 수록 헷갈리게 되는데 너무 긴 것을 별칭을 붙이면 편하다.
ex) select * from orders o
where o.course_title = '앱개발 종합반'
select 목록에 있는 이름이 마음이 안들때는
count(*) as cnt ---->하면 별칭을 이용할 수 있다.
day3
join ---> 테이블이 나누어 져있는데 어떠한 한 기준으로 테이블을 병합시킨다.
*두 테이블의 공통된 정보를 기준으로 테이블을 연결해서 한 테이블로 보는것.
sql == vlookup이랑 비슷하다.
left join 과 inner 조인만 잘써도 된다.
<left join>
users 테이블과 point_users 테이블의 공통요소로 join
SELECT * from users u
left join point_users p
on u.user_id = p.point_user_id
<inner join>
SELECT * from users u
inner join point_users p
on u.user_id = p.user_id
투 테이블 병합하기
select * from orders o
inner join users u on o.user_id = u.user_id
커리가 실행되는 순서: from ->join->select
*
SELECT COUNT(comment) from checkins c
inner join courses c2 on c.course_id = c2.course_id
group by c.course_id
~별 --->group by
조건 ---> where
leftjoin ---> 없는 것들도 join해서 통계를 내고 싶을 때 사용한다.
inner join -->공통된 녀석들만 보여준다
()
union all
()
-----> union all을 사용하면 order by가 먹히지 않는다.
합친다.
day4
subquery:
where 절과 from 절 select 절에 다른 쿼리문을 입력해서 출력하는 방식이다.
ex) select * from point_users pu
where point > (
select avg(point) from point_users pu
inner join users u on pu.user_id = u.user_id
where u.name = '이**'
)
*이씨 성을 가진 사람들의 평균보다 높은 사람들을 구하여라*
inner join을 사용하지 않을 경우
select * from point_users pu
where point>(
select avg(point) from point_users pu
where user_id in (
select user_id from users where name= '이**'
)
)
with 절에 대해 연습하자
테이블을 만들어준다
table2 as (
select course_id, count(*) as cnt_total from orders
group by course_id
)
실전에서 유용한 sql문법을 가지고 놀아보자.
select user_id, email, substring_index(email,'@',-1) from users
select 절에서 case when pu.point>10000 then '잘하고 있어요!'
else '조금만더 화이팅' end) as msg
---> if else 조건처럼 사용 가능하다.