포스트

[과목 II] 자격검정 실전문제(01~20)

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

REVOKE

① INSERT

② RENAME

③ COMMIT

④ REVOKE

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

        이미지

        • 트랜잭션은 데이터베이스의 상태를 변화시키기 위한 하나의 작업 단위로, BEGIN으로 시작하고 END로 끝난다.
        • COMMIT 명령어를 실행하면, 트랜잭션 내에서 수행된 모든 변경 사항이 DB에 영구적으로 반영되어 다른 사용자도 변경된 값을 조회할 수 있다.
        • ROLLBACK 명령어를 실행하면, 트랜잭션 내에서 수행된 모든 변경 사항이 취소되어 트랜잭션 시작 시점으로 되돌아간다. ROLLBACK 후에는 변경 사항이 무효화되므로, 처음부터 다시 UPDATE A와 UPDATE B 등의 작업을 해야 한다.

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

UPDATE

INSERT는 테이블에 데이터를 입력할 때 사용한다.

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

DELETE는 테이블의 정보가 필요 없게 되었을 경우 데이터 삭제를 수행한다.

  • 데이터의 수정 시 사용하는 DML 구문이다.

Q. 아래 내용에 해당하는 SQL 명령어의 종류는?

TCL

논리적인 작업의 단위를 묶어 DML에 의해 조작된 결과를 작업단위(Transaction)별로 제어하는 명령어인 COMMIT, ROLLBACK, SAVEPOINT 등이 여기에 해당하며, 일부에서는 DCL(Data Control Language)로 분류하기도 한다.

  • Transaction를 제어하는 명령어는 TCL(Transaction Control Language)이다.

이미지

  • COMMIT 시 ①, ②를 적용한 데이터를 다른 사용자가 볼 수 있다.
  • ROLLBACK은 시작 단계 작업까지 되돌리므로 COMMIT(이미 DB에 반영이 된 상태)한 경우, COMMIT한 시점까지 복구해서 ③부터 다시 실행된다.
  • SAVEPOINT를 지정할 경우, COMMIT 시점이 아닌 SAVEPOINT 시점인 ④부터 실행된다.

Q. SELECT 문에 대한 설명으로 가장 적절하지 않은 것은?

① WHERE 절은 필수가 아니므로 생략 가능하다.

② DISTINCT 옵션을 통해 중복된 데이터가 있을 경우 1건으로 처리해 출력할 수 있다.

③ FROM 절이 없는 다음 문장 ”SELECT COL1, COL2”은 에러 없이 수행된다.

④ SELECT List에 서브쿼리가 사용될 수 있다.

  • SELECT, FROM은 필수이므로 생략되면 에러가 발생된다.
1
2
SELECT [ALL/DISTINCT] 보고 싶은 칼럼명, 보고싶은 칼럼명, 
FROM 해당 칼럼들이 있는 테이블명;
  • ALL: Default 옵션이므로 별도로 표시하지 않아도 된다.
  • DISTINCT: 중복된 데이터가 있는 경우 1건으로 처리해서 출력한다.

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

DML - SELECT

  • DDL(Data Definition Language): CREATE, ALTER, DROP, RENAME
  • DML(Data Modification Language): SELECT, INSERT, UPDATE, DELETE
  • DCL(Data Control Language): GRANT, REVOKE
  • TCL(Transaction Control Language): COMMIT, ROLLBACK

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

② GRANT

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

① CREATE

② GRANT

③ ALTER

④ DROP

  • 데이터의 구조를 정의하는 명령어는 DDL(데이터 정의어)에 해당하며 CREATE, ALTER, DROP, RENAME이 있다.

Q. 데이터베이스에서 조회되는 데이터에 대한 조건을 설정하여 원하는 데이터만을 검색하기 위해 사용하는 절로 가장 적절한 것은?

① WHERE 절

① WHERE 절

② GROUP BY 절

③ ORDER BY 절

④ HAVING 절

  • WHERE절은 SQL을 이용하여 데이터베이스로부터 데이터를 검색할 때 조회되어야 하는 데이터를 필터링하는 데 사용된다.

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

① SELECT DEPTNO, ROUND(AVG(SAL), 2)

