DB 면접 스터디 2주차

@kdkdhoho · November 28, 2023 · 12 min read

📝 질문 리스트

SQL에 대해서 설명해주세요. C언어와 같은 프로그래밍 언어와 어떤 차이가 있나요?

SQL은 DBMS에게 명령하는 언어입니다.

반면 C언어는 프로그래머가 작성한 코드가 C언어 컴파일러에 의해 기계어로 번역이 됩니다.
이 기계어는 OS에 의해 코드가 작성된대로 실행됩니다. 

즉, SQL은 DMS에게 요청을 보내는 반면 프로그래밍 언어는 미리 작성된 대로 수행된다는 차이점이 있습니다.

개발자가 작성한 SQL이 어떤 과정을 통해 실행 되는지 설명해주세요.

크게 나눠 파싱, 최적화, 실행의 단계로 실행됩니다.

DBMS는 개발자가 작성한 SQL문을 파싱하고 문법 오류가 없는지 검사합니다.
오류가 없다면 파싱한 SQL문을 통해 가장 효율적인 실행 계획을 수립합니다.
그 다음 최적화된 실행 계획에 따라 쿼리문을 실행합니다.

DML은 무엇인가요? 어떤 구문이 있는지도 설명해주세요.

데이터를 조작하는 쿼리문입니다.
테이블에 저장된 데이터와 관련된 쿼리문으로 이해하고 있습니다.

INSERT, SELECT, UPDATE, DELETE 문이 있습니다.

DDL은 무엇인가요? 어떤 구문이 있는지도 설명해주세요.

데이터를 정의하는 언어입니다.
테이블과 관련된 쿼리문으로 이해하고 있습니다.

보통 CREATE, ALTER, DROP, TRUNCATE 문이 있습니다.

DCL은 무엇인가요? 어떤 구문이 있는지도 설명해주세요.

주로 보안과 관련된 언어업니다.

GRANT, REVOKE, COMMIT, ROLLBACK 문이 있습니다.

참조 무결성에 대해서 설명해주세요.

테이블 간의 관계를 정의할 때 반드시 지켜야하는 제약 조건입니다.

외래키를 설정할 때 반드시 관계를 맺으려는 테이블의 기본키 값으로 해야 한다는 것입니다.
만약 값이 없을 경우 외래키 값은 NULL이 될 수도 있습니다.

CASCADE 설정에 대해서 설명해주세요.

외래키를 참조하고 있는 행에 삭제 또는 변경이 발생할 때, 그에 따라 참조하고 있는 행을 동시에 관리하는 옵션입니다.

UPDATE CASCADE의 경우 참조되는 기본키가 변경될 때, 참조하는 행의 외래키도 함께 변경합니다.
DELETE CASCADE의 경우 참조되는 기본키의 행이 삭제될 때, 참조하는 행도 함께 삭제한다는 것입니다. 

VIEW에 대해서 설명해주세요.

기존 테이블에서 사용자가 필요로한 데이터만을 따로 추출하여 만든 임의의 가상 테이블입니다.

VIEW는 실제로 물리적으로 저장하지 않고 기존 테이블의 데이터를 참조하여 가상으로 생성됩니다.
이를 통해 대규모거나 복잡한 데이터 조회의 경우 VIEW 테이블로 추출하여 쉽고 빠르게 조회할 수 있습니다.

하지만 VIEW가 참조하고 있는 데이터가 변경될 경우, VIEW도 함께 변경해줘야 한다는 특징이 있습니다. 

SELECT 절의 처리순서에 대해서 설명해주세요.

FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY 순으로 처리됩니다.

SELECT ~ FOR UPDATE 구문에 대해서 설명해주세요.

SELECT 절에 해당하는 행들에 접근할 때 LOCK을 설정하는 구문입니다.

이 구문을 사용하면 해당 행에는 하나의 트랜잭션 만이 값을 변경할 수 있습니다.
LOCK이 걸린 도중에 다른 트랜잭션이 동일한 행을 수정하려 한다면 LOCK이 해제될 때까지 대기해야합니다.
이 LOCK은 커밋 또는 롤백을 할 때까지 유지됩니다.

이를 통해 동시성 문제를 해결할 수 있지만, 성능에 악영향을 줄 수 있습니다.

GROUP BY 절에 대해서 설명해주세요.

GROUP BY 절을 통해 특정 칼럼의 데이터를 그룹화할 수 있습니다.

보통 집계 함수와 함께 사용하여 유의미한 결과를 도출할 수 있습니다.

ORDER BY 절에 대해서 설명해주세요.

