SQLD: SQL 기본(1)

SeongGyun Hong·2024년 10월 28일

SQL

목록 보기
3/51
post-thumbnail

1. SQL 문장의 종류와 명령어

SQL 명령어는 주로 다음 5가지 범주로 분류된다:

  1. DDL (Data Definition Language)

    • CREATE: 데이터베이스 객체 생성
    • ALTER: 기존 객체 구조 수정
    • DROP: 객체 삭제
    • TRUNCATE: 테이블 데이터 전체 삭제
    • RENAME: 객체 이름 변경
  2. DQL (Data Query Language)

    • SELECT: 데이터 조회
  3. DML (Data Manipulation Language)

    • INSERT: 데이터 삽입
    • UPDATE: 기존 데이터 수정
    • DELETE: 데이터 삭제
  4. DCL (Data Control Language)

    • GRANT: 사용자에게 권한 부여
    • REVOKE: 사용자 권한 철회
  5. TCL (Transaction Control Language)

    • COMMIT: 트랜잭션 변경사항 영구 저장
    • ROLLBACK: 트랜잭션 변경사항 취소
    • SAVEPOINT: 트랜잭션 내 저장점 생성

2. 8가지 관계형 대수와 일반 집합 연산자

  1. 선택 (Selection, σ)

    • 조건을 만족하는 튜플 선택
    • 예: σ(조건)(관계)
  2. 투영 (Projection, π)

    • 지정된 속성만 선택
    • 예: π [속성리스트].(관계)
  3. 합집합 (Union, ∪)

    • 두 관계의 모든 튜플 결합 (중복 제거)
    • 예: 관계1 ∪ 관계2
  4. 차집합 (Set difference, -)

    • 첫 번째 관계에서 두 번째 관계에 있는 튜플 제거
    • 예: 관계1 - 관계2
  5. 카티션 프로덕트 (Cartesian product, ×)

    • 두 관계의 모든 가능한 튜플 조합
    • 예: 관계1 × 관계2
  6. 교집합 (Intersection, ∩)

    • 두 관계에 모두 존재하는 튜플
    • 예: 관계1 ∩ 관계2
  7. 조인 (Join, ⋈)

    • 두 관계를 특정 조건에 따라 결합
    • 예: 관계1 ⋈ 관계2
  8. 나누기 (Division, ÷)

    • 한 관계의 모든 값과 연관된 다른 관계의 튜플 찾기
    • 예: 관계1 ÷ 관계2

3. Count 함수

Count

COUNT 함수는 SQL에서 행의 수를 세는 데 사용되는 집계 함수이다.

기본 구문:

SELECT COUNT(column_name) FROM table_name;

특징:

  • COUNT(*)는 NULL 값을 포함한 모든 행을 계산한다.
  • COUNT(column_name)은 지정된 열의 NULL이 아닌 값만 계산한다.

예시:

SELECT COUNT(*) FROM employees;
SELECT COUNT(employee_id) FROM employees;

DISTINCT

DISTINCT 키워드는 중복된 값을 제거하고 고유한 값만 반환하는 데 사용된다

기본 구문:

SELECT DISTINCT column_name FROM table_name;

COUNT와 DISTINCT 결합:

COUNT와 DISTINCT를 함께 사용하여 고유한 값의 수를 계산할 수 있다.

SELECT COUNT(DISTINCT column_name) FROM table_name;

특징:

  • 중복된 값을 제거한 후 고유한 값의 수만 반환
  • NULL 값은 하나의 고유한 값으로 취급

예시:

-- 고유한 부서의 수 계산
SELECT COUNT(DISTINCT department) FROM employees;

-- 고유한 직원 ID와 부서 조합의 수 계산
SELECT COUNT(DISTINCT employee_id, department) FROM employees;

NULL 값 처리:

  • COUNT(DISTINCT column_name)은 NULL 값을 제외합니다.
  • NULL 값을 포함하려면 COALESCE 함수를 사용할 수 있습니다:
SELECT COUNT(DISTINCT COALESCE(column_name, 'NULL')) FROM table_name;

COUNT DISTINCT는 데이터의 고유성을 분석하고 중복을 제거한 실제 값의 수를 파악하는 데 매우 유용한 도구이기에 자주 활용 된다.

4. [shema.].*

예를 들어, 다음과 같은 'employees' 테이블이 있다고 가정한다면

employee_idfirst_namelast_namesalary
1JohnDoe50000
2JaneSmith60000
3MikeJohnson55000

이 테이블에 대해 다음 쿼리를 실행하였을 때

SELECT employees.* FROM employees;

결과는 다음과 같다.

employee_idfirst_namelast_namesalary
1JohnDoe50000
2JaneSmith60000
3MikeJohnson55000

이는 다음 쿼리와 동일한 결과를 반환한다

SELECT employee_id, first_name, last_name, salary FROM employees;

5. || 사용법

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_namelast_name
JohnDoe
JaneSmith

다음 쿼리를 실행하였을 때에

SELECT first_name || ' ' || last_name AS full_name FROM employees;

결과는 이하와 같다.

full_name
John Doe
Jane Smith

이처럼 || 연산자는 Oracle, PostgreSQL, SQLite 등의 데이터베이스에서 널리 사용된다.

6. LENGTH, SUBSTR, LTRIM 사용법

LENGTH

LENGTH 함수는 문자열의 길이를 반환한다.

구문:

LENGTH(string)

예시:

