(UMC) 5. 실전 SQL - 어떤 Query를 작성해야 할까?

jimmy·2024년 5월 16일
0

UMC 6기

목록 보기
5/11

테이블 조인

조인은 데이터베이스 내의 여러 테이블에서 가져온 레코드를 조합하여 하나의 테이블이나 결과 집합으로 표현해 주는 것이다.

INNER JOIN

  • 조인하는 테이블의 ON 절의 조건이 일치하는 결과만 출력
  • 조인에 부합되지 않는 레코드는 모두 삭제된다.
  • 표준 SQL과는 달리 MySQL에서는 JOIN, INNER JOIN, CROSS JOIN이 모두 같은 의미로 사용된다.
select u.userid, name 
from usertbl as u inner join buytbl as b 
on u.userid=b.userid 
where u.userid="111" -- join을 완료하고 그다음 조건을 따진다.

from 절에 콤마 쓰면 inner join으로 치부된다.

from usertbl u, buytbl b 

LEFT / RIGHT OUTER JOIN

OUTER JOIN은 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN이 있으며, LEFT OUTER JOIN을 대부분 사용하고, FULL OUTER JOIN은 성능상 거의 사용하지 않는다.
대부분 DB는 FULL OUTER JOIN을 지원하지 않는다.

LEFT OUTER JOIN

두 테이블이 있을 때, 첫 번째 테이블을 기준으로 두 번째 테이블을 조합하는 JOIN

LEFT JOIN을 여러번 할 때 주의할 점

  • INNER JOIN과 달리 조인하는 테이블 순서가 중요한데, 가장 첫 번째의 테이블로 SELECT문에 가장 많은 열을 가져와야 할 테이블을 우선으로 적어준다.
  • 조인을 여러 번 할 때, 시작을 LEFT JOIN으로 했다면 나머지 조인도 LEFT JOIN을 이어나간다.

RIGHT OUTER JOIN

두 테이블이 있을 때, 두 번째 테이블을 기준으로 두 번째 테이블을 조합하는 JOIN

UNION

  • 여러 개의 SELECT 문의 결과를 하나의 테이블이나 결과 집합으로 표현할 때 사용
  • 기본집합 쿼리에는 중복제거가 자동으로 포함되어있다.
  • UNION ALL을 사용하면 중복되는 레코드까지 모두 출력된다.

JOIN에서 중복된 레코드 제거하기

  1. SELECT 절에 DISTINCT 사용
  2. 서브쿼리를 사용하여 JOIN 전에 중복을 제거

출처: https://inpa.tistory.com/entry/MYSQL-📚-JOIN-조인-그림으로-알기쉽게-정리 [Inpa Dev 👨‍💻:티스토리]

서브쿼리

다른 쿼리 내부에 포함되어 있는 SELECT 문을 의미한다.

  • 괄호()로 감싸져서 표현 된다.
  • 서브 쿼리 실행 순서는 서브쿼리 실행 -> 메인(부모) 쿼리 실행 순으로 실행된다.

서브쿼리는 위치에 따라 명칭이 달라진다.

중첩 서브쿼리

WHERE 문에 나타나는 서브쿼리

where height > (select height from userTbl where name in ('김경호'));

-> 결과가 값이 하나여야 함

where height = any(select height from userTbl where addr in ('경남'));

조건에 값이 여러개 들어올땐 any.(any = in, or)

where population > all( select population from city where district = 'New York' );

-> all은 도출된 모든 조건값에 대해 만족할때(=and)

인라인 뷰

FROM 문에 나타나는 서브쿼리
무조건 AS 별칭을 지정해 주어야 한다.

스칼라 서브쿼리

SELECT 문에 나타나는 서브쿼리

서브 쿼리 실행 조건

  • 서브쿼리는 SELECT문으로만 작성 할 수 있다.
  • 반드시 괄호( )안에 존재하여야 한다.
  • 괄호가 끝나고 끝에 ;(세미콜론)을 쓰지 않는다.
  • ORDER BY를 사용 할 수 없다.
    (select * from table) 같이 괄호()안에 있는 쿼리를 서브 쿼리라 말한다

출처: https://inpa.tistory.com/entry/MYSQL-📚-서브쿼리-정리 [Inpa Dev 👨‍💻:티스토리]

페이징

Database자체에서 데이터를 끊어서 가져오는 것으로 2가지 형태가 존재한다.

Offset based 페이징

페이지 번호를 찾아내어 이동하는 페이징이다.

limit 10 offset 0;

위와 같이 limit을 통해서 한 페이지에 보여줄 데이터 개수를 정하고,
offset으로 몇 개를 건너뛸지 정한다.
한 페이지에 y개를 보여준다면?

limit y offset(x - 1) * y;

Offset paging의 단점은 페이지로 넘어갈 때 게시글이 추가되면 밀린다는 점이다.
이를 보완한 페이징 기법은 다음과 같다.

Cursor based 페이징

커서로 무언가를 가르켜 페이징을 하는 방법이다.
마지막으로 조회한 대상 그 다음부터 가져오게 하려면 다음과 같이 작성하면 된다.
마지막 조회한 대상 id가 3라고 하면,

select * from book where created_at < 
	(select created_at from book where id = 3)
		order by created_at desc limit 15;

하지만 실제 서비스에서는 커서 페이징을 잘 안하고 그냥 몇개 정도는 밀리게 둔다고 한다..

profile
백문이 불여일기

0개의 댓글