본문 바로가기
[자격증]/SQLD

[2과목] SQL 기본

by 에디터 윤슬 2025. 3. 1.

제1절 관계형 데이터베이스 개요

1. 데이터 제어어(DCL)에 해당하는 명령어는?

  • INSERT
  • RENAME
  • COMMIT
  • REVOKE
해설

데이터 제어어(DCL) 개념
데이터 제어어(Data Control Language, DCL)는 데이터베이스에서 사용자 권한을 관리하고 데이터 접근을 제어하는 데 사용되는 SQL 명령어입니다. DCL은 주로 다음과 같은 두 가지 주요 명령어로 구성됩니다


1. GRANT: 특정 사용자에게 데이터베이스 객체에 대한 작업 권한을 부여합니다.
2. REVOKE: 특정 사용자에게 부여된 권한을 철회합니다.
DCL은 데이터 보안과 접근 제어를 목적으로 하며, 데이터베이스 관리자(DBA)가 주로 사용합니다.

설명:
• INSERT: 데이터 조작어(DML)에 속하며, 테이블에 데이터를 삽입하는 데 사용됩니다.
• RENAME: 데이터 정의어(DDL)에 속하며, 데이터베이스 객체의 이름을 변경하는 데 사용됩니다.
• COMMIT: 트랜잭션 제어 언어(TCL)에 속하며, 트랜잭션의 변경 내용을 확정하는 데 사용됩니다.
• REVOKE: 데이터 제어어(DCL)에 속하며, 사용자에게 부여된 권한을 철회하는 데 사용됩니다

명령어의 종류 명령어 설명
데이터 조작어(DML: Data Manipulation Language) SELECT 데이터베이스에 들어 있는 데이터를 조회하거나 검색하기 위한 명령어를 말하는 것으로 RETRIEVE 라고도 한다.
INSERT
UPDATE
DELETE
데이터베이스의 테이블에 들어 있는 데이터에 변형을 가하는 종류의 명령어들을 말한다. 예를 들어 데이터를 테이블의 새로운 행에 집어넣거나, 원하지 않는 데이터를 삭제하거나 수정하는 것들의 명령어들을 DML이라고 부른다.
데이터 정의어(DDL: Data Definition Language) CREATE
ALTER
DROP
RENAME
테이블과 같은 데이터 구조를 정의하는 데 사용되는 명령어들로 그러한 구조를 생성하거나 변경하거나 삭제하거나 이름을 바꾸는 데이터 구조와 관련된 명령어들을 DDL이라고 부른다.
데이터 제어어(DCL: Data Control Language) GRANT
REVOKE
데이터베이스에 접근하고 객체들을 사용하도록 권한을 주고 회수하는 명령어를 DCL이라고 부른다.
트랜잭션 제어어(TCL: Transaction Control Language) COMMIT
ROLLBACK
논리적인 작업의 단위를 묶어서 DML에 의해 조작된 결과를 작업단위(트랜잭션) 별로 제어하는 명령어를 말한다.

 

2. 아래에서 빈칸 ㄱ에 들어갈 내용으로 가장 적절한 것은?

ㄱ는 입력한 정보 중에 잘못 입력되거나 변경이 발생하여 정보를 수정할 때 사용한다.

  • UPDATE
  • SELECT
  • ALTER
  • REVOKE
UPDATE table_name
SET column_name = value
WHERE condition;
해설

• UPDATE: 테이블의 기존 데이터를 수정하는 데 사용됩니다. 예를 들어, 특정 조건에 맞는 행의 값을 변경할 수 있습니다.

• SELECT: 테이블에서 데이터를 조회하는 데 사용되며, 데이터를 수정하지 않습니다. 따라서 빈칸에 적절하지 않습니다.
• ALTER: 테이블 구조를 변경하는 명령어로, 열 추가, 삭제, 데이터 타입 변경 등에 사용됩니다. 데이터 자체를 수정하지 않으므로 적합하지 않습니다.
• REVOKE: 데이터 제어어(DCL) 명령어로, 사용자 권한을 철회하는 데 사용됩니다. 데이터 수정과는 관련이 없습니다

 

3. SQL 종류와 해당되는 명령어를 바르게 연결한 것은?

  • DML - SELCT
  • TCL - GRANT
  • DCL - DROP
  • DML - ALTER

 