② FROM EMP

③ WHERE AVG(SAL) >= 1800

④ GROUP BY DEPTNO;

  • WHERE 절에는 집계 함수를 사용할 수 없다.
  • WHERE 절은 FROM 절 다음에 위치하며, 조건식은 아래 내용으로 구성된다.
    • 칼럼(Column)명(보통 조건식의 좌측에 위치)
    • 비교 연산자
    • 문자, 숫자, 표현식(보통 조건식의 우측에 위치)
    • 비교 칼럼명(JOIN 사용시)

Q. 아래 SQL 수행 결과로 가장 적절한 것은?

90, NULL, 30, 60

1
2
3
4
 SELECT SUM(COL2) + SUM(COL3) FROM TAB_A;
 SELECT SUM(COL2) + SUM(COL3) FROM TAB_A WHERE COL1 > 0;
 SELECT SUM(COL2) + SUM(COL3) FROM TAB_A WHERE COL1 IS NOT NULL;
 SELECT SUM(COL2) + SUM(COL3) FROM TAB_A WHERE COL1 IS NULL;

[TAB_A]

COL1COL2COL3
3020
5010
010
  • NULL의 연산
    • NULL 값과의 연산(+, -, *, / 등)은 NULL을 리턴
    • NULL 값과의 비교연산(=, >, >=, <=)은 거짓(FALSE)를 리턴
    • 특정 값보다 크다, 적다라고 표현할 수 없음
  • ① NULL은 SUM 연산 대상에서 제외된다.
  • ② COL1이 NULL인 두 번째 행은 NULL 연산 제외 조건으로 제외된다.(NULL+20 = NULL)

Q. 다음 SQL 문장 중 COLUMN1의 값이 NULL이 아닌 경우를 찾아내는 문장으로 적절한 것은? (ANSI 표준 기준)

① SELECT * FROM MYTABLE WHERE COLUMN1 IS NOT NULL;

② SELECT * FROM MYTABLE WHERE COLUMN1 <> NULL;

③ SELECT * FROM MYTABLE WHERE COLUMN1 != NULL;

④ SELECT * FROM MYTABLE WHERE COLUMN1 IS NULL;

  • NULL 값을 조건절에서 사용하는 경우 IS NULL, IS NOT NULL이란 키워드를 사용해야 한다.
  • 부정 비교 연산자
    • != : 같지 않다.
    • ^= : 같지 않다.
    • <> : 같지 않다.(ISO 표준, 모든 운영체제에서 사용 가능)
    • NOT 컬럼명 = : ~와 같지 않다.
    • NOT 컬럼명 > : ~보다 크지 않다.

Q. 아래에 대한 설명으로 적절한 것은?

1
2
3
4
5
6
7
8
9
10
11
12
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에서 ㉡과 같이 데이터를 입력하고 ㉣과 같이 조회하였을 때, 데이터는 조회되지 않는다.

  • 서비스번호 칼럼의 모든 레코드가 ‘001’과 같은 숫자형식으로 입력되어 있어야 오류가 발생하지 않는다.
  • ㉡과 같이 데이터를 입력하면 서비스명 칼럼의 데이터에 대해서 오라클에서는 NULL로 입력된다.
  • ㉡과 같이 데이터를 입력되어 있을 때, 오라클에서 데이터를 조회하려면 서비스명 IS NULL 조건으로 조회하여야 한다.
  • ㉡과 같이 데이터를 입력되어 있을 때, SQL Server에서 데이터를 조회하려면 서비스명 = ‘’로 조회하여야 한다.
  1. 숫자로 변환 가능한 문자:
    • 예를 들어, 서비스 번호 컬럼에 숫자로 변환 가능한 문자(예: “1”, “2”)만 존재하면, TO_NUMBER 함수를 사용하여 숫자로 변환한 후 비교할 수 있다.
    • 이 경우, TO_NUMBER(서비스번호) = 1과 같은 조건이 가능해진다.
  2. 숫자로 변환 불가능한 문자:
    • 만약 서비스 번호 컬럼에 “A”, “B”, “C”와 같은 숫자로 변환 불가능한 문자가 포함되어 있으면, TO_NUMBER 함수가 오류를 발생시킨다.
    • 따라서, 숫자로 변환 불가능한 문자들이 포함되어 있는 경우, 숫자와의 비교가 불가능한다.
  • VARCHAR2(10)는 최대 10자의 가변 길이 문자열을 저장할 수 있는 컬럼을 정의할 때 사용한다.
    • VARCHAR2: 가변 길이 문자열을 저장하는 데이터 타입이다. 문자열의 길이가 가변적이어서 필요한 만큼의 공간만 사용한다.
    • (10): 저장할 수 있는 최대 문자 수를 의미한다. 이 경우, 최대 10자까지 저장할 수 있다.
    • 예를 들어, VARCHAR2(10)로 정의된 컬럼에는 “Hello”나 “World!”와 같은 문자열을 저장할 수 있지만, “Hello, World!”처럼 11자 이상의 문자열은 저장할 수 없다.