쿼리의 결과를 특정 열을 기준으로 정렬하기 위해 사용하는 절입니다.

기본적으로 오름차순으로 정렬을 하지만 내림차순으로 정렬할 수 있으며,
정렬의 기준이 되는 열을 2개 이상 설정할 수 있습니다. 

INNER JOIN과 OUTER JOIN에 대해서 설명해주세요.

INNER JOIN은 JOIN 하려는 두 테이블의 특정 열을 기준으로 동일한 행들만 반환하는 명령어입니다.

OUTER JOIN은 두 테이블의 동일한 행 뿐만 아니라, 조건에 일치하지 않는 특정 테이블의 행들도 함께 반환하는 명령입니다.

LEFT OUTER JOIN, RIGHT OUTER JOIN에 대해서 설명해주세요.

LEFT OUTER JOIN은 JOIN 시에 왼쪽, 즉 기준이 되는 테이블의 모든 행과, JOIN 조건에 일치하는 행들을 모두 반환합니다.

RIGHT OUTER JOIN은 LEFT와 반대로 오른쪽, 즉 JOIN이 되는 테이블의 모든 행과 JOIN 조건에 일치하는 행들을 모두 반환합니다.

CROSS JOIN에 대해서도 설명해주세요.

첫 번째 테이블의 모든 각 행이 두 번째 테이블의 전체 행과 결합하는 방식의 JOIN입니다.

두 테이블의 각 전체 데이터 수를 곱한 크기의 JOIN 결과가 반환됩니다.

서브쿼리에 대해서 설명해주세요.

쿼리문 안에서 실행되는 또 다른 쿼리문입니다.

주로 쿼리문 안에서 추가적인 쿼리문이 필요할 때 사용합니다.

DROP, TRUNCATE, DELETE에 각각에 대해 설명해주세요. 어떤차이가 있나요?

DROP은 테이블 자체를 삭제하는 명령입니다.
TRUNCATE는 테이블은 그대로 두고 테이블 안에 있는 모든 데이터를 삭제하는 명령입니다.
DELETE는 테이블 안에 있는 특정 행을 삭제하는 데 사용합니다.

DROP, TRUNCATE는 롤백을 할 수 없지만 DELETE는 롤백이 가능합니다.
DROP, TRUNCATE는 빠른 속도로 실행되지만 DELETE는 조건을 비교하는 과정이 필요하기에 시간이 오래 걸릴 수 있습니다.

DISTINCT에 대해서 설명해주세요. 사용해본 경험도 설명해주세요.

쿼리 결과에서 특정 칼럼에 해당하는 데이터의 중복을 제거한 결과를 반환하는 명령어입니다.

셀럽잇 프로젝트에서 음식점 테이블과 비디오 테이블을 음식점 ID로 JOIN하는 과정이 존재했습니다.
이때 음식점 테이블과 비디오 테이블은 1:다 관계였기에 JOIN 결과로 같은 음식점이 2개 이상 존재하는 상황이 발생했습니다.
따라서 이때 생기는 중복을 제거하기 위해 사용한 경험이 있습니다.

SQL Injection 공격이 무엇인지 어떻게 공격을 예방할 수 있는지 설명해 주세요.

악의적인 사용자가 입력 필드를 통해 서버에 SQL 쿼리를 주입하여 DB에 대한 공격을 시도하는 행위입니다.

이를 방지하기 위해 입력값을 직접 쿼리문에 넣지 않고, 쿼리를 파라미터화하여 공격을 예방할 수 있습니다.

알고 있는 SQL 안티패턴이 있다면 설명해주세요.

'SELECT *' 을 사용하는 것입니다.

이는 불필요한 열의 데이터까지 모두 가져오기에 불필요한 오버헤드가 발생할 수 있습니다.
실제로 셀럽잇 프로젝트에서 음식점 테이블과 행정구역 테이블을 통해 공간 인덱스를 활용하려는 시도에서,
실수로 SELECT * 을 사용하여 항상 테이블 풀 스캔의 결과가 발생했고
이를 뒤늦게 발견하여 의도했던 결과가 나오지 않았던 것을 알게 된 경험이 있습니다.

추가로 비효율적인 JOIN, 서브쿼리 남용 등이 있습니다.

페이지네이션을 구현한다고 했을때 쿼리를 어떻게 작성해야할까요?

MySQL을 기준으로 LIMIT과 OFFSET을 통해 구현할 수 있습니다.

OFFSET을 통해 쿼리 결과에서 n번 째부터 LIMIT의 수만큼의 데이터만을 가져옴으로써 페이지네이션을 구현할 수 있습니다.
@kdkdhoho
기본에 충실하게