쿼리
SELECT 쿼리의 수행 순서
FROM, ON, JOIN > WHERE, GROUP BY, HAVING > SELECT > DISTINCT > ORDER BY > LIMIT
1. FROM
2. ON
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 값이 된다.
- 원리
-
중첩 루프 조인
- 첫 번째 테이블에서 행을 한번에 하나씩 읽고 그다음 테이블에서도 행을 하나씩읽어 조건에 맞는 레코드를 찾아 결과값을 반환
- 랜덤 접근에 대한 비용이 많이 증가하므로 대용량 테이블에서는 사용하지 않음
-
정렬 병합 조인
- 각각의 테이블을 조인할 필드 기준으로 정렬하고 정렬이 끝난 이후에 조인 작업을 수행하는 조인
- 적절한 인덱스가 없고, 대용량 테이블들을 조인하고 조인조건으로 범위비교 연산자가 있을때 사용
-
해시 조인
- 해시 테이블 기반으로 조인
- 동등 조인에서만 사용가능
- 각 테이블을 한번씩만 읽어 보통 중첩 루프 조이보다 성능이 더 좋다.
- 과정
- 빌드 단계
- 입력 테이블중 하나를 기반으로 메모리 내 해시 테이블을 빌드하는 단계
- 프로브 단계
- 레코드 읽기를 시작하며 해시 테이블을 기반으로 일치하는 레코드를 찾아 결과값으로 반환
-
Join에서 ON과 Where의 차이
- ON 이 WHERE 보다 먼저 실행되어 JOIN 을 하기 전에 필터링을 하고 (=ON 조건으로 필터링이 된 레코들간 JOIN이 이뤄진다)
- WHERE은 JOIN 을 한 후에 필터링을 합니다. (=JOIN을 한 결과에서 WHERE 조건절로 필터링이 이뤄진다)
-
Delete, Truncate, Drop 차이
- DELETE는 데이터는 지우지만 테이블 용량은 줄어들지 않고 원하는 데이터만 골라서 지울 수 있습니다. 삭제 후 되돌릴 수 있습니다.
- TRUNCATE는 전체 데이터를 한번에 삭제하는 방식입니다. 테이블 용량이 줄어들고 인덱스 등도 삭제되지만 테이블은 삭제할 수 없고, 삭제 후 되돌릴 수 없습니다.
- DROP은 테이블 자체를 완전히 삭제하는 방식(공간, 인덱스, 객체 모두 삭제)입니다. 삭제 후 되돌릴 수 없습니다.
SQL Injection
-
공격자가 악의적인 의도를 갖는 SQL 구문을 삽입하여 데이터베이스를 비정상적으로 조작하는 코드 인젝션 공격 기법입니다.
-
방어방법
- 사용자의 입력이 쿼리에 동적으로 영향을 주는 경우 입력된 값이 유효값 인지 검증합니다.
- 저장 프로시저를 사용합니다. ※ 저장 프로시저란 사용하고자 하는 Query에 미리 형식을 지정하는 것을 말한다. 지정된 형식의 데이터가 아니면 Query가 실행되지 않기 때문에 보안성이 향상한다.