4. 아래 내용의 범주에 해당하는 SQL 명령어로 가장 적절하지 않은 것은?

  • 테이블의 구조를 생성, 변경, 삭제하는 등 데이터 구조를 정의하는 데 사용되는 명령어이다.
    • CREATE
    • GRANT
    • ALTER
    • DROP

제2절 SELECT 문

5. SQL 문을 실행했을 때 오류가 발생하는 부분으로 가장 적절한 것은?

  • SELECT DRPTNO, ROUND(AVG(SAL), 2)
  • FROM EMP
  • WHERE AVG(SAL) >= 1800
  • GROUP BY DEPTNO;

 

NULL의 연산
  • NULL 값과의 연산(+, -, *, / 등)은 NULL 값을 리턴
  • NULL 값과의 비교연산(=, >, >=, <, <=)은 거짓(FALSE)을 리턴
  • 특정 값보다 크다, 적다라고 표현할 수 없음

 

6. 아래에 대한 설명으로 가장 적절한 것은?

CREATE TABLE 서비스

(

서비스번호 VARCHAR2(10) PRIMARY KEY,

서비스명 VARCHAR2(100) NULL,

개시일자 DATE NOT NULL

);

[SQL]

  • SELECT * FROM 서비스 WHERE 서비스번호 = 1;
  • INSERT INTO 서비스 VALUES('999', '', '2015-11-11');
  • SELECT * FROM 서비스 WHERE 서비스명 = '';
  • SELECT * FROM 서비스 WHERE 서비스명 IS NULL;

 

  • 서비스번호 칼럼의 레코드 중 '001'과 같은 숫자 형식으로 된 레코드가 하나라도 입력되어 있다면 ㄱ은 오류 없이 실행된다.
  • 오라클에서 ㄴ과 같이 데이터를 입력하였을 때, 서비스명 칼럼에 공백 문자 데이터가 입력된다.
  • 오라클에서 ㄴ과 같이 데이터를 입력하고 ㄷ과 같이 조회하였을 때, 데이터는 조회된다.
  • SQL server에서 ㄴ과 같이 데이터를 입력하고 ㄹ과 같이 조회하였을 때, 데이터는 조회되지 않는다.
해설

개념 정리
1. Oracle에서 빈 문자열과 NULL:
• Oracle에서는 빈 문자열(`''`)을 NULL로 처리합니다.
• 따라서, 빈 문자열을 입력하면 해당 컬럼에는 NULL이 저장됩니다.
• `IS NULL`을 사용해야만 NULL 값을 조회할 수 있으며, `= ''`는 Oracle에서 유효하지 않습니다.
2. SQL Server에서 빈 문자열과 NULL:
• SQL Server에서는 빈 문자열(`''`)과 NULL을 구분합니다.
• 빈 문자열은 데이터로 저장되며, `= ''`로 조회할 수 있습니다.
3. 숫자 비교:
• `서비스번호`는 `VARCHAR2` 타입이므로 문자형으로 저장됩니다. 숫자와의 비교(`서비스번호 = 1`)는 암시적 형 변환이 발생할 수 있으나, 데이터베이스 설정에 따라 오류가 발생할 가능성이 있습니다.

각 설명 해설
1. 설명 ①:
“서비스번호 칼럼에 모든 레코드 중에서 ‘001’과 같은 숫자 형식으로 하나의 레코드만이라도 입력되어 (ㄱ)은 오류 없이 실행된다.”
• `서비스번호`는 `VARCHAR2` 타입으로 정의되어 있으므로 문자형 데이터입니다.
• `서비스번호 = 1`은 숫자와 문자 간 비교를 시도하므로 암시적 형 변환이 발생합니다. Oracle에서는 이 경우 오류가 발생할 가능성이 높습니다.

2. 설명 ②:
“Oracle에서 (ㄴ)과 같이 데이터를 입력하였을 때, 서비스명 칼럼에 공백 문자 데이터가 입력된다.”
• Oracle에서는 빈 문자열(`''`)이 NULL로 처리됩니다.
• 따라서, `서비스명` 컬럼에는 공백 문자가 아닌 NULL 값이 저장됩니다.

3. 설명 ③:
“Oracle에서 (ㄴ)과 같이 데이터를 입력하고, (ㄷ)과 같이 조회하였을 때, 데이터는 조회된다.”
• Oracle에서는 빈 문자열이 NULL로 처리되므로, `서비스명 = ''` 조건은 유효하지 않습니다.
• 대신, `서비스명 IS NULL` 조건을 사용해야 데이터가 조회됩니다.

