본문 바로가기
SQL

[SQL] 메타코드M 비전공자 맞춤 SQLD 강의 (3) - SELECT, 함수

by 모닥불🔥 2024. 2. 5.

메타코드m의 SQLD 강의를 정리하는 세 번째 시간! 나는 무료 강의분만 들었기 때문에... 요 강의 정리 글은 오늘이 마지막이 될 것 같다.
 
[🔥 이전 2개 글은 여기로, 1탄에서 필기 공유도 하고 있음]

 

[SQL] (필기 무료 공유) 메타코드M 비전공자 맞춤 SQLD 강의 (1) - DCL, DDL

2023년 11월 18일에 SQLD 시험을 쳤었다. 당해 빅분기 실기가 12월 2일에 있었다. 욕심이 많아 한 번에 다 준비하려고 했고, 퇴근 후에 총 5일 정도 공부해서 결과는 SQLD 58점 탈락...😨(심지어 하나 실

tdtd.tistory.com

 

[SQL] 메타코드M 비전공자 맞춤 SQLD 강의 (2) - DML, TCL

메타코드m의 SQLD 강의를 정리하는 두 번째 시간! 오늘은 DML과 TCL에 대해 정리한다. [🔥 이전 글은 여기로] [SQL] (필기 무료 공유) 메타코드M 비전공자 맞춤 SQLD 강의 (1) - DCL, DDL 2023년 11월 18일에 SQL

tdtd.tistory.com

 
정리한 강의는 아래와 같다.
 
메타코드M SQLD 자격증 문제 풀이 2시간 - 비전공자 맞춤형 [대기업 데이터분석 현직자 강의]
https://www.youtube.com/watch?v=8uP_E6SyiuM


🔥 데이터 조작어(DML: Data Manipulation Language)

 
SELECT 문은 데이터를 조회할 때 사용하는 명령어이다.

SELETCT문의 기본형

SELECT 조회대상
FROM 테이블명
WHERE 조건명
GROUP BY 집계기준 칼럼명
HAVING grouping 상태의 조건문
ORDER BY 칼럼명;

 
사실상 SELECT FROM 까지만 적어도 조회가 되긴 하는데, 뒤에 조건들이 줄줄 붙으면 위와 같은 형태가 된다.
 

 
SELECT 열1, 열2 FROM 테이블명;
위와 같이 적으면 테이블에서 열 2개를 조회할 수 있다.
위 캡처를 보면, 'C_INFO(고객 정보)'라는 테이블에서 '성별' 열과 '연령대' 열을 오른쪽과 같이 조회한다.
 

 
SELECT DISTINCT 열1 FROM 테이블명;
위와 같이 'DISTINCT'라는 명령어를 넣으면, 중복을 제외하고 조회하는 것이다.
여기에서 조회 대상에는 null도 포함된다. 알아 두자.
 
위 캡처를 보면, C_INFO라는 테이블에서 성별 열을 조회하는데, 중복을 제외하고 조회한다. 성별 열에는 'F(여자)', 'M(남자)', '빈칸(null)' 이렇게 세 가지 데이터 종류가 있으므로 중복은 모두 제외하고 3개의 행만 출력한다.
 

 
SELECT DISTINCT 열1, 열2 FROM 테이블명;
위와 같이 적으면 열1, 열2를 조합해서 중복되지 않은 값을 조회한다. null은 역시 포함된다.
 
위 캡처의 예를 보면, C_INFO라는 테이블에서 '성별' 열과 '연령대' 열을 조합하여 중복되지 않게 뽑는다. 겹치지 않게 '20대 여자', '20대 남자', '30대 여자', '30대 남자', '50대 성별 무응답' 이렇게 겹치지 않으니 5개 행이 전부 조회된다.
 

 
위 문제의 코드를 하나씩 살펴보자.

SELECT COUNT(*)
FROM C_INFO;

 
SQL 명령문에서 * 기호는 전체(all)를 뜻한다. 따라서 C_INFO 테이블 전체(*) 데이터의 개수(count)를 세면 된다. 여기서 전체 데이터의 수를 센다고 해서 테이블의 셀을 칸칸마다 세는 것이 아니라 '행의 개수와 데이터의 개수'는 같은 말이라고 생각하면 된다. 열은 변수, 행은 데이터 수라고 생각하자.
 
위 캡처에서는 5개의 행이 있으므로 '5'가 출력됨

SELECT COUNT(성별)
FROM C_INFO;

 
COUNT를 썼을 때는 null을 제외하고 센다. DISTINCT는 null을 포함하여 센 것과 차이가 있으니 잘 구분해야 한다.
위 명령문은 C_INFO라는 테이블에서 '성별' 열의 개수를 세라는 의미이므로, null을 제외한 행의 수인 '4'가 출력된다.

SELECT COUNT(DISTINCT 성별)
FROM C_INFO;

 
null을 포함하여 중복을 제외하고 세고 싶다면 열 이름 앞에 DISTINCT를 붙여 주면 된다. 그러면 null을 포함하여 중복을 제외하고 '3'을 출력한다.


🔥 함수: 문자형 함수 / 숫자형 함수 / 날짜형 함수

다음으로 알아볼 것은 '함수'이다. 함수에 관한 문제도 SQLD에 많이 나오니까 알아두는 것이 좋다. 함수는 주로 SELECT문 또는 WHERE문에서 사용된다.
 
먼저, 문자열을 다듬는 함수이다. 고객이 정보를 입력할 때 공백을 넣어 입력했다면? 대소문자를 모두 맞추지 않았다면? 데이터가 체계적으로 관리되기 어려울 것이다. 이럴 때 아래와 같은 함수를 사용하면 해결할 수 있다.

대표적인 문자형 함수

LOWER(문자열)
문자열을 소문자로 변환한다.
예) LOWER('SQL') → 'sql'

