티스토리 뷰

DB

DB - 2주차

perseverance 2024. 11. 7. 23:27

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

SQL은 데이터베이스 관리 시스템에서 데이터를 저장하고, 수정하고, 삭제하고, 검색하는 데 사용되는 특수 목적의 언어입니다. SQL은 관계형 데이터베이스와 상호작용하는 표준 언어로, 데이터를 효율적으로 관리하고 쿼리를 실행하는 데 중점을 둡니다.

 

SQL과 일반 프로그래밍 언어의 차이점

구분 SQL 일반 프로그래밍 언어
용도 데이터베이스 시스템과의 소통에 초점을 맞추고 있어, 데이터를 효과적으로 조작하고 검색하는 기능을 제공 로직 제어, 유저 인터페이스 구축, 네트워킹, 파일 입출력 등 매우 다양한 기능을 수행
입출력 입력은 테이블, 출력도 테이블 모든 형태의 입출력 가능
작동 방식 DBMS에서 실행 작성된 코드는 컴파일러나 인터프리터에 의해 실행

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

MySQL 기준으로 설명 드리겠습니다.

  1. 사용자가 작성한 SQL을 데이터베이스로 보냅니다.
  2. MySQL 쿼리파서는 SQL 문장을 토큰으로 쪼개서 트리를 만듭니다.이 과정에서 문법 오류도 체크합니다.
    이 트리를 Parse Tree라고 하는데 이를 통해 쿼리를 실행합니다.
  3. 다음으로 전처리기가 Parse Tree을 기반으로 SQL 문장구조에 문제가 없는지 체크합니다.
    또한 SQL에 포함된 테이블, 컬럼 이름이 유효한지 접근권한이 있는지 체크합니다.
  4. 다음으로 옵티마이저가 SQL 실행을 최적화하기 위해 실행 계획을 수립합니다.
  5. 마지막으로 쿼리 실행엔진이 수립된 실행 계획대로 스토리지 엔진을 호출해서 쿼리를 수행하고 결과를 사용자에게 응답합니다.

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

테이블에 데이터를 검색, 삽입, 수정, 삭제하는 데 사용하며 SELECT, INSERT, DELETE, UPDATE 문 등이 있습니다. 여기서 SELECT 문은 특별히 질의어(query) 라고 부릅니다.

 

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

테이블이나 관계의 구조를 생성하는 데 사용하며 CREATE, ALTER, DROP문 등이 있습니다.

 

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

데이터의 사용 권한을 관리하는 데 사용하며 GRANT, REVOKE 문이 있습니다. 트랜잭션을 관리하는 COMMIT, ROLLBACK 문도 포함됩니다.

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

참조 무결성 제약조건은 외래키를 참조하는 자식 릴레이션의 외래키는 부모 릴레이션의 기본키와 도메인이 같아야 하며 자식 릴레이션의 값이 변경될 때 부모 릴레이션의 제약을 받는다는 것입니다.


1. 자식 릴레이션에서 삽입
만약 해당 외래키값이 부모 릴레이션에 존재하지 않는다면 삽입은 거부됩니다. 외래키 속성에 NULL 값을 허용했다면 외래키가 없어도 삽입이 가능합니다.


DBMS는 먼저 도메인 무결성 제약조건을 확인한 후 개체 무결성 제약조건에 위배되는 값이 없는지 확인합니다. 이후 자식 릴레이션의 외래키값이 실제로 존재하는지 확인합니다.


2. 부모 릴레이션에서 삭제
 자식 릴레이션에서 투플이 삭제되는 경우 부모 릴레이션에는 아무런 영향을 주지 않으므로 바로 삭제할 수 있습니다. 그러나 부모 릴레이션에서 투플이 삭제되는 경우에는 문제가 발생할 수 있습니다.


부모 릴레이션에서 투플을 삭제하면 먼저 자신의 기본키를 참조하고 있는 자식 릴레이션이 없는지 확인합니다. 만약 존재한다면 다음과 같은 네 가지를 고려할 수 있습니다.


1) 즉시 작업을 중지 2)자식 릴레이션의 관련 투플을 삭제 3)초기에 설정된 다른 어떤 값으로 변경 4)NULL 값으로 설정


이처럼 DBMS는 부모 릴레이션에서 투플을 삭제할 때 참조 무결성 제약조건을 수행하기 위한 네 가지 옵션이 있습니다. 이는 제약조건 선언 시 자식 릴레이션에도 지정해 주어야 합니다.

RESTRICTED 자식 릴레이션에서 참조하고 있으면 부모 릴레이션의 삭제 작업을 거부함
CASCADE 자식 릴레이션의 관련 투플을 같이 삭제함
DEFAULT 자식 릴레이션의 관련 투플을 미리 설정해 둔 값으로 변경함
NULL 자식 릴레이션의 관련 투플을 NULL 값으로 설정함

3. 부모 릴레이션에서 수정
수정은 삭제와 삽입 명령이 연속해서 수행된다고 보면 된다. 부모 릴레이션의 수정이 일어날 때 삭제 옵션에 따라 처리된 후 문제가 없으면 다시 삽입 제약조건에 따라 처리됩니다.

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

자식 릴레이션의 관련 투플을 같이 삭제합니다.

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

VIEW는 여러 테이블들을 합쳐서 만든 가상의 테이블입니다.

VIEW는 여러 테이블들이 합쳐져 하나의 테이블로 정의된 것이기 때문에 SQL 작성을 간단히 할 수 있습니다. 또한 원본 테이블을 노출시키지 않게 함으로 보안성을 제공할 수 있습니다.

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

FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY

 

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