Q. 함수의 실행 결과로 가장 적절하지 않은 것은?(단, A의 아스키코드는 65이다.)

① LOWER(’SQL Expert’) : ‘sql expert’

② UPPER(’SQL Expert’) : ‘SQL EXPERT’

③ ASCII(’A’) : 65

④ LTRIM(’xxYYZZxYZxx’, ‘x’) : ‘YYZZxYZ’

  • LTRIM은 첫 번째 인자 값인 문자열의 왼쪽 첫 문자부터 확인해서 두 번째 인자 값인 지정문자가 나타나면 해당 문자를 제거한다. 다른 문자 사이 또는 오른쪽에 있는 지정 문자는 제거되지 않는다. 따라서 결과는 ‘YYZZxYZxx’이다.
  • 아래 쿼리는 ‘A’의 아스키 코드 값인 65를 반환한다.

    1
    
      	SELECT ASCII('A') FROM DUAL;
    
  • 연산자의 종류
    • 비교 연산자
      • =
        • 같다.
        • 보다 크다.
      • =

        • 보다 크거나 같다.
      • <
        • 보다 작다.
      • <=
        • 보다 작거나 같다.
    • SQL 연산자
      • BETWEEN a AND b
        • a와 b의 값 사이에 있으면 된다. (a와 b값이 포함됨)
      • IN (list)
        • 리스트에 있는 값 중에서 어느 하나라도 일치하면 된다.
      • LIKE ‘비교문자열’
        • 비교문자열과 형태가 일치하면 된다.(%, _ 사용)
      • IS NULL
        • NULL 값이 경우
    • 논리 연산자
      • NOT
        • 뒤에 오는 조건에 반대되는 결과를 되돌려 준다.
      • AND
        • 앞에 있는 조건과 뒤에 오는 조건이 참(TRUE)이 되면 결과도 참(TRUE)이 된다. 즉, 앞뒤의 조건 중 하나만 참(TRUE)이면 된다.
      • OR
        • 앞의 조건이 참(TRUE)이거나 뒤의 조건이 참(TRUE)이 되어야 결과도 참(TRUE)이 된다. 즉, 앞뒤의 조건 중 하나만 참(TRUE)이면 된다.
    • 부정 비교 연산자
      • !=
        • 같지 않다.
      • ^=
        • 같지 않다.
      • <>
        • 같지 않다.(ISO 표준, 모든 운영체제에서 사용 가능)
      • NOT 칼럼명 =
        • ~와 같지 않다.
      • NOT 칼럼명 >
        • ~보다 크지 않다.
    • 부정 SQL 연산자
      • NOT BETWEEN a AND b
        • a와 b의 값 사이에 있지 않다.
      • NOT IN (list)
        • list 값과 일치하지 않는다.
      • IS NOT NULL
        • NULL 값을 갖지 않는다.

Q. 아래를 참고할 때 실행 결과가 다른 SQL은?