UPPER(문자열)
문자열을 대문자로 변환한다.
예) UPPER('sql')
→ 'SQL'

CONCAT(문자열1, 문자열2)
분리된 문자열끼리 결합한다.
예) CONCAT('가', '나')
→ '가나'

오라클의 경우 \\, SQL서버의 경우 +를 사용해도 동일한 결과가 나온다.
CONCAT('가', '나') = '가' \\ '나' = '가' + '나'

SUBSTR(문자열, m, n)
m번째 자리 값부터 n개를 뽑아 표시한다.
예) SUBSTR('KATE', 2, 2)
→ 'AT'

LENGTH(문자열) = LEN(문자열)
공백을 포함하여 문자열의 길이를 센다.
예) LEN('가 나다')
→ 4

TRIM(문자열, 제거 대상)
문자열에서 지정된 문자를 제거한다.
예) TRIM('aabbcc', 'a')
→ 'bbcc'

지정된 문자가 없는 경우에는 문자열 양쪽의 공백을 제거한다.
문자열 가운데에 있는 공백은 제거되지 않으므로 REPLACE 함수를 사용한다.
예) TRIM('     a a      ', )
→ 'a a'

LTRIM(문자열, 제거 대상)
문자열의 왼쪽에서 지정 문자를 제거한다. 지정 문자가 없으면 좌측 공백을 제거한다.
예) LTRIM('aabbccaa', 'a')
→ 'bbccaa'
예) LTRIM('    aabbcc', ) → 'aabbcc'

RTRIM(문자열, 제거 대상)
문자열의 오른쪽에서 지정 문자를 제거한다. 지정 문자가 없으면 우측 공백을 제거한다.
예) R
TRIM('aabbccaa', 'a') → 'aabbcc'
예) RTRIM('aabbcc   ', )
→ 'aabbcc'

* 필기본에는 SUBSTR 예와 TRIM, LTRIM, RTRIM 예시가 잘못 적혀 있으니 참고 바랍니다.

 
다음으로는 숫자형 함수를 알아볼 것이다. SQLD 시험에서 숫자형 함수를 이용한 주관식 문제나 계산 문제, 활용문제가 자주 출제되고 있어서 잘 알아두면 좋다. 함수의 의미만 제대로 알고 있으면 막상 풀어봤을 때 어렵게 느껴지진 않는다.

대표적인 숫자형 함수

ROUND(숫자, 소수점 자릿수)
숫자를 소수점 자릿수까지 반올림한다.

예) ROUND(25.3578, 2) → 25.36

TRUNC(숫자, 소수점 자릿수)
숫자를 소수점 자릿수까지 버림한다.
예) TRUNC(25.3578, 2) → 25.35

CEIL(숫자)
크거나 같은 최소 정수를 반환한다.

예) CEIL(33.5) → 34

FLOOR(숫자)
작거나 같은 최대 정수를 반환한다.
예) FLOOR(33.5) → 33


MOD(분자, 분모)
분자를 분모로 나눈 나머지를 반환한다.
예) MOD(3, 2) → 3/2 = 1과 나머지 1이므로 1을 반환


SIGN(숫자)
숫자가 양수면 1, 0이면 0, 음수면 -1을 반환한다.
예) SIGN(-30) → -1


ABS(숫자)
숫자의 절댓값을 반환한다.

예) ABS(-7) → 7

 
날짜형 함수는 아래 2가지가 대표적이다. python에서도 그렇고, 날짜형 데이터는 쉬워 보여도 다루기가 좀 까다로운 것 같다. 12진수/60진수를 써서 그런가...? 연산할 때 무심코 10진수로 생각하다간 실수하기 쉽다.

대표적인 날짜형 함수

SYSDATE
쿼리를 돌리는 현재 날짜와 시각을 출력한다.
예) SYSDATE → 2024.02.04 22:28:27

EXTRACT(정보 FROM 날짜)
날짜형 데이터에서 원하는 값을 추출한다.
예) EXTRACT(YEAR FROM DATE '2022-01-31') → '2022'
* YEAR 자리에는 YEAR, MONTH, DAY, HOUR, MINUATE, SECOND 모두 들어갈 수 있다.
예) EXTRACT(YEAR FROM SYSDATE) → '2024'

 
다음으로는 명시적 형변환과 암묵적 형변환 함수를 알아보자. 기본적으로 DB에서 시키지 않아도 알잘딱 형변환을 시켜준다면 암묵적 형변환이고, 형변환 함수를 써서 강제로 변환 시키는 것은 명시적 형변환이라 부른다.

 TO_NUMBER(문자열)
문자열을 숫자로 변환한다.
예) TO_NUMBER('2022') → 2022

TO_CHAR(숫자 or 날짜, 포맷)
숫자 또는 날짜를 조건에 맞게 문자로 변환한다.
예) TO_CHAR(date '2022-02-11', 'day') → '금요일'

TO_DATE(문자열, 포맷)
문자열을 포맷에 맞게 날짜로 변환한다.
예) TO_DATE('2022013120', 'YYYYMMDDHH24' → 2022/01/31 20:00:00

 
암시적 형변환의 예를 살펴보면, 고객번호 열의 데이터타입이 'NUMBER'로 설정되어 있을 때
SELECT *
FROM C_INFO
WHERE 고객번호 = '12345'
 
위와 같이 문자형 형태(숫자를 '' 속에 넣으면 문자형임)로 조회해도 숫자로 자동 변환됨
 

이렇게 비전공자를 위한 SQLD 강의 정리는 마무리. 그럼 이만.. 화르륵🔥