4. 설명 ④:
“SQL Server에서 (ㄴ)과 같이 데이터를 입력하고, (ㄹ)과 같이 조회하였을 때, 데이터는 조회되지 않는다.”
• SQL Server에서는 빈 문자열(`''`)이 그대로 저장됩니다.
• 따라서, `서비스명 IS NULL`로는 데이터를 조회할 수 없으며, `서비스명 = ''` 조건으로만 조회가 가능합니다.

 

7. 아래 SQL의 실행 결과로 가장 적절한 것은?(단, DBMS는 오라클로 가정)

SELECT TO_CHAR(
    TO_DATE('2023.01.10 10', 'YYYY.MM.DD HH24') + 1/24/(60/10), 
    'YYYY.MM.DD HH24:MI:SS'
) 
FROM DUAL;
  • 2023.01.10 11:01:00
  • 2023.01.10 10:01:00
  • 2023.01.10 10:10:00
  • 2023.01.10 10:30:00
해설

1. `TO_DATE('2023.01.10 10', 'YYYY.MM.DD HH24')`:
• 문자열 `'2023.01.10 10'`을 날짜 형식으로 변환합니다.
• 변환된 값은 `2023-01-10 10:00:00`입니다.
2. `1/24/(60/10)`:
• 이 계산은 날짜에 더할 시간 값을 결정합니다.
• `1/24`는 하루(1일)의 1시간을 의미합니다.
• `(60/10)`은 6으로 계산되므로, `1/24/(60/10)`는 1/144입니다.
• 이는 하루의 1/144로, 시간으로 환산하면 0.1667시간, 즉 10분입니다.
3. 날짜 계산:
• `TO_DATE('2023.01.10 10', 'YYYY.MM.DD HH24') + 1/144`는 `2023-01-10 10:00:00`에 10분을 더한 값입니다.
• 결과는 `2023-01-10 10:10:00`입니다.
4. `TO_CHAR(..., 'YYYY.MM.DD HH24:MI:SS')`:
• 최종적으로 날짜를 문자열로 변환하여 `'YYYY.MM.DD HH24:MI:SS'` 형식으로 출력합니다.
• 결과는 `'2023.01.10 10:10:00'`입니다.

 

8. 아래의 (가)와 (나)가 동일한 결과를 출력한다고 할 때, 빈칸 ㄱ에 들어갈 내용으로 가장 적절한 것은?(단, 스칼라 서브쿼리는 제외함)

(가)

SELECT LOC,
       CASE WHEN LOC = 'NEW YORK' THEN 'EAST'
            ELSE 'ETC'
       END AS AREA
FROM DEPT;

 

(나)

SELECT LOC,
       ㄱ AS AREA
FROM DEPT;
  • CASE WHEN LOC IS 'NEW YORK' THEN 'EAST' ELSE 'ETC' END
  • CASE LOC WHEN 'NEW YORK' THEN 'EAST' ELSE 'ETC' END
  • CASE LOC WHEN 'NEW YORK' THEN 'EAST' DEFAULT 'ETC' END
  • DECODE (LOC, 'EAST', 'NEW YORK', 'ETC')
해설

선택지 분석
1. CASE WHEN LOC IS ‘NEW YORK’ THEN ‘EAST’ ELSE ‘ETC’ END:
• `IS`는 일반적으로 NULL 비교에 사용되며, 문자열 비교에는 적합하지 않습니다.

2. CASE LOC WHEN ‘NEW YORK’ THEN ‘EAST’ ELSE ‘ETC’ END:
• 이 표현식은 `CASE` 문의 간단한 형태로, `LOC` 값이 `'NEW YORK'`일 경우 `'EAST'`, 그렇지 않을 경우 `'ETC'`를 반환합니다.
• `(가)`와 동일한 결과를 출력합니다.

3. CASE LOC WHEN ‘NEW YORK’ THEN ‘EAST’ DEFAULT ‘ETC’ END:
• `DEFAULT`는 표준 SQL 문법에 포함되지 않으며, Oracle에서는 사용할 수 없습니다.

4. DECODE(LOC, ‘EAST’, ‘NEW YORK’, ‘ETC’):
• `DECODE` 함수는 Oracle에서 조건문을 구현하는 함수로, 첫 번째 매개변수(`LOC`)와 두 번째 매개변수(`EAST`)를 비교하여 동일하면 세 번째 매개변수(`NEW YORK`)를 반환합니다.
• 그러나 이 문장은 `(가)`와 동일한 논리를 구현하지 못합니다.

