면접 예상 질문
- SQL에 대해서 설명해주세요. C언어와 같은 프로그래밍 언어와 어떤차이가 있나요?
SQL(Structured Query Language)은 주로 관계형 데이터베이스에서 데이터를 조작하기 위한 언어로,
데이터 검색, 삽입, 갱신 및 삭제와 같은 작업을 수행합니다.
SQL은 데이터베이스와의 상호작용에 중점을 두고 있으며, 데이터 정의와 조작을 위한 특수한 명령어를 제공합니다.
반면 C언어는 범용 프로그래밍 언어로, 다양한 응용 분야에서 사용되며,
시스템 프로그래밍부터 게임 개발, 웹개발 등 과 같은 응용 프로그래밍까지 다양한 영역에서 활용됩니다.
- 개발자가 작성한 SQL이 어떤 과정을 통해 실행 되는지 설명해주세요.
먼저, SQL 쿼리는 데이터베이스 관리 시스템(DBMS)에 전달되어 파싱되고, 문법적 오류를 확인합니다.
그 다음 최적화 단계에서는 효율적인 실행 계획을 수립하고, 데이터 액세스 경로를 결정합니다.
최적화된 실행 계획이 결정되면, 실행 엔진은 쿼리를 실제로 실행하고 데이터베이스에서 결과를 가져와서 사용자에게 반환합니다.
이 과정에서 인덱스 사용, 조인 최적화, 필요한 데이터만을 읽어오는 등의 최적화 기법이 적용되어 성능을 향상시킵니다.
- DML은 무엇인가요? 어떤 구문이 있는지도 설명해주세요.
DML은 데이터 조작 언어(Data Manipulation Language)의 약어로,
데이터베이스에서 데이터를 삽입, 갱신, 삭제 및 조회하는데 사용되는 SQL의 하위 언어입니다.
SELECT: 데이터베이스에서 데이터를 조회하는데 사용됩니다.
INSERT: 데이터를 삽입하는데 사용됩니다.
UPDATE: 데이터를 갱신(수정)하는데 사용됩니다.
DELETE: 데이터를 삭제하는데 사용됩니다.
- DDL은 무엇인가요? 어떤 구문이 있는지도 설명해주세요.
DDL은 데이터 정의 언어(Data Definition Language)의 약어로,
데이터베이스의 구조를 정의하거나 수정하는데 사용되는 SQL의 하위 언어입니다.
CREATE: 테이블, 뷰, 인덱스 등을 생성하는데 사용됩니다.
ALTER: 테이블의 구조를 수정하거나 데이터베이스 객체를 변경하는데 사용됩니다.
DROP: 테이블, 뷰, 인덱스 등을 삭제하는데 사용됩니다.
TRUNCATE: 테이블의 모든 행을 삭제하고 테이블을 초기화하는데 사용됩니다.
COMMENT: 데이터베이스 객체에 대한 주석을 추가하는데 사용됩니다.
DDL은 데이터베이스의 구조를 정의하고 관리하는 중요한 역할을 하며,
데이터의 무결성을 유지하고 관리자가 데이터베이스를 효율적으로 운영할 수 있도록 합니다.
- DCL은 무엇인가요? 어떤 구문이 있는지도 설명해주세요.
DCL은 데이터 제어 언어(Data Control Language)로, 데이터베이스의 접근 권한을 관리하는 역할을 합니다.
GRANT (부여): 사용자 또는 역할에게 특정 데이터베이스 객체에 대한 권한을 부여합니다.
REVOKE (취소): 사용자 또는 역할에게 부여된 특정 데이터베이스 객체에 대한 권한을 취소합니다.
DCL 구문은 데이터베이스의 보안과 권한 관리를 담당하며,
데이터베이스에 접근할 수 있는 사용자나 역할을 효과적으로 제어합니다.
- 참조 무결성에 대해서 설명해주세요.
참조 무결성은 데이터베이스에서 관계형 데이터의 일관성을 유지하기 위한 원칙 중 하나로,
외래 키(Foreign Key)와 기본 키(Primary Key) 간의 관계를 지키는 것을 의미합니다.
외래 키의 일관성
외래 키는 다른 테이블의 기본 키를 참조하는데, 이 관계가 항상 유지되어야 합니다.
외래 키 값은 참조하는 테이블의 기본 키 값이거나 NULL이어야 합니다.
데이터 무결성 보장
참조 무결성을 유지함으로써 데이터베이스에 저장된 데이터가 항상 유효하고 일관성 있게 유지됩니다.
외래 키 관계를 통해 연결된 데이터는 존재하는 기본 키 값을 참조하고 있어야 합니다.
DELETE 및 UPDATE 연산 제한
참조 무결성을 위해 부모 테이블의 기본 키를 참조하는 외래 키가 존재하는 경우,
부모 테이블에서 레코드를 삭제하거나 기본 키 값을 변경할 때 제약이 발생할 수 있습니다.
이를 통해 연결된 자식 테이블의 데이터도 일관성 있게 유지됩니다.
참조 무결성을 준수함으로써 데이터베이스에서의 관계를 신뢰할 수 있게 하며, 데이터의 정확성과 일관성을 보장합니다.
- CASCADE 설정에 대해서 설명해주세요.
CASCADE 설정은 데이터베이스에서 외래 키(Foreign Key) 관계에서 사용되며,
부모 테이블에서 기본 키 값을 변경하거나 삭제할 때, 이와 관련된 자식 테이블의 데이터도 함께 변경하거나 삭제하는 규칙을 정의합니다.
이 설정은 주로 데이터 일관성을 유지하고 부모-자식 테이블 간의 관계를 관리할 때 활용되며,
DELETE CASCADE의 경우 부모 테이블에서 특정 행을 삭제하면 연결된 자식 테이블의 관련 행도 자동으로 삭제되고,
UPDATE CASCADE의 경우 부모 테이블에서 기본 키 값을 변경하면 연결된 자식 테이블의 외래 키 값도 자동으로 변경됩니다.
- VIEW에 대해서 설명해주세요.
데이터베이스에서 VIEW(뷰)는 하나 이상의 기본 테이블에서 선택적으로 열을 포함하고,
특정 조건을 만족하는 행만을 가상으로 나타내는 저장된 쿼리입니다.
VIEW는 실제 데이터를 가지고 있지 않고, 실행 시에 동적으로 데이터를 생성하여 사용자에게 제공합니다.
이를 통해 사용자는 데이터를 편리하게 조회하고 조작할 수 있으며, 복잡한 쿼리나 조인을 간소화하여 사용할 수 있습니다.
VIEW는 데이터의 추상화를 제공하여 데이터의 보안성과 사용자 편의성을 높이는 데에 활용됩니다.
- SELECT 절의 처리순서에 대해서 설명해주세요.
SELECT 절의 처리순서는 SQL 쿼리가 실행될 때 다음과 같은 순서로 진행됩니다.
먼저, FROM 절에서 테이블이나 뷰를 지정하고, WHERE 절에서 조건을 걸어 특정 행을 선택합니다.
그 후, GROUP BY 절을 사용하여 그룹화하거나, HAVING 절을 사용하여 그룹에 조건을 적용합니다.
이후, SELECT 절에서 지정한 열들을 계산하거나 선택하여 결과를 생성합니다.
마지막으로 ORDER BY 절을 통해 결과를 정렬합니다.
- SELECT ~ FOR UPDATE 구문에 대해서 설명해주세요.
데이터베이스에서 특정 행을 선택하고 해당 행에 대한 잠금(lock)을 설정하는 SQL 구문입니다.
트랜잭션 내에서 선택한 행에 대한 업데이트가 완료될 때까지 다른 트랜잭션에서 해당 행에 대한 변경을 기다리게 됩니다.
이는 동시성 제어를 위해 사용되며 여러 트랜잭션이 동일한 데이터를 동시에 수정하는 것을 방지하여 데이터 일관성을 유지합니다.
주로 특정 행에 대한 업데이트 작업을 안전하게 처리하고자 할 때 사용됩니다.
- GROUP BY절에 대해서 설명해주세요.
GROUP BY 절은 SQL 쿼리에서 사용되며, 특정 열을 기준으로 결과를 그룹화하는 역할을 합니다.
이 절을 사용하면 데이터를 그룹 단위로 합계, 평균 등의 집계 함수를 적용할 수 있습니다.
그룹화된 결과는 그룹화에 사용된 열의 고유한 값들로 구성되며, 이를 통해 데이터를 요약하거나 통계를 생성하는 데 유용합니다.
GROUP BY를 사용할 때는 일반적으로 SELECT 문에서 집계 함수와 함께 사용되며,
GROUP BY 절에 나열되지 않은 열들은 집계 함수의 인자로 사용할 수 없습니다.
- ORDER BY절에 대해서 설명해주세요.
ORDER BY 절은 SQL 쿼리에서 사용되어 결과 집합을 특정 열을 기준으로 정렬하는 역할을 합니다.
이를 통해 쿼리 결과를 오름차순(ASC)이나 내림차순(DESC)으로 정렬할 수 있습니다.
주로 조회된 데이터를 사용자에게 보기 좋게 정렬하거나, 특정 기준에 따라 정렬된 결과를 필요로 할 때 사용됩니다.
ORDER BY 절은 SELECT 문의 마지막에 위치하며, 정렬하고자 하는 열의 이름을 지정합니다.
정렬 기준이 여러 개인 경우에는 여러 열을 쉼표로 구분하여 지정할 수 있습니다.
- INNER JOIN과 OUTER JOIN의 차이점에 대해서 설명해주세요.
INNER JOIN과 OUTER JOIN은 데이터베이스에서 테이블 간의 연결을 수행하는 데 사용되는 JOIN 연산자입니다.
INNER JOIN은 두 테이블 간에 일치하는 행만을 결과에 포함시키는 반면, OUTER JOIN은 일치하지 않는 행도 결과에 포함시킵니다.
OUTER JOIN은 다시 LEFT OUTER JOIN(왼쪽 테이블의 모든 행과 일치하는 오른쪽 테이블의 행을 가져옴),
RIGHT OUTER JOIN(오른쪽 테이블의 모든 행과 일치하는 왼쪽 테이블의 행을 가져옴),
FULL OUTER JOIN(양쪽 테이블의 모든 행을 가져오며, 일치하지 않는 경우에는 NULL 값으로 채움)으로 나뉘며,
각각 특정 테이블의 모든 행을 결과에 포함시키는 특징을 가지고 있습니다.
INNER JOIN은 일치하는 행만을 결과에 포함시키고, OUTER JOIN은 일치하지 않는 행도 포함시킵니다.
- LEFT OUTER JOIN, RIGHT OUTER JOIN에 대해서 설명해주세요.
LEFT OUTER JOIN은 왼쪽 테이블의 모든 행과 일치하는 오른쪽 테이블의 행을 가져옵니다.
이는 왼쪽 테이블의 모든 행을 결과에 포함시키면서 오른쪽 테이블과 일치하는 행이 있는 경우 해당 행을 가져오는 것을 의미합니다.
반면, RIGHT OUTER JOIN은 RIGHT OUTER JOIN은 오른쪽 테이블의 모든 행과 일치하는 왼쪽 테이블의 행을 가져옵니다.
즉, 오른쪽 테이블의 모든 행을 결과에 포함시키면서 왼쪽 테이블과 일치하는 행이 있는 경우 해당 행을 가져오는 것을 의미합니다.
이러한 OUTER JOIN의 두 가지 형태는 각각 왼쪽 또는 오른쪽 테이블의 모든 행을 결과에 포함시키는 특징을 가지고 있습니다.
- CROSS JOIN에 대해서도 설명해주세요.
JOIN의 한 유형으로, 두 개 이상의 테이블 간에 모든 가능한 조합을 만들어내는데 사용됩니다.
각 행이 다른 테이블의 각 행과 결합되는 특징을 가지고 있어, 결과 집합은 각 테이블의 행 수를 곱한 크기를 가지게 됩니다.
CROSS JOIN은 일반적으로 사용자가 의도적으로 테이블 간의 모든 조합을 생성하고자 할 때 활용되며,
주로 작은 테이블 간의 결합이 아닌 모든 가능한 경우의 수를 찾을 때 쓰입니다.
그러나 큰 테이블을 결합할 경우에는 결과 집합이 매우 커질 수 있으므로 주의가 필요합니다.
- 서브쿼리에 대해서 설명해주세요.
서브쿼리(subquery)는 SQL 쿼리 안에 포함된 또 다른 쿼리로, 주로 외부 쿼리의 조건이나 결과에 영향을 미치는데 사용됩니다.
서브쿼리는 주로 SELECT, FROM, WHERE, HAVING 절 등 다양한 부분에서 사용될 수 있으며,
서브쿼리의 결과는 주로 외부 쿼리에서 비교, 필터링, 계산 등의 용도로 활용됩니다.
예를 들어, WHERE 절에서 서브쿼리를 사용하여 특정 조건을 만족하는 행을 선택하거나,
SELECT 절에서 서브쿼리를 사용하여 결과를 계산하거나 조회할 수 있습니다.
서브쿼리는 복잡한 데이터 조작이나 조건에 따른 유동적인 데이터 필터링에 유용하게 사용됩니다.
- DROP, TRUNCATE, DELETE에 각각에 대해 설명해주세요. 어떤차이가 있나요?
DROP, TRUNCATE, DELETE는 데이터베이스에서 데이터를 삭제하거나 테이블을 삭제하는 목적으로 사용되는 SQL 명령어입니다.
DROP 문은 데이터베이스 객체(테이블, 뷰, 인덱스 등)를 완전히 삭제하는 데 사용됩니다.
삭제된 객체는 복구할 수 없으며, 해당 객체에 의존하는 다른 객체나 데이터도 함께 삭제됩니다.
TRUNCATE 문은 테이블의 모든 행을 삭제하지만 테이블 구조는 유지됩니다.
TRUNCATE는 DELETE보다 빠르게 동작하며, 롤백이 불가능하며 트랜잭션 로그가 적게 생성됩니다.
DELETE 문은 테이블에서 특정 행이나 모든 행을 삭제하는 데 사용됩니다.
삭제된 행은 롤백이 가능하며, 트랜잭션 로그에 상세한 정보가 기록됩니다.
차이점은 주로 작업의 범위와 속도, 롤백 가능 여부 등에 있습니다.
DROP은 객체를 삭제하고, TRUNCATE는 테이블의 모든 행을 삭제하며 테이블 구조는 유지하고,
DELETE는 조건에 맞는 특정 행이나 모든 행을 삭제합니다.
- DISTINCT에 대해서 설명해주세요. 사용해본 경험도 설명해주세요.
DISTINCT는 SQL 쿼리에서 사용되어 중복된 결과를 제거하는 데에 활용되는 키워드입니다.
SELECT 문에서 특정 열을 지정하여 해당 열의 중복된 값을 제거하고 고유한 값만을 반환합니다.
주로 결과 집합에서 중복된 데이터를 제거하고자 할 때 사용됩니다.
예를 들어, 다음과 같은 쿼리에서 DISTINCT를 사용하여 "도시" 열에서 중복된 값을 제거할 수 있습니다:
이를 통해 고유한 도시 목록만을 얻을 수 있습니다.
경험적으로는 데이터베이스에서 대량의 데이터를 다룰 때 중복된 결과를 방지하고자 할 때 자주 사용되며,
특히 데이터의 정리와 분석 과정에서 유용하게 활용됩니다.
- SQL Injection 공격이 무엇인지 어떻게 공격을 예방할 수 있는지 설명해주세요.
SQL Injection은 악의적인 사용자가 웹 응용 프로그램에 악성 SQL 코드를 삽입하여 데이터베이스에 접근하거나 조작하는 공격입니다.
이를 방지하기 위해 입력 유효성을 검사하고, 파라미터화된 쿼리를 사용하는 등의 조치를 취할 수 있습니다.
사용자 입력을 검증하여 허용되지 않은 문자나 패턴을 거부하고,
동적으로 쿼리를 생성할 때는 파라미터화된 쿼리를 사용하여 입력이 SQL 코드로 해석되는 것을 방지합니다.
이러한 조치를 통해 SQL Injection 공격을 최소화하고 웹 응용 프로그램의 보안성을 향상시킬 수 있습니다.
- 알고 있는 SQL 안티패턴이 있다면 설명해주세요.
하나의 알려진 SQL 안티패턴은 "동적 쿼리 문자열 구성"입니다.
이 패턴은 사용자 입력을 받아 동적으로 SQL 쿼리를 문자열로 구성하는 방법으로, 이는 보안 문제를 야기할 수 있습니다.
사용자 입력을 직접 쿼리에 삽입하면 SQL Injection 공격에 취약해질 수 있으며, 쿼리의 가독성과 유지보수성도 감소할 수 있습니다.
안티패턴 대신에는 파라미터화된 쿼리나 ORM(Object-Relational Mapping)을 사용하여 동적 쿼리를 생성하는 것이 권장됩니다.
파라미터화된 쿼리를 사용하면 사용자 입력이 SQL 코드로 해석되는 것을 방지하고, 데이터베이스가 입력을 안전하게 처리할 수 있습니다.
ORM을 사용하면 SQL 코드를 직접 작성하지 않고도 데이터베이스 연동을 수행할 수 있어 보안과 코드 유지보수성을 향상시킬 수 있습니다.
- 페이지네이션을 구현한다고 했을때 쿼리를 어떻게 작성해야할까요?
페이지네이션을 구현하려면 SQL 쿼리에서 LIMIT 및 OFFSET을 사용하여 결과 집합의 일부를 선택하는 방식을 채택해야 합니다.
LIMIT은 가져올 행의 수를 나타내며, OFFSET은 시작 위치를 나타냅니다.
이렇게 함으로써 각 페이지에 필요한 데이터만을 가져올 수 있습니다.
페이지 사이즈나 현재 페이지의 시작 위치 등은 애플리케이션 로직에 따라 동적으로 조절할 수 있습니다.
페이지네이션은 사용자 경험을 향상시키고 데이터베이스 부하를 줄이는 데 유용하며,
SQL의 LIMIT 및 OFFSET을 통한 쿼리 작성은 이를 간단하게 구현하는데 도움이 됩니다.
'외부 활동 > JSCODE 데이터베이스 면접' 카테고리의 다른 글
3주차 면접 예상 질문 (0) | 2023.11.20 |
---|---|
3주차 인덱스 (0) | 2023.11.20 |
2주차 : SQL (1) | 2023.11.14 |
1주차 면접 예상 질문 (0) | 2023.11.07 |
1주차 : 데이터베이스란? (0) | 2023.11.05 |