SQL 명령어는 주로 다음 5가지 범주로 분류된다:
DDL (Data Definition Language)
DQL (Data Query Language)
DML (Data Manipulation Language)
DCL (Data Control Language)
TCL (Transaction Control Language)
선택 (Selection, σ)
투영 (Projection, π)
합집합 (Union, ∪)
차집합 (Set difference, -)
카티션 프로덕트 (Cartesian product, ×)
교집합 (Intersection, ∩)
조인 (Join, ⋈)
나누기 (Division, ÷)
COUNT 함수는 SQL에서 행의 수를 세는 데 사용되는 집계 함수이다.
SELECT COUNT(column_name) FROM table_name;
SELECT COUNT(*) FROM employees;
SELECT COUNT(employee_id) FROM employees;
DISTINCT 키워드는 중복된 값을 제거하고 고유한 값만 반환하는 데 사용된다
SELECT DISTINCT column_name FROM table_name;
COUNT와 DISTINCT를 함께 사용하여 고유한 값의 수를 계산할 수 있다.
SELECT COUNT(DISTINCT column_name) FROM table_name;
-- 고유한 부서의 수 계산
SELECT COUNT(DISTINCT department) FROM employees;
-- 고유한 직원 ID와 부서 조합의 수 계산
SELECT COUNT(DISTINCT employee_id, department) FROM employees;
SELECT COUNT(DISTINCT COALESCE(column_name, 'NULL')) FROM table_name;
COUNT DISTINCT는 데이터의 고유성을 분석하고 중복을 제거한 실제 값의 수를 파악하는 데 매우 유용한 도구이기에 자주 활용 된다.
예를 들어, 다음과 같은 'employees' 테이블이 있다고 가정한다면
| employee_id | first_name | last_name | salary |
|---|---|---|---|
| 1 | John | Doe | 50000 |
| 2 | Jane | Smith | 60000 |
| 3 | Mike | Johnson | 55000 |
이 테이블에 대해 다음 쿼리를 실행하였을 때
SELECT employees.* FROM employees;
결과는 다음과 같다.
| employee_id | first_name | last_name | salary |
|---|---|---|---|
| 1 | John | Doe | 50000 |
| 2 | Jane | Smith | 60000 |
| 3 | Mike | Johnson | 55000 |
이는 다음 쿼리와 동일한 결과를 반환한다
SELECT employee_id, first_name, last_name, salary FROM employees;
SELECT 'SQL ' || 'Server' AS Result; 쿼리는 두 문자열 'SQL '과 'Server'를 연결(concatenate)하여 하나의 문자열로 만든다.
||는 문자열 연결 연산자이다.
이 쿼리의 결과는 다음과 같은데
| Result |
|---|
| SQL Server |
이 연산자를 사용하여 더 복잡한 문자열 연결도 가능하다.
예를 들어:
SELECT 'Welcome ' || 'to ' || 'SQL ' || 'Server' AS Greeting;
결과:
| Greeting |
|---|
| Welcome to SQL Server |
테이블의 데이터와 함께 사용할 수도 있다.
예를 들어, 'employees' 테이블이 있다고 가정한다면
| first_name | last_name |
|---|---|
| John | Doe |
| Jane | Smith |
다음 쿼리를 실행하였을 때에
SELECT first_name || ' ' || last_name AS full_name FROM employees;
결과는 이하와 같다.
| full_name |
|---|
| John Doe |
| Jane Smith |
이처럼 || 연산자는 Oracle, PostgreSQL, SQLite 등의 데이터베이스에서 널리 사용된다.
LENGTH 함수는 문자열의 길이를 반환한다.
LENGTH(string)
SELECT LENGTH('Hello World') AS string_length;
-- 결과: 11
SELECT first_name, LENGTH(first_name) AS name_length
FROM employees;
SUBSTR 함수는 문자열의 일부를 추출한다.
SUBSTR(string, start_position [, length])
string: 원본 문자열start_position: 추출을 시작할 위치 (1부터 시작)length: 추출할 문자 수 (옵션)SELECT SUBSTR('Hello World', 1, 5) AS substring;
-- 결과: 'Hello'
SELECT SUBSTR('Hello World', 7) AS substring;
-- 결과: 'World'
SELECT first_name, SUBSTR(first_name, 1, 3) AS name_start
FROM employees;
LTRIM 함수는 문자열의 왼쪽에서 지정된 문자들을 제거한다.
LTRIM(string [, trim_string])
string: 트림할 문자열trim_string: 제거할 문자들 (옵션, 기본값은 공백)SELECT LTRIM(' Hello World ') AS trimmed_string;
-- 결과: 'Hello World '
SELECT LTRIM('xxxHello World', 'x') AS trimmed_string;
-- 결과: 'Hello World'
SELECT first_name, LTRIM(first_name, 'A') AS trimmed_name
FROM employees;
이 함수들은 종종 함께 사용되어 더 복잡한 문자열 조작을 수행한다.
SELECT
first_name,
LTRIM(SUBSTR(first_name, 1, LENGTH(first_name) - 1)) AS modified_name
FROM employees;
이 쿼리는 각 직원의 이름에서 마지막 문자를 제거하고, 왼쪽의 공백을 제거해준다.
ADD_MONTHS 함수는 주어진 날짜에 지정된 개월 수를 더하거나 뺀 새로운 날짜를 반환해준다.
이 함수는 주로 Oracle 데이터베이스에서 사용되지만, 다른 데이터베이스 시스템에서도 유사한 기능을 제공한다.
ADD_MONTHS(date, number_of_months)
date: 기준이 되는 날짜number_of_months: 더하거나 뺄 개월 수 (양수 또는 음수)기본 사용:
SELECT ADD_MONTHS(DATE '2023-05-15', 3) AS future_date
FROM dual;
-- 결과: 2023-08-15
음수 개월 수 사용:
SELECT ADD_MONTHS(DATE '2023-05-15', -2) AS past_date
FROM dual;
-- 결과: 2023-03-15
월말 날짜 처리:
SELECT ADD_MONTHS(DATE '2023-01-31', 1) AS next_month_end
FROM dual;
-- 결과: 2023-02-28
직원의 근속 기간 계산:
SELECT
employee_name,
hire_date,
ADD_MONTHS(hire_date, 12) AS one_year_anniversary
FROM employees;
현재 날짜로부터 6개월 후 날짜 계산:
SELECT
SYSDATE AS today,
ADD_MONTHS(SYSDATE, 6) AS six_months_later
FROM dual;
기본 구문:
TRUNC(date [, fmt])
date: 절삭할 날짜 값fmt: 절삭 단위를 지정하는 옵션 매개변수주요 특징:
자주 사용되는 포맷 모델:
예시:
-- 현재 날짜를 일자의 시작(자정)으로 절삭
SELECT TRUNC(SYSDATE) FROM DUAL;
-- 특정 날짜를 연도의 시작으로 절삭
SELECT TRUNC(TO_DATE('15-MAR-2023', 'DD-MON-YYYY'), 'YEAR') FROM DUAL;
-- 결과: 01-JAN-2023
-- 특정 날짜와 시간을 시간 단위로 절삭
SELECT TO_CHAR(TRUNC(TO_DATE('15-MAR-2023 14:35:42', 'DD-MON-YYYY HH24:MI:SS'), 'HH'),
'DD-MON-YYYY HH24:MI:SS') FROM DUAL;
-- 결과: 15-MAR-2023 14:00:00
활용:
TRUNC 함수는 날짜와 시간 데이터를 다룰 때 매우 유용하며, 특히 날짜 범위 쿼리나 날짜 기반 집계에 자주 사용된다.
SQL에서 NULL 값과 연산자의 동작에 대해 설명하겠습니다:
NULL 값은 "알 수 없는 값" 또는 "적용할 수 없는 값"을 나타내며, 연산자와 함께 사용될 때 특별한 규칙이 적용된다.
=, <>, <, > 등의 비교 연산자는 NULL과 함께 사용될 때 항상 UNKNOWN을 반환한다.예시:
SELECT * FROM employees WHERE salary = NULL; -- 아무 결과도 반환하지 않음
대신 NULL 값을 비교할 때는 IS NULL 또는 IS NOT NULL을 사용해야 한다.
SELECT * FROM employees WHERE salary IS NULL;
NULL 값과의 산술 연산 결과는 항상 NULL이다.
SELECT 5 + NULL; -- 결과: NULL
SELECT 10 * NULL; -- 결과: NULL
예시:
SELECT TRUE AND NULL; -- 결과: UNKNOWN
SELECT FALSE AND NULL; -- 결과: FALSE
SELECT TRUE OR NULL; -- 결과: TRUE
SELECT FALSE OR NULL; -- 결과: UNKNOWN
NULL 값을 다루기 위한 특별한 함수들이 있다.
COALESCE: 리스트에서 첫 번째 non-NULL 값을 반환
SELECT COALESCE(NULL, 1, 2); -- 결과: 1
ISNULL (SQL Server): NULL을 지정된 값으로 대체
SELECT ISNULL(NULL, 'Default'); -- 결과: 'Default'
NVL (Oracle): NULL을 지정된 값으로 대체
SELECT NVL(NULL, 'Default') FROM dual; -- 결과: 'Default'
IS NULL 또는 IS NOT NULL을 사용할 것