본문 바로가기
Database/SQLD

SQLD 문제 풀이 4

by KkingKkang 2023. 5. 11.

1. 아래와 같은 테이블에 SQL 구문이 실행되었을 경우 최종 출력 값을 작성하시오.

품목ID 단가
001 10000
002 20000
003 10000
004 20000

 

BEGIN TRANSACTION

INSERT INTO 품목(품목 ID, 단가) VALUES('005',20000)

COMMIT

BEGIN TRANSACTION

DELETE 품목 WHERE 품목ID = '002'

BEGIN TRANSACTION

UPDATE 품목 SET 단가 = 20000 WHERE 단가 = 10000

ROLLBACK

SELECT COUNT(품목ID) FROM 품목 WHERE 단가 = 20000

ROLLBACK 을 하면 COMMIT 이후에 실행되었던 것들은 다 취소됨

 답 : 3 

 

2. 아래의 상품 테이블의 데이터에 대하여 관리자가 아래와 같이 SQL 문장을 실행하여 데이터를 변경하였다. 데이터 변경 후의 상품ID '001' 의 최종 상품명을 작성하시오.

상품 테이블

상품ID 상품명
001 TV
BEGIN TRANSACTION;

SAVE TRANSACTION SP1;

UPDATE 상품 SET 상품명 = 'LED-TV' WHERE 상품ID = '001';

SAVE TRANSACTION SP2;

UPDATE 상품 SET 상품명 = '삼성-TV' WHERE 상품ID = '001';

ROLLBACK TRANSACTION SP2;

COMMIT

답 : LED-TV

BEGIN TRANSACTION(BEGIN TRAN)으로 트랜잭션을 시작하고
COMMIT TRANSACTION(TRANSACTION 생략 가능) 또는
ROLLBACK TRANSACTION(TRANSACTION 생략 가능)으로 트랜잭션을 종료한다.
ROLLBACK 구문을 만나면 최초의 BEGIN TRANSACTION 시점까지 모두 ROLLBACK이 수행된다.
저장점(SAVEPOINT)을 정의하면 롤백(ROLL BACK)할 때 트랜잭션에 포함된 전체 작업을 롤백 하는 것이 아니라 한 시점에서 SAVEPOINT 까지 트랜잭션의 일부만 롤백할 수 있다.

 

3. ㄱ에 들어갈 말은? 

SQL을 사용하여 데이터베이스에서 데이터를 조회할 때 원하는 데이터만을 검색하기 위해서 SELECT, FROM 절과 함께 (ㄱ) 을 이용하여 조회되는 데이터의 조건을 설정하여 데이터를 제한할 수 있다.

ㄱ : WHERE

 

4. 다음 중 SQL의 실행결과로 가장 적절한 것은?

EMP_TBL

EMPNO SAL
100 1500
200 3000
300 2000
SELECT COUNT(*)
FROM EMP_TBL
WHERE EMPNO > 100 AND SAL >= 3000 OR EMPNO = 200;

AND → OR 순으로 풀기

1) EMPNO > 100 : 200,300
2) AND SAL >= 3000 : 200
3) OR EMPNO=200 : 200

답 : 1

연산자의 우선순위
1. 괄호로 묶은 연산
2. 부정 연산자 (NOT)
3. 비교 연산자(=,>,<) 와 SQL 비교 연산자 (BETWEEN AND , IN(), LIKE, IS NULL)
4. 논리 연한자 중 AND, OR순으로 처리

 

5. SELECT COL1 + COL3 FROM TAB_A;의 결과는? (NULL의 연산)

COL1 COL2 COL3
30 NULL 20
NULL 10 40
50 NULL NULL

50
NULL
NULL

 

6. 아래와 같은 DDL 문장으로 테이블을 생성하고, SQL들을 수행하였을 때 다음 설명 중 옳은 것은?