제3절 함수

9. EMP 테이블에서 MGR의 값이 7698과 같으면 NULL을 표시하고, 같지 않으면 MGR을 표시하려고 할 때 빈칸 ㄱ에 들어갈 함수는?

SELECT ENAME, EMPNO, MGR, ㄱ, (MGR, 7698) as NM
FROM EMP;
  • NULLIF
  • NVL
  • IFNULL
  • COALESCE
일반형 함수 함수 설명
NVL(표현식1, 표현식2) / 
ISNULL(표현식1, 표현식2)
표현식1의 결괏값이 NULL이면 표현식2의 값을 출력한다.
단, 표현식1과 표현식2의 결과 데이터 타입이 같아야 한다.
NULLIF(표현식1, 표현식2) 표현식1이 표현식2와 같으면 NULL을, 같지 않으면 표현식1을 리턴한다.
COALESCE(표현식1, 표현식2, ......) 임의의 개수 표현식에서 NULL이 아닌 최초의 표현식을 나타낸다. 모든 표현식이 NULL이라면 NULL을 리턴한다.

 

제4절 WHERE 절

10. 아래는 이름이 4문자 이상이고 2번째 문자가 S인 학번을 출력하는 SQL이다.

빈칸 ㄱ에 들어갈 수 있는 내용으로 가장 적절하지 않은 것은?

SELECT 학번
FROM 학생
WHERE 학생.이름 LIKE ㄱ
  • '%S_ _ _'
  • '_S%_ _'
  • '_S_%_'
  • '_S_ _%'
해설

1. `'%S_ _ _'`:
• `%`: 0개 이상의 문자.
• `S`: 두 번째 문자가 `'S'`.
• `_ _ _`: 이후 3개의 문자가 있어야 함.
• 이 패턴은 이름이 최소 5문자 이상일 때만 매칭됩니다. 따라서 4문자 이름은 포함되지 않아 부적절합니다.

 

제5절 GROUP BY, HAVING 절

11. 아래 SQL을 순서대로 실행했을 때 최종적으로 반영되는 SQL을 모두 고른 것은?

(가)
INSERT INTO EMP(EMPNO, ENAME, SEPTNO) VALUES(999, 'SMITH', 10);
SAVEPOINT A;
(나)
DELETE EMP WHERE EMPNO = 202;
SAVEPOINT B
(다)
UPDATE EMP SET ENAME = 'CLARK';
ROLLBACK TO SAVEPOINT A;
(라)
INSERT INTO EMP(EMPNO, ENAME, DEPTNO) VALUES (300, 'THOMAS', 30);
SAVEPOINT C;
(마)
DELETE EMP WHERE DEPTNO = 20;
COMMIT;

 

제6절 ORDER BY 절

12. 오류가 발생하는 SQL은?

1.
SELECT 지역, SUM(매출금액) AS 매출금액
FROM 지역별매출
GROUP BY 지역
ORDER BY 매출금액 DESC;

2.
SELECT 지역,  매출금액
FROM 지역별매출
ORDER BY 년 ASC;

3. 
SELECT 지역, SUM(매출금액) AS 매출금액
FROM 지역별매출
GROUP BY 지역
ORDER BY 년 DESC;

4.
SELECT 지역, SUM(매출금액) AS 매출금액
FROM 지역별매출
GROUP BY 지역
HAVING SUM(매출금액) > 1000
ORDER BY COUNT(*) ASC;
해설

3. 

• `GROUP BY` 절을 사용했으므로, `ORDER BY`에서 사용할 수 있는 컬럼은 다음과 같습니다:
• `GROUP BY`에 포함된 컬럼 (`지역`)
• 집계 함수 결과 (`SUM(매출금액)` 또는 별칭 `매출금액`)
• 그러나 `년`은 `GROUP BY`에도 포함되지 않고, 집계 함수에도 속하지 않습니다.

 

4. 

• `HAVING` 절은 집계 함수(`SUM(매출금액) > 1000`) 조건을 적용하며 문제가 없습니다.
• `ORDER BY COUNT(*) ASC`는 그룹의 개수를 기준으로 정렬하며, 이는 유효한 표현입니다.

 

제7절 조인

13. 아래에서 JOIN에 대한 설명으로 가장 적절한 것은?

(가) 일반적으로 조인은 PK와 FK값의 연관성에 의해 성립된다.

(나) DBMS 옵티마이저는 FROM 절에 나열된 테이블들을 임의로 3개 정도씩 묶어서 조인을 처리한다.