SELECT LENGTH('Hello World') AS string_length;
-- 결과: 11

SELECT first_name, LENGTH(first_name) AS name_length
FROM employees;

SUBSTR

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 함수는 문자열의 왼쪽에서 지정된 문자들을 제거한다.

구문:

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;

이 쿼리는 각 직원의 이름에서 마지막 문자를 제거하고, 왼쪽의 공백을 제거해준다.

7. ADD_MONTHS

ADD_MONTHS 함수는 주어진 날짜에 지정된 개월 수를 더하거나 뺀 새로운 날짜를 반환해준다.
이 함수는 주로 Oracle 데이터베이스에서 사용되지만, 다른 데이터베이스 시스템에서도 유사한 기능을 제공한다.

구문:

ADD_MONTHS(date, number_of_months)
  • date: 기준이 되는 날짜
  • number_of_months: 더하거나 뺄 개월 수 (양수 또는 음수)

특징:

  1. 월의 마지막 날짜를 자동으로 처리하고
  2. 음수 값을 사용하여 과거 날짜를 계산할 수 있다.
  3. 날짜 형식에 영향을 받지 않는다.

예시:

  1. 기본 사용:

    SELECT ADD_MONTHS(DATE '2023-05-15', 3) AS future_date
    FROM dual;
    -- 결과: 2023-08-15
  2. 음수 개월 수 사용:

    SELECT ADD_MONTHS(DATE '2023-05-15', -2) AS past_date
    FROM dual;
    -- 결과: 2023-03-15
  3. 월말 날짜 처리:

    SELECT ADD_MONTHS(DATE '2023-01-31', 1) AS next_month_end
    FROM dual;
    -- 결과: 2023-02-28
  4. 직원의 근속 기간 계산:

    SELECT 
      employee_name,
      hire_date,
      ADD_MONTHS(hire_date, 12) AS one_year_anniversary
    FROM employees;
  5. 현재 날짜로부터 6개월 후 날짜 계산:

    SELECT 
      SYSDATE AS today,
      ADD_MONTHS(SYSDATE, 6) AS six_months_later
    FROM dual;

주의사항:

  1. 날짜가 월의 마지막 날인 경우, 결과도 해당 월의 마지막 날
  2. 일부 데이터베이스 시스템에서는 ADD_MONTHS 대신 DATEADD 또는 DATE_ADD 함수를 사용할 수 있음

TRUNC의 DATE에의 적용

  1. 기본 구문:

    TRUNC(date [, fmt])
    • date: 절삭할 날짜 값
    • fmt: 절삭 단위를 지정하는 옵션 매개변수
  2. 주요 특징:

    • 항상 DATE 타입을 반환 (입력이 TIMESTAMP여도 마찬가지).
    • 시간 부분을 제거하거나 특정 단위로 날짜를 절삭
    • Gregorian 달력 규칙을 따른다.
  3. 자주 사용되는 포맷 모델:

    • 'YEAR': 연도의 첫날로 절삭
    • 'MONTH' 또는 'MM': 월의 첫날로 절삭
    • 'DD': 일자의 자정(00:00:00)으로 절삭 (기본값)
    • 'HH' 또는 'HH24': 시간으로 절삭
    • 'MI': 분으로 절삭
  4. 예시:

    -- 현재 날짜를 일자의 시작(자정)으로 절삭
    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
  5. 활용:

    • 날짜 정규화
    • 시간 기반 계산
    • 데이터 그룹화
    • 날짜 비교 (시간 요소 제외)
    • 날짜 포맷팅

TRUNC 함수는 날짜와 시간 데이터를 다룰 때 매우 유용하며, 특히 날짜 범위 쿼리나 날짜 기반 집계에 자주 사용된다.

SQL에서 NULL 값과 연산자의 동작에 대해 설명하겠습니다:

8. 연산자와 NULL

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 값과의 산술 연산 결과는 항상 NULL이다.

SELECT 5 + NULL; -- 결과: NULL
SELECT 10 * NULL; -- 결과: NULL

논리 연산자와 NULL

  • AND: 하나라도 FALSE면 FALSE, 아니면 UNKNOWN
  • OR: 하나라도 TRUE면 TRUE, 아니면 UNKNOWN
  • NOT: UNKNOWN

예시:

SELECT TRUE AND NULL; -- 결과: UNKNOWN
SELECT FALSE AND NULL; -- 결과: FALSE
SELECT TRUE OR NULL; -- 결과: TRUE
SELECT FALSE OR NULL; -- 결과: UNKNOWN

NULL 처리 함수

NULL 값을 다루기 위한 특별한 함수들이 있다.

  1. COALESCE: 리스트에서 첫 번째 non-NULL 값을 반환

    SELECT COALESCE(NULL, 1, 2); -- 결과: 1
  2. ISNULL (SQL Server): NULL을 지정된 값으로 대체

    SELECT ISNULL(NULL, 'Default'); -- 결과: 'Default'
  3. NVL (Oracle): NULL을 지정된 값으로 대체

    SELECT NVL(NULL, 'Default') FROM dual; -- 결과: 'Default'

주의사항

  1. NULL 값 비교 시 항상 IS NULL 또는 IS NOT NULL을 사용할 것
  2. 집계 함수(SUM, AVG 등)는 일반적으로 NULL 값을 무시한다.
  3. GROUP BY 절에서 NULL 값은 하나의 그룹으로 취급된다.
profile
헤매는 만큼 자기 땅이다.

0개의 댓글