이미지

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
 
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_YML, JOIN_HH) = '2014120100'
GROUP BY SVC_ID;


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

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 SVC_ID;

 
SELECT SVC_ID, COUNT(*) AS CNT
FROM SVC_JOIN
WHERE TO_DATE('201501', 'YYYYMM') = SVC_END_DATE
AND JOIN_YMD||JOIN_HH = '2O14120100'
GROUP BY SVC_ID
  • ①, ②, ③번 모두 가입이 2014년 12월 01일 00시에 발생했고 서비스 종료일시가 2015년 01월 01일 00시 00분 00초와 2015년 01월 31일 23시 59분 59초 사이에 만료되는 데이터를 찾는 조건이다.
  • ④번 SQL은 가입 조건은 동일하지만, 서비스 종료일시가 2015년 01월 01일 00시 00분 00초에 종료되는 SQL을 찾는 조건이다.
1
2
3
4
SELECT TO_DATE('201501','YYYYMM') FROM DUAL;

-- 결과
2015-01-01 00:00:00.000
  • TO_DATE(‘201501’,’YYYYMM’)는 2015년 1월 1일을 나타내므로, SVC_END_DATE는 2015년 1월 1일에만 일치할 것이다.
  • 그렇기 때문에 이 두 값의 비교 결과는 매우 다를 수 있다. 이런 차이는 데이터베이스 시스템에서 다루는 데이터의 형식과 범위에 따라 결정된다.

Q. GROUP BY 절과 HAVING 절에 대한 설명으로 가장 적절한 것은?

④ HAVING 절은 일반적으로 GROUP BY 절 뒤에 위치한다.

① 집계 함수의 통계 정보는 NULL 값을 가진 행을 포함하여 수행한다.

② GROUP BY 절에서는 SELECT 절과 같이 ALIAS 명을 사용할 수 있다.

③ 집계 함수는 WHERE 절에도 올 수 있다.

④ HAVING 절은 일반적으로 GROUP BY 절 뒤에 위치한다.

  • 집계 함수의 통계 정보는 NULL 값을 가진 행을 제외하고 수행한다.
  • GROUP BY 절에서는 SELECT 절과는 달리 ALIAS 명을 사용할 수 없다.
  • 집계 함수는 WHERE 절에는 올 수 없다.(집계 함수를 사용할 수 있는 GROUP BY 절보다 WHERE 절이 먼저 수행된다.)
  • GROUP BY 절과 HAVING 절의 특성
    • WHERE 절은 전체 데이터를 GROUP으로 나누기 전에 행들을 미리 제거한다.
    • GROUP BY 절을 통해 소그룹별 기준을 정한 후, SELECT 절에 집계함수를 사용한다.
    • GROUP BY 절에 의한 소그룹별로 만들어진 집계 데이터 중, HAVING 절에서 제한조건을 두어 조건을 만족하는 내용만 출력한다.
    • HAVING 절은 GROUP BY 절의 기준 항목이나 소그룹의 집계 함수를 이용한 조건을 표시할 수 있다.
    • HAVING 절은 일반적으로 GROUP BY 절 뒤에 위치한다.

Q. 아래를 참고할 때 SQL의 실행 결과로 가장 적절한 것은? (단, 이해를 돕기 위해 ↓는 줄바꿈을 의미하며 실제 저장값이 아님, 또한 CHR(10)의 ASCII 값은 줄바꿈을 의미)

5

1
2
3
4
5
6
SELECT SUM(CC)
FROM
	(
	SELECT(LENGTH(C1))- LENGTH(REPLACE(C1, CHR(10))) +1) CC
	FROM TAB1
	);

이미지

  • 라인수를 구하기 위해서 함수를 이용해서 작성한 SQL이다.
  • 줄바꿈도 LENGTH로 계산했을 때 1을 더하는 방식으로 처리된다고 생각하면 쉽다. 줄바꿈은 그냥 문자일 뿐이다. 이를 염두에 두고 아래와 같이 계산한다.
  • LENGTH: 문자열의 길이를 반환하는 함수
  • CHR: 주어진 ASCII 코드에 대한 문자를 반환하는 함수(CAR(10) → 줄바꿈)
  • REPLACE: 문자열을 치환하는 함수(REPLACE(C1, CHR(10)) → 줄바꿈 제거)
  • 함수 결과 값

    이미지

  • 각 행의 결과를 합산
    • 각 행의 결과를 CC라는 별칭으로 나타내고, 이 값을 합산한다.
      • 첫 번째 행의 CC 값: 2
      • 두 번째 행의 CC 값: 3
    • 최종 합산: 2 + 3 = 5

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

