데이터베이스(5) 쿼리 & JOIN &SQL Injection

InSeok·2023년 1월 17일
0

CS

목록 보기
5/11

쿼리

SELECT 쿼리의 수행 순서

FROM, ON, JOIN > WHERE, GROUP BY, HAVING > SELECT > DISTINCT > ORDER BY > LIMIT

1. FROM

  • 각 테이블을 확인한다.

2. ON

  • JOIN 조건을 확인한다.

3. JOIN

  • JOIN이 실행되어 데이터가 SET으로 모아지게 된다. 서브쿼리도 함께 포함되어 임시 테이블을 만들 수 있게 도와준다.

2. WHERE

  • 데이터셋을 형성하게 되면 WHERE의 조건이 개별 행에 적용된다. WHERE절의 제약 조건은 FROM절로 가져온 테이블에 적용될 수 있다.

3. GROUP BY

  • WHERE의 조건 적용 후 나머지 행은 GROUP BY절에 지정된 열의 공통 값을 기준으로 그룹화된다. 쿼리에 집계 기능이 있는 경우에만 이 기능을 사용해야 한다.

4. HAVING

  • GROUP BY절이 쿼리에 있을 경우 HAVING 절의 제약조건이 그룹화된 행에 적용된다.

5. SELECT

  • SELECT에 표현된 식이 마지막으로 적용된다.

6. DISTINCT

  • 표현된 행에서 중복된 행은 삭제

7.ORDER BY

  • 지정된 데이터를 기준으로 오름차순, 내림차순 지정

8. LIMIT

  • LIMIT에서 벗어나는 행들은 제외되어 출력된다.

GroupBy

  • GROUP BY 명령어를 통해 특정 컬럼을 기준으로 연산한 결과를 집계 키로 정의하여 그룹을 짓는 역할

Having과 Where의 차이

  • having은 그룹을 필터링 하는데 사용되고, where은 개별 행을 필터링하는데 사용됩니다.
  • having은 그룹화 또는 집계가 발생한 후 필터링하는데 사용되고,
  • where은 그룹화 또는 집계가 발생하기 전에 필터링하는데 사용됩니다.

조인

  • 하나의 테이블이 아닌 두 개 이상의 테이블을 묶어서 하나의 결과물을 만드는것
    • MySQL - JOIN
    • MongoDB - lookup
  • 종류
    • 내부 조인(inner join) : 양쪽 테이블에서 모두 일치하는 행이 있는 부분만 표기

    • 왼쪽 조인(left join): 왼쪽 테이블의 모든 행이 결과 테이블에 표기 → 왼쪽테이블이 기준이며 , 오른쪽 테이블에 일치하는 항목이 없으면 해당값은 null 값이 된다.

      Untitled

  • 원리
    • 중첩 루프 조인

      • 첫 번째 테이블에서 행을 한번에 하나씩 읽고 그다음 테이블에서도 행을 하나씩읽어 조건에 맞는 레코드를 찾아 결과값을 반환
      • 랜덤 접근에 대한 비용이 많이 증가하므로 대용량 테이블에서는 사용하지 않음
    • 정렬 병합 조인

      • 각각의 테이블을 조인할 필드 기준으로 정렬하고 정렬이 끝난 이후에 조인 작업을 수행하는 조인
      • 적절한 인덱스가 없고, 대용량 테이블들을 조인하고 조인조건으로 범위비교 연산자가 있을때 사용
    • 해시 조인

      • 해시 테이블 기반으로 조인
      • 동등 조인에서만 사용가능
      • 각 테이블을 한번씩만 읽어 보통 중첩 루프 조이보다 성능이 더 좋다.
      • 과정
        • 빌드 단계
          • 입력 테이블중 하나를 기반으로 메모리 내 해시 테이블을 빌드하는 단계
        • 프로브 단계
          • 레코드 읽기를 시작하며 해시 테이블을 기반으로 일치하는 레코드를 찾아 결과값으로 반환
    • Join에서 ON과 Where의 차이

      • ON 이 WHERE 보다 먼저 실행되어 JOIN 을 하기 전에 필터링을 하고 (=ON 조건으로 필터링이 된 레코들간 JOIN이 이뤄진다)
      • WHERE은 JOIN 을 한 후에 필터링을 합니다. (=JOIN을 한 결과에서 WHERE 조건절로 필터링이 이뤄진다)
    • Delete, Truncate, Drop 차이
      - DELETE는 데이터는 지우지만 테이블 용량은 줄어들지 않고 원하는 데이터만 골라서 지울 수 있습니다. 삭제 후 되돌릴 수 있습니다.
      - TRUNCATE는 전체 데이터를 한번에 삭제하는 방식입니다. 테이블 용량이 줄어들고 인덱스 등도 삭제되지만 테이블은 삭제할 수 없고,  삭제 후 되돌릴 수 없습니다.
      - DROP은 테이블 자체를 완전히 삭제하는 방식(공간, 인덱스, 객체 모두 삭제)입니다. 삭제 후 되돌릴 수 없습니다.

      SQL Injection

    • 공격자가 악의적인 의도를 갖는 SQL 구문을 삽입하여 데이터베이스를 비정상적으로 조작하는 코드 인젝션 공격 기법입니다.

    • 방어방법

      • 사용자의 입력이 쿼리에 동적으로 영향을 주는 경우 입력된 값이 유효값 인지 검증합니다.
      • 저장 프로시저를 사용합니다. ※ 저장 프로시저란 사용하고자 하는 Query에 미리 형식을 지정하는 것을 말한다. 지정된 형식의 데이터가 아니면 Query가 실행되지 않기 때문에 보안성이 향상한다.
profile
백엔드 개발자

0개의 댓글