
💡 SELECT 쿼리의 수행 순서
- FROM -> ON -> JOIN -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> ORDER BY
💡 Index에 대한 설명 & 장/단점
- Index란 테이블을 처음부터 끝까지 검색하는 방법인 FTS(Full Table Scan)과는 달리 인덱스를 검색하여 해당 자료의 테이블을 엑세스하는 방법이다.
- 예를 들어, DB를 책으로 비유하면
- 데이터 -> 책의 내용
- 데이터가 저장된 레코드의 주소 -> index 목록에 있는 페이지 번호
- 인덱스는 항상 정렬된 상태를 유지하기 때문에 값을 검색하는데 빠르지만, 새로운 값을 추가하거나 수정, 삭제하는 경우에는 쿼리문 실행 속도가 느려진다.
- 즉, 인덱스는 데이터의 저장 성능을 희생하고 그대신 데이터의 검색 속도를 높이는 기능이다.
💡 SQL Injection이란 ?
- SQL Injection이란 공격자가 악의적인 의도를 갖는 SQL 구문을 삽입하여 DB를 비정상적으로 조작하는 코드 인젝션 기법이다.
💡 트랜잭션이란 ?
- 작업들을 모두 처리하지 못할 경우 이전 상태로 복구하여 작업의 일부만 적용되는 현상이 발생하지 않게 만들어주는 기능이다.
- 하나의 트랜잭션은 Commit(작업완료)되거나 Rollback(취소) 된다.
💡 DB Lock에 대한 설명
- DB Lock은 트랜잭션 처리의 순차성을 보장하기 위한 방법이다.
- 공유락(LS, Shared Lock) Read Lock이라고도 하는 공유락은 트랜잭션이 읽기를 할 때 사용하는 락이며, 데이터를 읽기만 하기 때문에 공유락끼리는 동시에 접근이 가능하다.
- 베타락(LX, Exclusive Lock) Write Lock이라고도 하는 베타락을 데이터를 변경할 때 사용하는 락이며, 트랜잭션이 완료될 때까지 유지되며, 베타락이 끝나기 전까지 어떠한 접근도 허용하지 않는다.
💡 inner join과 outer join의 차이
- inner join은 서로 연관된 내용만 검색하는 조인 방법이다.
- A와 B에 대해 수행하는 것은, A와 B의 교집합을 말한다. 벤다이어그램으로 그렸을 때 교차되는 부분이다.
- outer join은 한 쪽에는 데이터가 있고 한 쪽에는 데이터가 없는 경우, 데이터가 있는 쪽의 내용을 전부 출력하는 방법이다.
- A와 B에 대해 수행하는 것은, A와 B의 합집합을 말한다. 벤다이어그램으로 그렸을 때 합집합 부분이다.
- outer join에는 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN이 있다.

💡 GROUP BY의 역할
- GROUP BY는 GROUP BY 명령어를 통해 특정 컬럼을 기준으로 연산한 결과를 집계 키로 정의하여 그룹을 짓는 역할을 한다.
- 집합 연산자는 COUNT, SUM, AVG, MAX, MIN 등이 있고, DISTINCT와 같이 중복 데이터를 제거하는 특징이 있다.
💡 DELETE, TRUNCATE, DROP의 차이
- DELETE는 데이터는 지우지만 테이블 용량은 줄어들지 않고 원하는 데이터만 골라서 지울 수 있다. 삭제 후 되돌릴 수 있다.
- TRUNCATE는 전체 데이터를 한번에 삭제하는 방식이다. 테이블 용량이 줄어들고 인덱스 등도 삭제되지만 테이블은 삭제할 수 없고, 삭제 후 되돌릴 수 없다.
- DROP은 데이블 자체를 완전히 삭제하는 방식(공간, 인덱스, 객체 모두)이다. 삭제 후 되돌릴수 없다.
💡 HAVING과 WHERE의 차이
- HAVING은 그룹을 필터링하는데 사용되고, WHERE은 개별 행을 필터링하는데 사용된다.
- 집계합수(COUNT, SUM, AVG, MAX, MIN 등)는 HAVING절과 함께 사용할 수 있으나, WHERE절은 사용할 수 없다.(집계함수를 사용할 수 있는 GROUP BY 절보다 WHERE절이 먼저 수행)
- HAVING은 그룹화 또는 집계가 발생한 후 필터링하는데 사용되고,
- WHERE은 그룹화 또는 집계가 발생하기 전에 필터링하는데 사용된다.
💡 JOIN에서 ON과 WHERE의 차이
- ON이 WHERE보다 먼저 실행되어 JOIN을 하기 전에 필터링을 하고(ON 조건으로 필터링이 된 레코들간에 JOIN이 이뤄진다.)
- WHERE은 JOIN을 한 후에 필터링을 한다.(JOIN을 한 결과에서 WHERE 조건절로 필터링이 이뤄진다)