③ 2023.01.10 10:10:00

1
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:05:00

③ 2023.01.10 10:10:00

④ 2023.01.10 10:30:00

  • DUAL 테이블의 특성
    • 사용자 SYS가 소유하며 모든 사용자가 액세스 가능한 테이블이다.
    • SELECT ~ FROM ~의 형식을 갖추기 위한 일종의 DUMMY 테이블이다.
    • DUMMY라는 문자열 유형의 칼럼에 ‘X’라는 값이 들어 있는 행을 1건 포함하고 있다.
  • 오라클에서 날짜의 연산은 숫자의 연산과 같다. 특정 날짜에 1을 더하면 하루를 더한 결과와 같으므로 1/24/60 = 1분을 의미한다. 1/24(60/10) = 10분과 같으므로 2015년 1월 10일 10시에 10분을 더한 결과와 같다.
  • 단일행 함수의 종류

    종류내용함수의 예    
    문자형 함수문자를 입력하면 문자나 숫자의 값을 반환한다.LOWER, UPPER, SUBSTR/SUBSTRING, LENGTH/LEN, LTRIM, RTRIM, TRIM, ASCII    
    숫자형 함수숫자를 입력하면 숫자 값을 반환한다.ABS, MOD, ROUND, TRUNC, SIGN, CHR/CHAR, CEIL/CEILING, FLOOR, EXP, LOG, LN, POWER, SIN, COS, TAN    
    날짜형 함수DATE 타입의 값을 연산한다.SYSDATE/GETDATE, EXTRACT/DATEPART, TO_NUMBER(TO_CHAR(d, ‘YYYY’’MM’’DD’))/YEARMONTHDAY
    변환형 함수문자, 숫자, 날짜형 값의 데이터 타입을 변환한다.TO_NUMBER, TO_CHAR, TO_DATE/CAST, CONVERT    
    NULL 관련 함수NULL 처리하기 위한 함수NVL/ISNULL, NULLIF, COALESCE    

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

② CASE LOC WHEN ‘NEW YORK’ THEN ‘EAST’ ELSE ‘ETC’ END

1
2
3
4
5
6
7
8
9
10
11
()
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’)

  • = 조건만 있는 경우 CASE 표현식을 단순 CASE 표현식으로 변환할 수 있다.
  • 올바른 DECODE 함수의 표기법은 DECODE(LOC, ‘NEW YORK’, ‘EAST’, ‘ETC’)이다.

이미지


Q. 각 팀별로 FW, MF, DF, GK 포지션의 인원수와 팀별 전체 인원수를 구하는 SQL을 작성할 때 결과가 다른 하나는? (단, ①은 SQL Server 환경이고 보기 ②, ③, ④는 오라클 환경이다.)

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
32
33
34
35
36
37
38
39
40

SELECT TEAM_ID,
ISNULL(SUM(CASE WHEN POSITION = 'FW' THEN 1 END), 0) FW,
ISNULL(SUM(CASE WHEN POSITION = 'MF' THEN 1 END), 0) MF,
ISNULL(SUM(CASE WHEN POSITION = 'DF' THEN 1 END), 0) DF,
ISNULL(SUM(CASE WHEN POSITION = 'GK' THEN 1 END), 0) GK,
COUNT(*) SUM 

FROM PLAYER
GROUP BY TEAM_ID:


SELECT TEAM_ID,
NVL(SUM(CASE POSITION WHEN 'FW' THEN 1 END), 0) FW, 
NVL(SUM(CASE POSITION WHEN 'MF' THEN 1 END), 0) MF, 
NVL(SUM(CASE POSITION WHEN 'DF' THEN 1 END), 0) DF, 
NVL(SUM(CASE POSITION WHEN 'GK' THEN 1 END), 0) GK, 
COUNT(*) SUM 
FROM PLAYER 
GROUP BY TEAM_ID;