CREATE TABLE 서비스
(
	서비스번호 VARCHAR2(10) PRIMARY KEY,
    서비스명 VARCHAR2(100) NULL,
    게시일자 DATE NOT NULL
);

--ㄱ
SELECT * FROM 서비스 WHERE 서비스번호 = 1;

--ㄴ
INSERT INTO 서비스 VALUES ('999','','2015-11-11');

--ㄷ
SELECT * FROM 서비스 WHERE 서비스명 = '';

--ㄹ
SELECT * FROM 서비스 WHERE 서비스명 IS NULL;

1) 서비스번호 컬럼에 모든 레코드 중에서 '001'과 같은 숫자형식으로 하나의 레코드만이라도 입력되어 있으면 ㄱ)은 오류 없이 실행된다. 
→ 서비스번호는 VARCHAR으로 INT형식으로 검색할 수 없다.

2) ORACLE에서 ㄴ)과 같이 데이터를 입력하였을 때, 서비스명 컬럼에 공백문자 데이터가 입력된다.
→ SQL SERVER는 공백문자 데이터로 , ORACLE은 NULL로 입력된다. 

3) ORACLE에서 ㄴ)과 같이 데이터를 입력하고, ㄷ)과 같이 조회하였을 때, 데이터는 조회된다.
→ NULL로 인식하기 때문에 IS NULL 로 검색해야한다.

4) SQL SERVER에서 ㄴ)과 같이 데이터를 입력하고, ㄹ)과 같이 조회하였을 때, 데이터는 조회되지 않는다.
→ SQL SERVER에서는 = '' 로 검색해야한다.

 

7. 월별매출 테이블 2014년 11월부터 2015년 3월 까지의 매출금액 합계를 출력하는 SQL 문장

매출 금액
... ... ...
SELECT SUM(매출 금액)
FROM 월별매출
WHERE 
년 = '2014' AND 월 BETWEEN '11' AND '12'
OR 년 = '2015' AND 월 BETWEEN '01' AND '03';

 

8. 아래 테이블 스키마를 참조하여 SQL 문장을 작성하였다. 다음 중 결과가 다른 SQL 문장은? 

사비스_가입

고객ID
서비스ID
가비일자
가입시간
서비스시작일시
서비스종료일시

SVC_JOIN

CUST_ID: VARCHAR2(10) NOT NULL
SVC_ID: VARCHAR2(5) NOT NULL
JOIN_YMD: VARCHAR2(8) NOT NULL
JOIN_HH : VARCHAR2(4) NOT NULL
SVC_START_DATE: DATE NULL
SVC_END_DATE : DATE NULL
--1
SELECT SVC_ID, COUNT(*) AS CNT 
FROM SVC_JOIN
WHERE SVC_END_DATE >= TO_DATE('20150101000000','YYYYMMDDHH24miss')
	AND SVC_END_DATE = TO_DATE('20150131235959','YYYYMMDDHH24miss')
    AND CONCAT(JOIN_YMD, JOIN_HH) = '2014120100'
GROUP BY SYC_ID;

--2
SELECT SVC_ID, COUNT(*) AS CNT 
FROM SVC_JOIN
WHERE SVC_END_DATE >= TO_DATE('20150101','YYYYMMDD')
	AND SVC_END_DATE < TO_DATE('20150201','YYYYMMDDHH')
    AND (JOIN_YMD, JOIN_HH) IN (('20141201','00'))
GROUP BY SYC_ID;

--3
SELECT SVC_ID, COUNT(*) AS CNT 
FROM SVC_JOIN
WHERE '201501' = TO_CHAR(SVC_END_DATE, 'YYYYMM')
	AND JOIN_YMD = '20141201'
    AND JOIN_HH = '00'
GROUP BY SYC_ID;

--4
SELECT SVC_ID, COUNT(*) AS CNT 
FROM SVC_JOIN
WHERE TO_DATE('201501','YYYYMM') = SVC_END_DATE
	AND JOIN_YMD || JOIN_HH = '2014120100'
