본문 바로가기

Study/개발일지

[엑셀보다쉬운sql] 개발일지 4주차 -sql 학습내용정리

SQL은 Structured Query Language의 약자인데요, 결국 데이터베이스에 요청 (Query)을 날려서 원하는 데이터를 가져오는 것을 도와주는 언어





쿼리(Query)문이란? 쿼리는 질의를 의미하죠. 데이터베이스에 명령을 내리는 것을 의미합니다. 여기서 Select 쿼리문은, 데이터베이스에서 '데이터를 선택해서 가져오겠다'는 의미입니다.

Where 절의 개념
 👉 Where 절은, Select 쿼리문으로 가져올 데이터에 조건을 걸어주는 것을 의미해요.

where 절과 함께 between , in, like 등을 사용가능





 👉 데이터베이스란? 여러 사람들이 같이 사용할 목적으로 데이터를 담는 통이라고 생각하면 되어요.



 👉 원하는대로 데이터를 저장하고 사용하기 위해서는 다양한 기능이 있어야겠죠? 그래서 통상적으로, 모든 데이터베이스는 CRUD에 해당하는 기능을 지원해요.

C (Create): 데이터의 생성을 의미합니다 R (Read): 저장된 데이터를 읽어오는 것을 의미해요 U (Update): 저장된 데이터를 변경! D (Delete): 저장된 데이터를 삭제하는 것을 의미해요









별칭 기능: Alias
 👉 쿼리가 점점 길어지면서 종종 헷갈리는 일이 생길 수 있습니다. 그래서 SQL은 Alias라는 별칭 기능을 지원합니다.
스파르타 회원: 성씨별로 몇 명의 회원이 있는지 알아보자
[코드스니펫] 성씨별 회원수를 Group by로 쉽게 구해보기
아래와 같은 결과가 나옵니다!

select name, count(*) from users group by name;
어떻게 이렇게 쉽게 되었을까요?
from users: users 테이블에서 데이터를 불러옵니다
group by name: name이라는 필드에서 동일한 값을 갖는 데이터를 하나로 합쳐줍니다
select name, count(): 이름과 count()를 출력해 주는데, 여기서 count(*)는 group by로 합쳐진 데이터의 개수를 세어주는 것입니다!
select name, count(*) from users group by name;
 👉 자, 차근차근 쿼리를 같이 볼까요?
 👉 쿼리는 열 번 듣는 것보다, 한 번 따라해보는게 빨리 배웁니다! 바로 쿼리로 가볼까요?
 👉 성씨별로 몇 명이 회원이 있는지 구하려고 where 절을 사용해서 수십개의 쿼리를 작성하는 것은 너무 비효율적입니다. 이 문제를 Group by를 사용해서 어떻게 해결할 수 있을까요?








 🔥 SQL에서 쿼리가 실행되는 순서를 아는 것은 정말 중요해요. 함께 단계별로 살펴봐요!



select name, count(*) from users
group by name;
 👉 위 쿼리가 실행되는 순서: from → group by → select



from users: users 테이블 데이터 전체를 가져옵니다.
group by name: users 테이블 데이터에서 같은 name을 갖는 데이터를 합쳐줍니다.
select name, count(*): name에 따라 합쳐진 데이터가 각각 몇 개가 합쳐진 것인지 세어줍니다.
예) 이**, 이**, 김**, 김**, 박** 이렇게 데이터가 있었다면, 이는 2개, 김은 2개, 박**은 1개겠죠!






Join의 종류: Left Join, Inner Join
Left Join: 유저 데이터로 Left Join 이해해보기생각하는 그 그림이 맞아요! SQL에서의 Join은 두 집합 사이의 관계와 같답니다
여기서 A와 B는 각각의 테이블을 의미합니다. 둘 사이의 겹치는 부분은, 뭔가 테이블 A와 B의 key 값이 연결되는 부분일 것 같지 않나요?
[코드스니펫] 유저 데이터로 Left Join 이해해보기
select * from users u left join point_users p on u.user_id = p.user_id;
 👉 어떤 데이터는 모든 필드가 채워져있지만, 어떤 데이터는 비어있는 필드가 있습니다.
비어있는 데이터의 경우, 회원이지만 수강을 등록/시작하지 않아 포인트를 획득하지 않은 회원인 경우에요
꽉찬 데이터: 해당 데이터의 user_id 필드값이 point_users 테이블에 존재해서 연결한 경우 비어있는 데이터: 해당 데이터의 user_id 필드값이 point_users 테이블에 존재하지 않는 경우

 👉 앗! 어디서 많이 본 그림 아닌가요?






 👉 join이란? 두 테이블의 공통된 정보 (key값)를 기준으로 테이블을 연결해서 한 테이블처럼 보는 것을 의미해요.

예) user_id 필드를 기준으로 users 테이블과 orders 테이블을 연결해서 한 눈에 보고 싶어요!



 👉 위의 예시와 같이, 두 테이블의 정보를 연결해서 함께 보고싶을 때가 있겠죠?

그럴 때를 대비해서 무언가 연결된 정보가 있을 때, user_id 처럼 동일한 이름과 정보가 담긴 필드를 두 테이블에 똑같이 담아놓는답니다. 이런 필드를 두 테이블을 연결시켜주는 열쇠라는 의미로 'key'라고 불러요.





 👉 Subquery란? 쿼리 안의 쿼리라는 의미입니다.

하위 쿼리의 결과를 상위 쿼리에서 사용하면, SQL 쿼리가 훨씬 간단해져요!



즉, Subquery를 사용하지 않아도 원하는 데이터를 얻어낼 수 있겠지만, 더 편하고 간단하게 원하는 데이터를 얻기 위해 사용되는 파워풀한 기능입니다.
Subquery에 대한 이해도가 생기면, With구문을 이용해서 더 간단하게 만들어볼게요!


with 절 사용 

with table1 as ( select course_id, count(distinct(user_id)) as cnt_checkins from checkins group by course_id ), table2 as ( select course_id, count(*) as cnt_total from orders group by course_id ) select c.title, a.cnt_checkins, b.cnt_total, (a.cnt_checkins/b.cnt_total) as ratio from table1 a inner join table2 b on a.course_id = b.course_id inner join courses c on a.course_id = c.course_id





728x90