251015_SQLD_관계형 데이터베이스 / SELECT와 함수

2025. 10. 15. 18:43TIL

※ SQLD는 수많은 DBMS 중 Oracle을 기준으로 SQL Server 언어를 부가적으로 출제하기 때문에, SQLD 공부에 한해서는 Oracle을 공부해야 한다.(일전에 공부한 SQL 문법은 MySQL이어서, 혼란이 있지 않을까 걱정이 된다..)

※ 앞에서 TIL에 설명한 내용은 포함하지 않고(데이터의 중복 방지) 처음 보는 내용만 추가하려고 한다. TIL 데이터의 무결성을 높이기 위해서..!

 

1. 관계형 데이터베이스 (Relation Database)

1) 관계형 데이터베이스의 탄생 배경

관계형 데이터베이스가 등장하기 전에는 파일 시스템을 활용해 데이터를 관리했다.

(엑셀 파일을 여러 개 만들어서 각각 저장하는 시스템이라고 생각할 수 있다.)

그러나 동일한 내용이 여러 파일에 반복적으로 저장되고(데이터의 중복), 이에 따라 불필요한 저장 공간 사용과 비효율성이 증가하였다. 또한 프로그램에 따라 데이터의 형식이 바뀌기도 하고, 축적된 데이터를 원하는 방향으로 사용하기 어려워(ex. 엑셀을 PPT로 만들려면?) 한계점이 명확했다.

 

2) 관계형 데이터베이스

관계형 데이터베이스는 행과 열의 2차원 관계(=테이블)로 정의된 데이터의 생성, 수정, 삭제, 조회가 가능하고, 이러한 테이블들이 관계를 가질 수 있다. 이를 통해 파일 형식보다 더 체계적이고 효율적으로 데이터를 관리할 수 있다.

관계형 데이터베이스를 관리하는 시스템이 바로 관계형 데이터베이스 관리 시스템(Relation Database Management System ,RDBMS)이다.

 

3) SQL

SQL은 Structured Query Language의 약자로, 관계형 데이터베이스에 새로운 정보를 추가하거나, 수정/삭제하는 일을 수행하기 위해 고안된 언어이다.

여기서 Query는 질의(질문)이며, SQL을 통해 DB에 질문을 해서 내가 원하는 데이터를 조회/수정/삭제/생성할 수 있다.

SQL에서 사용되는 언어는 다음과 같이 분류할 수 있다.

데이터 정의 언어
(DDL, Data Definition Language)
관계형 데이터베이스의 구조를 정의하는 언어
즉 테이블을 만들거나 수정하는 언어
CREATE, ALTER, RENAME, DROP 등
데이터 조작 언어
(DML, Data Manipulation Language)
생성된 데이터 구조를 실제 데이터로 채우거나, 조회할 수 있는 언어
INSERT, SELECT, UPDATE, DELETE 등
데이터 제어 언어
(DCL, Data Control Language)
데이터베이스를 제어할 수 있는 권한을 관리하는 언어
GRANT, REVOKE 등
트랜잭션 제어 언어
(TCL, Transaction Control Language)
DML에 의해 조작된 결과를 트랜잭션 별로 제어하는 언어
COMMIT, ROLLBACK 등

 

2.  SELECT와 함수

1) SELECT

SELECT는 SQL을 할 때 FROM과 함께 가장 많이 사용되는 키워드이다.

--특정 컬럼을 불러오고 싶은 경우
SELECT name FROM person;
--모든 컬럼을 불러오고 싶은 경우
SELECT * FROM person;

기본적인 SELECT문의 실행 순서는 다음과 같다.

SELECT column
FROM table
WHERE condition
GROUP BY column
HAVING group condition
ORDER BY ordering condition;

FROM ➡️ WHERE ➡️ GROUP BY ➡️ HAVING ➡️ SELECT ➡️ ORDER BY

 

2) 단일행 함수 

DBMS에는 다양한 연산을 위해 내장 함수가 존재한다.

이때 하나의 행을 입력해 수행하는 단일행 함수와, 여러 행을 입력받아 수행되는 다중행 함수로 구분할 수 있다.

단일행 함수는 항상 1개의 RETURN값을 가지며, SELECT, WHERE, ORDER BY 절에 사용할 수 있다.

여러 개의 인수를 가질 수 있으며 함수의 인자로 함수를 사용할 수 있다. (ex. NVL(NULL, SQRT(salary)))

문자형 함수 문자 입력 ➡️ 문자 or 숫자 반환 LOWER, UPPER, ASCII, CHR, CONCAT, SUBSTR, LENGTH, LTRIM, RTRIM, TRIM, LPAD, RPAD
숫자형 함수 숫자 입력 ➡️ 숫자 반환 ABS, SIGN, MOD, CEIL, FLOOR, ROUND, TRUNC, POWER, SQRT, LOG, EXP, LN, SIN, COS, TAN
날짜형 함수 DATE 타입 값을 연산 EXTRACT, SYSDATE
변환형 함수 데이터 타입을 다른 데이터 타입으로 변환 TO_CHAR, TO_NUMBER, TO_DATE
NULL 관련 함수 NULL 값을 처리 NVL, NULLIF, COALESCE
분기 처리 함수 조건에 따른 분기 설정 DECODE

 