(다) EQUI JOIN은 조인에 관여하는 테이블 간의 칼럼 값들이 정확하게 일치하는 경우에 사용되는 방법이다.

(라) EQUI JOIN '=' 연산자에 의해서만 수행되며, 그 이외의 비교 연산자를 사용하는 경우에는 모두 NON EQUI JOIN이다.

(마) 대부분 NON EQUI JOIN을 수행할 수 있지만, 때로는 설계상의 이유로 수행이 불가능한 경우도 있다.

해설

1. (가)
“일반적으로 조인은 PK와 FK 값의 연관성에 의해 성립된다.”
• 조인은 일반적으로 PK(Primary Key)와 FK(Foreign Key)의 관계를 기반으로 수행되지만, 반드시 PK-FK 관계만으로 조인이 성립하는 것은 아닙니다.
• 논리적으로 같은 값이 존재하면 PK-FK 관계가 없어도 조인이 가능합니다.

2. (나)
“DBMS 옵티마이저는 FROM 절에 나열된 테이블들을 임의로 3개 정도씩 묶어서 조인을 처리한다.”
• DBMS 옵티마이저는 테이블을 임의로 묶는 것이 아니라, 통계 정보와 최적화 알고리즘을 기반으로 최적의 순서를 찾아 처리합니다.
• “임의로 3개 정도씩 묶는다”는 표현은 부정확합니다.

3. (다)
“EQUI JOIN은 조인에 관여하는 테이블 간의 칼럼 값들이 정확하게 일치하는 경우에 사용되는 방법이다.”
• EQUI JOIN은 두 테이블 간 칼럼 값이 정확히 일치할 때 사용하는 조인 방식으로, “=” 연산자를 사용합니다.

4. (라)
“EQUI JOIN ‘=’ 연산자에 의해서만 수행되며, 그 이외의 비교 연산자를 사용하는 경우에는 모두 NON EQUI JOIN이다.”
• EQUI JOIN은 “=” 연산자를 사용하는 조인 방식이며, 다른 비교 연산자(`>`, `<`, `BETWEEN` 등)를 사용하는 경우 NON EQUI JOIN으로 분류됩니다.

5. (마)
“대부분 NON EQUI JOIN을 수행할 수 있지만, 때로는 설계상의 이유로 수행이 불가능한 경우도 있다.”
• NON EQUI JOIN은 “=” 이외의 연산자를 사용하는 조인 방식으로, 데이터 모델이나 설계상의 제약으로 인해 불가능한 경우도 있을 수 있습니다.

 

14. 실행 결과가 다른 하나는?

1. 
SELECT T.REGION_NAME, T.TEAM_NAME, T.STADIUM_ID, S.STADIUM_NAME
S.STADIUM_NAME
FROM TEAM T INNER JOIN STADIUM S
USING (T.STADUM_ID = S.STADIUM_ID);

2. 
SELECT T.REGION_NAME, T.TEAM_NAME, T.STADIUM_ID, S.STADIUM_NAME
S.STADIUM_NAME
FROM TEAM T INNER JOIN STADIUM S
ON (T.STADUM_ID = S.STADIUM_ID);

3. 
SELECT T.REGION_NAME, T.TEAM_NAME, T.STADIUM_ID, S.STADIUM_NAME
S.STADIUM_NAME
FROM TEAM T, STADIUM S
WHERE (T.STADUM_ID = S.STADIUM_ID);
해설

• `USING` 구문은 SQL 표준에서 제공하는 조인 방식으로, 두 테이블 간 동일한 이름의 컬럼을 기준으로 조인을 수행합니다.
• 그러나 이 SQL 문에서 `USING` 구문이 잘못 사용되었습니다. `USING`은 괄호 안에 단순히 동일한 컬럼 이름만 명시해야 합니다(예: `USING (STADIUM_ID)`).
• 현재처럼 조건식(`T.STADUM_ID = S.STADIUM_ID`)을 넣으면 구문 오류가 발생합니다.
• 결과적으로 실행되지 않습니다.

 

'[자격증] > SQLD' 카테고리의 다른 글

[오답 풀이] 1과목  (0) 2025.03.06
[2과목] 관리 구문  (0) 2025.03.03
[2과목] SQL 활용  (0) 2025.03.02
[1과목] 데이터 모델과 SQL  (0) 2025.02.26
[1과목] 1장 데이터 모델링의 이해  (0) 2025.02.25