SELECT ~ FROM UPDATE 구문은 투플들을 조회하면서 락을 겁니다. 그렇기에 다른 트랜잭션이 접근하여 해당 투플들을 수정할 수 없습니다.

계좌에서 잔액을 조회한 후에 새로운 잔액으로 업데이트하려할때 다른 트랜잭션에서 이를 동시에 실행하면 데이터 불일치가 발생할 수 있으니 이때 사용할 수 있습니다.

 

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

SQL문에서 GROUP BY 절을 사용하면 속성값이 같은 것끼리 그룹을 만들 수 있습니다. 예를 들어 Orders 테이블을 사용하는 SELECT 문에 GROUP BY customerId라고 명시하면, DBMS는 cutomerId가 같은 값끼리 그룹으로 묶습니다.

GROUP BY 주의사항

  • GROUP BY로 투플을 그룹으로 묶은 후 SELECT 절에는 GROUP BY에서 사용한 속성과 집계함수만 나올 수 있습니다.

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

ORDER BY 절을 사용해서 특정 속성을 기준으로 조회 결과를 정렬할 수 있습니다.

기본적으로 오름차순으로 정렬되며, DESC 키워드를 사용하면 내림차순으로 정렬할 수 있습니다.

13. INNER JOIN과 OUTER JOIN의 차이점에 대해서 설명해주세요.

INNER JOIN은 두 테이블에서 조인 조건을 만족하는 행들만 반환합니다.

OUTER JOIN은 조인 조건에 상관없이 한쪽 또는 양쪽 테이블의 모든 행을 반환합니다.

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

A, B 테이블이 있을때 LEFT OUTER JOIN을 하면 A 테이블의 모든 결과와 A,B 교집합된 결과를 가져옵니다. A 테이블의 결과중 B 테이블과 일치하는 결과가 없다면 NULL 값으로 채워집니다.

RIGHT OUTER JOIN은 LEFT OUTER JOIN과 반대 방향으로 적용됩니다.

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

CROSS JOIN을 하면 두 테이블의 모든 가능한 조합 결과를 생성합니다.

두 테이블의 각 레코드 수를 곱한 개수 만큼 결과가 나옵니다.

CROSS JOIN은 카테시안 곱이라고도 부릅니다.

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

서브쿼리는 SQL안에 포함된 또 다른 SQL입니다. 서브쿼리는 WHERE, SELECT, FROM절에 적용될 수 있습니다.

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

DROP 문은 테이블을 삭제하는 명령입니다. DROP문은 테이블의 구조와 데이터를 모두 삭제합니다.

  • DROP TABLE 테이블이름;

DELETE는 테이블에 존재하는 투플을 삭제하는 명령어입니다.

  • DELETE FROM 테이블이름 WHERE …

TRUNCATE는 테이블의 모든 데이터를 완전히 비우는 명령어입니다.

 

TRUNCATE TABLE은 DELETE와 비슷하지만, DML 문이 아닌 DDL 문으로 분류되며 다음과 같은 차이점이 있습니다:

  1. 속도: 테이블을 삭제하고 재생성하기 때문에, 특히 큰 테이블에서 행을 하나씩 삭제하는 것보다 훨씬 빠릅니다.
  2. 암묵적 커밋: TRUNCATE TABLE은 암묵적인 커밋을 발생시켜 롤백할 수 없습니다.
  3. 외래 키 제약 조건: 다른 테이블에서 참조하는 외래 키 제약 조건이 있는 InnoDB 또는 NDB 테이블에서는 실패합니다. 그러나 동일한 테이블 내의 열 사이의 외래 키 제약은 허용됩니다.
  4. AUTO_INCREMENT 값 초기화: 모든 AUTO_INCREMENT 값이 초기값으로 리셋됩니다. 이는 일반적으로 시퀀스 값을 재사용하지 않는 MyISAM과 InnoDB에서도 마찬가지입니다.
  5. 파티션 유지: 파티션된 테이블에서 사용하면, 파티션 정의 파일(.par)은 그대로 유지되며, 데이터와 인덱스 파일만 삭제하고 재생성합니다.
  6. 트리거 미실행: TRUNCATE TABLE 문은 ON DELETE 트리거를 호출하지 않습니다.

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

DISTINCT는 SQL 쿼리에서 사용하는 키워드로, 중복된 값을 제거하여 유일한 값만을 반환하는 데 사용됩니다.

 

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

데이터베이스와 연동된 애플리케이션에서 공격자가 입력이 가능한 폼에 조작된 질의문을 삽입하여 데이터베이스 정보를 열람 또는 조작할 수 있는 공격기법입니다.

서버에서 데이터베이스 쿼리문을 작성할때 단순히 사용자가 입력한 값을 문자열을 더함으로써 넣어주는 방식이 아닌 Parameter Binding으로 쿼리문을 만들면 예방할 수 있습니다.

 

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

대량의 데이터를 삽입할 때 하나의 INSERT 문을 여러 번 사용하면 트랜잭션 및 I/O 비용이 증가합니다.

해결책: 다중 행을 한 번에 삽입할 수 있는 INSERT INTO ... VALUES (...), (...), ...; 구문을 사용하여 성능을 최적화할 수 있습니다.

 

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

Offset과 limit을 통하여 select의 전체 결과 중 일부만 가져옴으로써 페이지네이션을 구현할 수 있습니다.

예를들어 SELECT 쿼리에서 LIMIT가 10이고 OFFSET이 10이라면, 11번째 투플부터 20번째 투플까지만 조회할 수 있습니다.

'DB' 카테고리의 다른 글

DB - 3주차  (1) 2024.11.14
DB - 1주차  (0) 2024.10.31
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함