I. 문자형 함수

ASCII : 문자나 숫자를 ASCII 코드 번호로 바꿔준다.

SELECT ASCII('A') FROM DUAL;
-- 답 : 65
-- DUAL : Table 지정 없이 query의 값을 display할 수 있는 키워드

CHR(CHAR) : ASCII 코드 번호를 문자나 숫자로 바꿔준다.

--Oracle
SELECT CHR(65) FROM DUAL;
--SQL Server
SELECT CHAR(65) FROM DUAL;

LTRIM, RTRIM, TRIM : 문자열의 첫 번째 문자/마지막 문자부터확인해서 지정 문자가 나타나면 해당 문자를 문자열에서 제거한다. 지정 문자가 없는 경우 공백을 제거한다. SQL Server는 LTRIM, RTRIM, TRIM 함수의 지정문자를 정할 수 없다.

SELECT LTRIM('xxxYYZZxYZ', 'x') FROM DUAL; --> 'YYZZxYZ'
SELECT RTRIM('XXYYzzXYzz', 'z') FROM DUAL; --> 'XXYYzzXY'
-- 양쪽 제거
SELECT TRIM('x' FROM 'xxYYZZxYZxx') FROM DUAL; --> 'YYZZxYZ'
-- 왼쪽 제거 (LTRIM)
SELECT TRIM(leading'x' FROM 'xxYYZZxYZxx') FROM DUAL; --> YYZZxYZxx
-- 오른쪽 제거 (RTRIM)
SELECT TRIM(trailing 'x' FROM 'xxYYZZxYZxx') FROM DUAL;--> xxYYZZxYZ

LPAD, RPAD : 문자열을 n자리만큼 늘리고, 왼쪽/오른쪽 빈 공간을 지정 문자열로 채워서 리턴

SELECT LPAD('ABC', 4, 'X') FROM DUAL; --> ZABC
SELECT RPAD('ABC', 4, 'X') FROM DUAL; --> ABCZ

 

II. 숫자형 함수

MOD : 숫자1을 숫자2로 나누어 나머지 값을 계산하는 함수

SELECT MOD(22, 6) FROM DUAL; --> 4

CEIL/CEILING : 숫자보다 크거나 같은 최소 정수를 리턴

FLOOR : 숫자보다 작거나 같은 최대 정수를 리턴

SELECT CEIL(66.123) FROM DUAL; --> 67
SELECT FLOOR(66.123) FROM DUAL; --> 66

ROUND : 숫자를 소수점 n자리에서 반올림해 리턴

TRUNC : 숫자를 소수점 n자리에서 버린 값을 리턴

SELECT ROUND(66.123, 2) FROM DUAL; --> 66.12
SELECT TRUNC(66.123, 1) FROM DUAL; --> 66.1

SIN, COS, TAN : 숫자의 삼각함수 연산 결과를 리턴한다. 이때 숫자는 RADIAN 기준이다. (DEGREE가 아님)

EXP(X), POWER(X, Y), SQRT(X), LOG(X, Y), LN(X) : 각각 e의 X승 / X의 Y승 / X의 제곱근 / 밑이 X인 Y의 로그값 / X의 자연로그값 리턴

 

III. 날짜형 함수

YYYY : 년 / MM : 월 / DD : 일 / HH24 : 24시간 / HH12 : 12시간 / MI : 분 / SS : 초

DATE_FORMAT 함수 : 날짜 및 시간을 특정 형식으로 변환하여 표시하기 위해 사용되는 함수

DATE_FORMAT(date, format)
-- %Y : 4자리 연도
-- %y : 2자리 연도
-- %m : 2자리 월
-- %d : 2자리 일
-- %H : 2자리 시간(24시간)

SYSDATE : 현재 날짜와 시간을 출력

EXTRACT : 날짜 데이터에서 연(YEAR)/월(MONTH)/일(DATE)을 추출해 값을 리턴한다.

 

IV. 변환형 함수

TO_NUMBER : 문자열을 숫자로 변환

TO_CHAR : 숫자나 날짜를 문자열 형식으로 변환

TO_DATE : 문자열을 날짜 형식으로 변환

 

V. NULL 관련 함수

NULLIF : 특정 값을 NULL로 대체할 때 사용하며, 두 조건을 비교하고 조건값이 같다면 NULL을 리턴하고, 같지 않으면 첫 번째 조건값을 리턴한다.

NULLIF(salary, 5000) AS result FROM employees;
-- salary가 5000과 같다면 NULL로 대체, 5000이 아니면 salary 값 유지

COALESCE : 여러 값 중에서 NULL 이 아닌 첫 번째 값을 찾을 때 사용

SELECT A, B, COALESCE(A,B) FROM table_a;

특정 컬럼이나 열의 값이 NULL인 경우 다른 값으로 치환할 수 있다.