GROUP BY SYC_ID;
-- 201501 전체를 거르는게 아니라 201501000000 을 조건으로 두게 된다. 그래서 위 3개와 다른 결과가 나온다.

 

9. 아래와 같은 내장 함수에 대한 설명 중에서 옳은 것을 모두 고르시오

가) 함수의 입력 행수에 따라 단일행 함수와 다중행 함수로 구분할 수 있다.
나) 단일행 함수는 SELECT, WHERE, ORDER BY, UPDATE 의 SET절에 사용이 가능하다.
다) 1:M 관계의 두 테이블을 조인할 경우 M쪽에 다중행이 출력되므로 단일행 함수는 사용할 수 없다.
라) 단일행 함수는 다중행 함수와 다르게 여러 개의 인수가 입력되어도 단일값만을 반환한다. → 모두 단일값 반환

 

단일행 함수(Single-Row Function)

종류 내용 함수의 예
문자형 함수 문자를 입력하면 문자나 숫자 값을 반환한다. LOWER, UPPER, SUBSTR, LENGTH, LTRIM, RTRIM, TRIM, ASCII
숫자형 함수 숫자를 입력하면 숫자값을 반환한다. ABS, MOD, ROUND, TRUNC, SIGN, CHR, CEIL, FLOOR, EXP, LOG, LN, POWER, COS, TAN
날짜형 함수 DATE 타입의 값을 연산한다. SYSDATE, EXTRACT, TO_NUMBER
변환형 함수 문자, 숫자, 날짜형 값의 데이터 타입을 변환한다. TO_NUMBER, TO_CHAR, TO_DATE
NULL 관련 함수 NULL을 처리하기 위한 함수 NVL, NULLIF, COALESCE

 

단일행 함수의 특징

  • SELECT, WHERE, ORDER BY, UPDATE SET 절에 사용 가능하다.
  • 각 행(ROW)들에 대해 개별적으로 작용하여 데이터 값들을 조작하고, 각각의 행에 대한 조작 결과를 리턴한다.
  • 여러 인자(Argument)를 입력해도 단 하나의 결과만 리턴한다.
  • 함수의 인자(Argument)로 상수, 변수, 표현식이 사용 가능하고, 하나의 인수를 가지는 경우도 있지만 여러개의 인수를 가질 수도 있다.
  • 특별한 경우가 아니면 함수의 인자(Argument)로 함수를 사용하는 함수의 중첩이 가능하다.

 

다중행 함수(Multi-Row-Function)

  • 다중행 함수는 집계함수, 그룹함수, 윈도우 함수로 구분된다.
    • 집계함수 : COUNT, AVG, SUM, MIN, MAX, STDDEV(표준편차), VARIANCE(분산)
    • 그룹함수 : ROLLUP(소계), CUBE(모든 조합의 그룹별 소계), GROUPING SETS(다양한 소계 집합)
    • 윈도우함수 :
      • 그룹 내 순위 함수 : RANK, DENSE_RANK, ROW_NUMBER
      • 그룹 내 집계 함수 : SUM, MAX, MIN, AVG, COUNT
      • 그룹 내 행 순서 관련 함수 : FIRST_VALUE, LAST_VALUE, LAG, LEAD
      • 그룹 내 비율 관련 함수 : CUME_DIST, PRECENT_RANK, NTLE, RATIO_TO_REPORT
      • 선형 분석을 포함한 통계 분석 함수

 

반응형

'Database > SQLD' 카테고리의 다른 글

SQLD 문제 풀이 6  (0) 2023.05.15
SQLD 문제 풀이 5  (1) 2023.05.13
SQLD 문제 풀이 3  (0) 2023.05.10
SQLD 문제풀이 2  (0) 2023.05.10
SQLD 문제풀이 1  (0) 2023.05.08

댓글