SELECT TEAM_ID,
NVL(SUM(CASE WHEN POSITION = 'FW' THEN 1 END), 0) FW,
NVL(SUM(CASE WHEN POSITION = 'MF' THEN 1 END), 0) MF,
NVL(SUM(CASE WHEN POSITION = 'DF' THEN 1 END), 0) DF,
NVL(SUM(CASE WHEN POSITION = 'GK' THEN 1 END), 0) GK,
COUNT(*) SUM 
FROM PLAYER
GROUP BY TEAM_ID:


SELECT TEAM ID,
NVL(SUM(CASE POSITION WHEN 'FW' THEN 1 ELSE 1 END), 0) FW, 
NVL(SUM(CASE POSITION WHEN 'MF' THEN 1 ELSE 1 END), 0) MF, 
NVL(SUM(CASE POSITION WHEN 'DE' THEN 1 ELSE 1 END), 0) DE, 
NVL(SUM(CASE POSITION WHEN 'GK' THEN 1 ELSE 1 END), 0) GK, 
COUNT(*) SUM 
FROM PLAYER
GROUP BY TEAM_ID;
  • ④는 CASE 문장에서 데이터가 없는 경우를 0으로 표시해야 (ELSE 0) 다른 3개의 지문과 같은 결과가 나온다.
  • CASE 문에서 ELSE 값을 생략하면 NULL이 리턴된다.
  • 특정 조건 (position = 'FW')에 대해 1을 부여하고, 이를 SUM하여 ‘FW’의 카운트를 구한다.
  • ‘FW’가 없다면 SUM이 NULL이 되므로, NVL을 사용해 이를 0으로 치환한다.
  • 팀 아이디별로 그룹화하여 각 포지션과 전체 인원의 카운트를 구한다.
  • CASE 문에서 조건이 반복되면 상수만을 전달할 수 있다.
  • ‘FW’가 없는 팀의 경우, 각 ‘FW’가 아닌 행마다 1을 부여하면 SUM이 0이 될 수 없다.

Q. 아래 SQL에 대한 설명으로 가장 적절한 것은? (단, 고객이름은 중복되지 않는다고 가정)

② 수량이 10보다 큰 주문을 한 고객이름과 주문한 수량의 합을 구한다.

이미지

1
2
3
4
5
6
SELECT 고객이름, SUM(수량)
FROM 고객, 상품, 주문
WHERE 고객.고객번호 = 주문.고객번호
	AND 상품.상품번호 = 주문.상품번호 
GROUP BY 고객.고객이름 
HAVING MAX(수량) > 10;

① 고객번호가 10보다 큰 고객이름과 주문한 수량의 합을 구한다.

② 수량이 10보다 큰 주문을 한 고객이름과 주문한 수량의 합을 구한다.

③ 열한 번 이상 상품을 주문한 고객이름과 주문한 수량의 합을 구한다.

④ 주문한 수량의 합이 10보다 큰 고객이름과 주문한 수량의 합을 구한다.


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

NULLIF

1
2
SELECT ENAME, EMPNO, MGR, (MGR, 7698) AS NM
FROM EMP;
  • NULLIF(EXPR1, EXPR2)
    • NULLIF 함수는 EXPR1이 EXPR2와 같으면 NULL을, 같지 않으면 EXPR1을 리턴한다.
    • 특정 값을 NULL로 대체하는 경우에 유용하게 사용할 수 있다.
  • 단일행 NULL 관련 함수의 종류
    • NVL(표현식1, 표현식2) / ISNULL(표현식1, 표현식2)
      • 표현식1의 결괏값이 NULL이면 표현식2의 값을 출력한다.
      • 단, 표현식1과 표현식2의 결과 데이터 타입이 같아야 한다.
      • NULL 관련 가장 많이 사용되는 함수
    • NULLIF(표현식1, 표현식2)
      • 표현식1이 표현식2와 같으면 NULL을, 같지 않으면 표현식1을 리턴한다.
    • COALESCE(표현식1, 표현식2, …)
      • 임의의 개수 표현식에서 NULL이 아닌 최초의 표현식을 나타낸다.
      • 모든 표현식이 NULL이라면 NULL을 리턴한다.

※ 주: 오라클함수/SQL Server 표시, ‘/’ 없는 것은 공통 함수


참고 자료


  • https://www.youtube.com/watch?v=3xjikMSPtbU
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.