[SQL] SQL 프로그래밍
목차 저장 프로시저(Stored procedures) IF-ELSE CASE WHILE ITERATE / LEAVE 저장 프로시저(Stored procedures) 저장 프로시저는 일련의 SQL 문을 데이터베이스 내에 재사용 가능한 단일 개체로 저장할 수 있는 MySQL을 비롯한 관계형 데이터베이스의 강력한 기능입니다. 저장 프로시저를 사용하면 복잡한 작업을 수행하고, 비즈니스 로직을 캡슐화하며, 성능을 개선하고, 데이터베이스 내에서 중앙 집중화하여 SQL 코드의 유지 관리를 간소화할 수 있습니다. 다음은 저장 프로시저의 주요 특징입니다. 매개변수 저장 프로시저는 입력 매개변수를 받아들이고 출력 매개변수를 반환할 수 있어 더욱 유연하고 다양하게 활용할 수 있습니다. 저장 프로시저를 호출할 때 값을 전달하..
2023.05.09
SQL
[SQL] SQL 피벗과 UNION/IN 연산자
목차 피벗 JSON(JavaScript Object Notation) UNION / UNION ALL / NOT IN / IN 피벗 SQL 피벗은 행을 열로 변환하여 데이터를 효과적으로 바꾸거나 '피벗'하는 데 사용되는 기술입니다. 보고 또는 분석과 같이 데이터를 보다 구조화되거나 요약된 형식으로 표시해야 할 때 유용합니다. MySQL에는 기본 제공 PIVOT 키워드가 없지만 집계 함수(예: SUM 또는 COUNT)와 CASE 문 또는 IF 함수의 조합을 사용하여 피벗 작업을 수행할 수 있습니다. 다음은 SQL 피벗을 사용하여 개념을 설명하는 예입니다. 다음과 같은 열이 있는 판매 테이블이 있다고 가정해 보겠습니다: 'product', 'region', 'sales_amount' 열이 있다고 가정해 보겠..
2023.05.09
SQL
[SQL] MySQL 변수와 내장 함수
목차 SQL 변수 사용법 데이터 유형과 변환 문자열 내장 함수 숫자열 내장 함수 날짜/시간 내장 함수 SQL 변수 사용법 MySQL에는 사용자 정의 변수와 시스템 변수의 두 가지 유형의 변수가 있습니다. 사용자 정의 변수는 단일 MySQL 세션 내에서 생성, 설정 및 사용할 수 있는 세션별 변수입니다. 시스템 변수는 MySQL의 동작을 제어하는 전역 또는 세션 수준 변수입니다. 1. 사용자 정의 변수 사용자 정의 변수를 만들거나 업데이트하려면 다음 구문(Syntax)을 사용합니다. SET @변수_이름 = 값; 예를 들어 다음과 같이 작성할 수 있습니다. SET @my_variable = 42; 쿼리에서 사용자 정의 변수를 사용하려면 변수 이름 뒤에 '@' 기호를 사용하여 참조하세요. SELECT * FR..
2023.05.09
SQL
[SQL] MySQL 데이터 유형과 종류
목차 숫자 데이터 유형 텍스트/문자열 데이터 유형 날짜/시간 데이터 유형 geometry, json 데이터 유형 숫자 데이터 유형 MySQL은 데이터베이스에 다양한 종류의 숫자 값을 저장하기 위해 여러 가지 숫자 데이터 유형을 제공합니다. 이러한 데이터 유형은 정수, 부동 소수점, 고정 소수점의 세 가지 범주로 그룹화할 수 있습니다. 정수(Integer) 데이터 유형 MySQL은 저장 크기와 값 범위가 각각 다른 네 가지 정수 데이터 유형을 지원합니다. TINYINT: -128~127(부호) 또는 0~255(부호 없음) 사이의 값을 저장할 수 있는 매우 작은 정수입니다. 1바이트의 저장 공간을 차지합니다. SMALLINT: -32,768~32,767(부호) 또는 0~65,535(부호 없음) 사이의 값을 ..
2023.05.08
SQL
[MySQL] RANK 함수
RANK 관련 함수 SQL 창 함수는 현재 행과 관련된 일련의 행에서 계산을 수행하는 함수 클래스입니다. OVER() 절과 함께 사용되며 결과 집합의 특정 행 창을 기반으로 계산을 수행할 수 있습니다. 창 함수는 행을 집계 함수처럼 그룹화하지 않습니다. 대신 결과 집합 내 행의 "창"에서 작동합니다. 다음은 몇 가지 일반적인 창 함수와 예제입니다. 1. ROW_NUMBER(): 결과 집합 내의 각 행에 고유 번호를 할당합니다. SELECT id, product, sale_date, amount, ROW_NUMBER() OVER (ORDER BY sale_date) AS row_num FROM sales; 2. RANK(): 동일한 값을 가진 행에 대해 동일한 순위를 사용하여 결과 집합 내의 각 개별 행에..
2023.04.24
SQL
no image
[SQL] SQL MATH 함수
목차 기본 숫자 함수 삼각 함수 기본 숫자 함수 MySQL은 계산을 수행하고 숫자 데이터를 조작하는 데 사용할 수 있는 다양한 수학 함수를 제공합니다. 다음은 몇 가지 일반적인 MySQL 수학 함수에 대한 개요입니다. 1. ABS(x): x의 절대값을 반환합니다. SELECT ABS(-5);는 5를 반환합니다. 2. CEIL(x) 또는 CEILING(x): x보다 크거나 같은 가장 작은 정수 값을 반환합니다. SELECT CEIL(3.7);은 4를 반환합니다. 3. FLOOR(x): x보다 작거나 같은 가장 큰 정수 값을 반환합니다. SELECT FLOOR(3.7);은 3을 반환합니다. 4. ROUND(x, d): x 값을 소수점 d 자리까지 반올림합니다. d를 지정하지 않으면 기본값은 0입니다. SEL..
2023.04.24
SQL

[SQL] SQL 프로그래밍

이지IT
|2023. 5. 9. 12:30
반응형

목차

  1. 저장 프로시저(Stored procedures)
  2. IF-ELSE
  3. CASE
  4. WHILE
  5. ITERATE / LEAVE

저장 프로시저(Stored procedures)

저장 프로시저는 일련의 SQL 문을 데이터베이스 내에 재사용 가능한 단일 개체로 저장할 수 있는 MySQL을 비롯한 관계형 데이터베이스의 강력한 기능입니다. 저장 프로시저를 사용하면 복잡한 작업을 수행하고, 비즈니스 로직을 캡슐화하며, 성능을 개선하고, 데이터베이스 내에서 중앙 집중화하여 SQL 코드의 유지 관리를 간소화할 수 있습니다.

다음은 저장 프로시저의 주요 특징입니다.

  1. 매개변수
    저장 프로시저는 입력 매개변수를 받아들이고 출력 매개변수를 반환할 수 있어 더욱 유연하고 다양하게 활용할 수 있습니다. 저장 프로시저를 호출할 때 값을 전달하고 실행된 후에 결과를 검색할 수 있습니다.

  2. 제어 구조
    저장 프로시저는 조건문(IF, CASE), 루프(WHILE, REPEAT), 예외 처리(DECLARE, SIGNAL) 등 다양한 프로그래밍 구성을 지원합니다. 이를 통해 저장 프로시저 내에서 보다 정교한 로직을 만들 수 있습니다.

  3. 보안
    저장 프로시저 내에서 SQL 코드를 캡슐화하면 기본 테이블에 대한 직접 액세스를 제한하고 사용자가 수행할 수 있는 작업을 제어할 수 있습니다. 이는 데이터 무결성과 보안을 강화하는 데 도움이 됩니다.

  4. 성능
    저장 프로시저는 생성 시 데이터베이스 엔진에 의해 컴파일되고 최적화되므로 성능을 향상시킬 수 있습니다. 즉, 저장 프로시저에 대한 후속 호출이 동등한 임시 SQL 쿼리보다 빠르게 실행될 수 있습니다.


다음은 MySQL에서 저장 프로시저를 생성하고 호출하는 기본 예제입니다. 저장 프로시저를 만드는 방법은 다음과 같습니다.

DELIMITER //
CREATE PROCEDURE GetEmployeeCountByDepartment(IN department_id INT, OUT count INT)
BEGIN
  SELECT COUNT(*)
  INTO count
  FROM employees
  WHERE department_id = department_id;
END //
DELIMITER ;


이 예에서는 입력 매개변수 department_id를 받고 해당 부서의 직원 수를 출력 매개변수 count로 반환하는 GetEmployeeCountByDepartment라는 저장 프로시저를 만듭니다.


저장 프로시저를 호출하는 방법입니다.

CALL GetEmployeeCountByDepartment(1, @employee_count);
SELECT @employee_count;


여기서는 부서_id가 1인 저장 프로시저를 호출하고 결과를 사용자 정의 변수 @employee_count에 저장합니다. 마지막으로 @employee_count의 값을 SELECT하여 결과를 검색합니다.

저장 프로시저는 강력하고 유연한 SQL 코드 관리 방법을 제공함으로써 데이터베이스 애플리케이션의 기능과 유지보수성을 크게 향상시킬 수 있습니다.


IF-ELSE

저장 프로시저에서 IF-ELSE를 사용하면 데이터베이스 작업에 조건부 논리를 추가할 수 있습니다. 이는 데이터 조작 및 유효성 검사를 관리하는 데 유용하며, 저장 프로시저를 보다 유연하고 동적으로 만들 수 있습니다. 다음은 MySQL의 저장 프로시저 내에서 IF-ELSE를 사용하는 예제입니다:

다음과 같은 열이 있는 'employees'라는 테이블이 있다고 가정해 보겠습니다: 'id', 'name', 'salary', 'department_id'. 직원의 급여를 업데이트하는 저장 프로시저를 만들되, 해당 급여가 부서의 지정된 범위 내에 속하는 경우에만 업데이트합니다.

IF-ELSE를 사용하여 저장 프로시저를 만들 수 있습니다.

DELIMITER //
CREATE PROCEDURE UpdateEmployeeSalary(IN employee_id INT, IN new_salary DECIMAL(10,2))
BEGIN
  DECLARE department_range_min DECIMAL(10,2);
  DECLARE department_range_max DECIMAL(10,2);

  SELECT range_min, range_max
  INTO department_range_min, department_range_max
  FROM department_ranges
  WHERE department_id = (SELECT department_id FROM employees WHERE id = employee_id);

  IF new_salary >= department_range_min AND new_salary <= department_range_max THEN
    직원 업데이트
    SET salary = new_salary
    WHERE id = employee_id;
  ELSE
    SIGNAL SQLSTATE '45000'
    SET MESSAGE_TEXT = '새 급여가 부서의 허용 범위에 속하지 않습니다.';
  END IF;
END //
DELIMITER ;


이 예제에서 저장 프로시저 UpdateEmployeeSalary는 employee_id와 new_salary라는 두 개의 입력 매개 변수를 사용합니다. 먼저 부서_범위 테이블에서 직원의 부서에 대한 최소 및 최대 급여 범위를 검색합니다. 그런 다음 IF-ELSE 문을 사용하여 새 급여가 부서에 허용된 범위 내에 있는지 확인합니다. 조건이 참이면 직원의 급여가 업데이트되고, 그렇지 않으면 사용자 지정 메시지와 함께 오류가 발생합니다.

저장 프로시저를 호출할 수 있습니다.

CALL UpdateEmployeeSalary(1, 50000);


이 예에서는 employee_id가 1이고 new_salary가 50,000인 저장 프로시저를 호출합니다. 직원의 부서 급여 범위에 따라 급여가 업데이트되거나 오류가 발생합니다.

저장 프로시저 내에서 IF-ELSE를 사용하면 조건부 논리를 데이터베이스 작업에 통합할 수 있으므로 보다 다양하고 복잡한 작업을 처리할 수 있습니다.


CASE

SQL의 CASE 표현식은 쿼리 내에서 조건부 논리를 수행하는 데 사용됩니다. 조건 분기를 수행하고 하나 이상의 조건 결과에 따라 다른 값을 반환할 수 있습니다. CASE 표현식에는 단순 CASE와 검색된 CASE의 두 가지 형태가 있습니다.

1. 단순(Simple) CASE
단순 CASE 표현식은 입력 표현식을 값 집합과 비교하여 가장 먼저 일치하는 값에 해당하는 결과를 반환합니다. 일치하는 값이 하나도 없으면 ELSE 절에 결과를 반환합니다(또는 ELSE 절이 제공되지 않은 경우 NULL).

CASE input_expression
  WHEN value1 THEN result1
  WHEN value2 THEN result2
  ...
  ELSE default_result
END


예제:

SELECT name, salary,
  CASE department_id
    WHEN 1 THEN 'Sales'
    WHEN 2 THEN 'IT'
    WHEN 3 THEN 'Marketing'
    ELSE 'Unknown'
  END AS department_name
FROM employees;


이 예에서는 간단한 CASE 표현식을 사용하여 department_id에서 department_name 열을 파생합니다.

2. 검색된(Searched) CASE:
검색된 CASE 표현식은 일련의 부울 조건을 평가하여 첫 번째 조건이 참인 경우 해당 결과를 반환합니다. 조건 중 어느 것도 참이 아닌 경우 ELSE 절에 결과를 반환합니다(또는 ELSE 절이 제공되지 않은 경우 NULL).

CASE
  WHEN condition1 THEN result1
  WHEN condition2 THEN result2
  ...
  ELSE default_result
END


예제:

SELECT name, salary,
  CASE
    WHEN salary < 30000 THEN 'Low'
    WHEN salary >= 30000 AND salary < 60000 THEN 'Medium'
    WHEN salary >= 60000 THEN 'High'
    ELSE 'Unknown'
  END AS salary_level
FROM employees;


이 예에서는 검색된 CASE 표현식을 사용하여 급여에서 salary_level 열을 파생합니다.

CASE 표현식을 사용하면 SQL 쿼리 내에서 직접 조건부 논리를 수행할 수 있으므로 특정 조건에 따라 데이터를 조작하고 변환할 수 있는 강력한 방법을 제공합니다.


WHILE

SQL에서 WHILE 루프는 지정된 조건이 참으로 유지되는 한 코드 블록을 반복적으로 실행할 수 있는 제어 흐름 문입니다. 이 구조는 반복적인 작업을 수행하거나 다양한 값을 반복해야 할 때 저장 프로시저 및 함수 내에서 특히 유용합니다.

모든 SQL 데이터베이스에서 WHILE 루프가 지원되는 것은 아닙니다. 예를 들어 MySQL은 저장 프로시저 및 함수에서 WHILE 루프를 지원하지만 독립형 SQL 쿼리에서는 지원하지 않습니다. 다음은 MySQL 저장 프로시저 내에서 WHILE 루프를 사용하는 예입니다.

'id', 'name', 'salary', 'department_id' 열이 있는 'employees'라는 테이블이 있고 모든 직원의 급여를 지정된 비율만큼 증가시키는 저장 프로시저를 만들고 싶다고 가정하겠습니다.

WHILE 루프를 사용하여 저장 프로시저를 만듭니다.

 

DELIMITER //
CREATE PROCEDURE IncreaseSalaries(IN percentage DECIMAL(5,2))
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE emp_id INT;
  DECLARE emp_salary DECIMAL(10,2);
  DECLARE cur CURSOR FOR SELECT id, salary FROM employees;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

  OPEN cur;

  read_loop: WHILE NOT done DO
    FETCH cur INTO emp_id, emp_salary;
    IF NOT done THEN
      UPDATE employees
      SET salary = emp_salary * (1 + (percentage / 100))
      WHERE id = emp_id;
    END IF;
  END WHILE read_loop;

  CLOSE cur;
END //
DELIMITER ;


이 예제에서는 단일 입력 매개변수 백분율을 사용하는 IncreaseSalaries라는 저장 프로시저를 만듭니다. 커서를 사용하여 'employees' 테이블의 각 행을 반복하고 WHILE 루프를 사용하여 급여 인상을 수행합니다. 커서가 테이블의 끝에 도달할 때까지 루프가 계속되며, 이 시점에서 'done' 변수가 1로 설정되고 루프가 종료됩니다.

저장 프로시저를 호출할 수 있습니다.

CALL IncreaseSalaries(5);


이 예에서는 백분율 값이 5인 저장 프로시저를 호출하여 각 직원의 급여를 5%씩 증가시킵니다.

WHILE 루프는 SQL의 저장 프로시저 및 함수 내에서 반복적인 작업과 반복 처리를 수행할 수 있는 강력한 구조입니다.


ITERATE / LEAVE

MySQL에서 ITERATE 및 LEAVE 문은 저장 프로시저 및 함수 내에서 루프의 흐름을 제어하는 데 사용됩니다. 두 문은 모두 WHILE, REPEAT, LOOP와 같은 루프 구문과 함께 사용됩니다.

1. ITERATE
ITERATE 문은 루프를 처음부터 다시 시작하여 현재 반복에 대한 루프 본문 내의 나머지 코드를 건너뛰는 데 사용됩니다. 루프는 고유 식별자로 레이블을 지정해야 하며, ITERATE 문은 해당 식별자를 참조하여 어떤 루프를 다시 시작해야 하는지 나타냅니다.

ITERATE 레이블_이름;


2. LEAVE
LEAVE 문은 루프를 즉시 종료하여 루프 실행을 종료하고 루프 다음 코드를 계속 실행하는 데 사용됩니다. ITERATE 문과 마찬가지로 루프에는 고유 식별자로 레이블을 지정해야 하며, LEAVE 문은 해당 식별자를 참조하여 어떤 루프를 종료해야 하는지 나타냅니다.

LEAVE 레이블_이름;


다음은 MySQL 저장 프로시저 내에서 ITERATE 및 LEAVE를 함께 사용하는 예제입니다:

DELIMITER //
CREATE PROCEDURE IterateAndLeaveExample()
BEGIN
  DECLARE i INT DEFAULT 1;

  MAIN_LOOP: LOOP
    IF i > 10 THEN
      LEAVE main_loop;
    END IF;

    IF i MOD 2 = 0 THEN
      SET i = i + 1;
      ITERATE main_loop;
    END IF;

    -- 홀수 'i'로 무언가를 수행한다.
    SELECT i;

    SET i = i + 1;
  END LOOP main_loop;
END //
DELIMITER ;


이 예제에서는 main_loop로 레이블이 지정된 LOOP가 있습니다. 이 루프는 1부터 10까지의 숫자를 반복합니다. i가 10보다 크면 LEAVE 문이 루프를 종료하는 데 사용됩니다. i가 짝수인 경우 ITERATE 문은 루프를 처음부터 다시 시작하여 루프 본문의 나머지 코드를 효과적으로 건너뛰고 다음 반복으로 이동합니다. i가 홀수이면 SELECT 문이 실행됩니다.

ITERATE 및 LEAVE 문은 저장 프로시저 및 함수에서 루프 실행에 대한 추가 제어 기능을 제공하므로 MySQL에서 보다 복잡하고 유연한 루프 구조를 만들 수 있습니다.


반응형

'SQL' 카테고리의 다른 글

[SQL] SQL 피벗과 UNION/IN 연산자  (0) 2023.05.09
[SQL] MySQL 변수와 내장 함수  (2) 2023.05.09
[SQL] MySQL 데이터 유형과 종류  (0) 2023.05.08
[MySQL] RANK 함수  (0) 2023.04.24
[SQL] SQL MATH 함수  (0) 2023.04.24
반응형

목차

  1. 피벗
  2. JSON(JavaScript Object Notation)
  3. UNION / UNION ALL / NOT IN / IN

피벗

SQL 피벗은 행을 열로 변환하여 데이터를 효과적으로 바꾸거나 '피벗'하는 데 사용되는 기술입니다. 보고 또는 분석과 같이 데이터를 보다 구조화되거나 요약된 형식으로 표시해야 할 때 유용합니다. MySQL에는 기본 제공 PIVOT 키워드가 없지만 집계 함수(예: SUM 또는 COUNT)와 CASE 문 또는 IF 함수의 조합을 사용하여 피벗 작업을 수행할 수 있습니다.

다음은 SQL 피벗을 사용하여 개념을 설명하는 예입니다. 다음과 같은 열이 있는 판매 테이블이 있다고 가정해 보겠습니다: 'product', 'region', 'sales_amount' 열이 있다고 가정해 보겠습니다. 지역을 열로 사용하여 지역별 제품당 총 매출을 표 형식으로 표시하려고 합니다.

1. 판매 테이블 데이터 샘플

제픔 지역 판매_금액
A 서울 100
A 인천 200
B 서울 150
B 인천 250

2. 원하는 출력 형식

제품 서울 인천
A 100 200
B 150 250

 

MySQL에서 SQL 피벗을 사용하여 이 작업을 수행하려면 다음 쿼리를 사용할 수 있습니다:

SELECT
    product,
    SUM(CASE WHEN region = '서울' THEN sales_amount ELSE 0 END) AS 서울,
    SUM(CASE WHEN region = '인천' THEN sales_amount ELSE 0 END) AS 인천
FROM
    판매_금액
GROUP BY
    제품;


이 쿼리에서는 SUM() 함수 내에서 CASE 문을 사용하여 'region' 열의 값을 확인합니다. 지역이 원하는 열 이름(예: '서울' 또는 '인천')과 일치하면 '판매_금액'을 합계에 포함시키고, 그렇지 않으면 0을 사용합니다. 

결과적으로 각 제품의 총 매출이 지역별로 세분화되고 지역이 열로 표시됩니다.

이 예에서는 'region' 열의 고유 값을 알고 있다고 가정합니다. 피벗을 위한 동적 값 집합이 있는 경우 동적 SQL 쿼리를 사용하여 피벗 테이블을 작성해야 할 수 있습니다.


JSON(JavaScript Object Notation)

JSON(JavaScript Object Notation)은 사람이 쉽게 읽고 쓸 수 있고 기계가 쉽게 구문 분석하고 생성할 수 있는 경량 데이터 교환 형식입니다. JSON은 웹 애플리케이션에서 클라이언트와 서버 간에 데이터를 전송하거나 데이터베이스 또는 구성 파일에 구조화된 데이터를 저장하는 데 자주 사용됩니다.

JSON 데이터는 키-값 쌍으로 구성되며, 키는 문자열이고 값은 문자열, 숫자, 부울(참 또는 거짓), 널, 배열 또는 기타 JSON 객체일 수 있습니다. JSON 객체는 중괄호 {}를 사용하여 표시하고 배열은 대괄호 []를 사용하여 표시합니다. 다음은 JSON 객체의 예입니다.

{
  "name": "Alice",
  "age": 30,
  "isStudent": false,
  "courses": [
    {
      "name": "수학",
      "grade": "A"
    },
    {
      "name": "History",
      "grade": "B"
    }
  ]
}


MySQL과 같은 데이터베이스의 경우 JSON 데이터 유형을 가진 열에 JSON 데이터를 저장할 수 있습니다. 이를 통해 복잡하고 구조화된 데이터를 단일 열에 저장하고 MySQL에서 제공하는 기본 제공 JSON 함수를 사용하여 쿼리하거나 조작할 수 있습니다.

1. json_extract(): JSON 경로를 사용하여 JSON 객체 또는 배열에서 값을 추출합니다.

구문: JSON_EXTRACT(json_data, json_path)


2. JSON_INSERT(): JSON 객체 또는 배열에 새 값을 삽입합니다.

구문: JSON_INSERT(json_data, json_path, value)


3. json_replace(): JSON 객체 또는 배열의 기존 값을 바꿉니다.

구문: JSON_REPLACE(json_data, json_path, value)


4. JSON_REMOVE(): JSON 객체 또는 배열에서 값을 제거합니다.

구문: JSON_REMOVE(json_data, json_path)


5. JSON_OBJECT(): 키-값 쌍의 목록에서 JSON 객체를 생성합니다.

구문: JSON_OBJECT(key1, value1, key2, value2, ...)


6. JSON_ARRAY(): 값 목록에서 JSON 배열을 생성합니다.

구문: JSON_ARRAY(value1, value2, ...)

UNION / UNION ALL / NOT IN / IN

1. UNION

UNION 연산자는 두 개 이상의 SELECT 쿼리의 결과 집합을 단일 결과 집합으로 결합하는 데 사용됩니다. 이 연산자는 결합된 결과 집합에서 중복 행을 제거합니다. UNION 연산이 작동하려면 각 SELECT 쿼리에 있는 열의 수와 데이터 유형이 동일해야 합니다.

SELECT ...
FROM table1
UNION
SELECT ...
FROM table2;


2. UNION ALL
UNION ALL 연산자는 UNION과 유사하지만 결합된 결과 집합에서 중복 행을 제거하지 않습니다. UNION ALL은 중복을 제거하기 위한 추가 처리가 필요하지 않으므로 UNION보다 빠릅니다.

SELECT ...
FROM table1
UNION ALL
SELECT ...
FROM table2;


3. IN
IN 연산자는 열의 값이 값 목록 또는 하위 쿼리의 결과 집합에 있는지 여부에 따라 행을 필터링하는 데 사용됩니다. 값이 목록 또는 결과 집합에 있으면 TRUE를 반환하고, 그렇지 않으면 FALSE를 반환합니다.

구문(값 목록 포함):

SELECT ...
FROM table1
WHERE column1 IN (value1, value2, value3);


구문(하위 쿼리 포함):

SELECT ...
FROM table1
WHERE column1 IN (SELECT column2 FROM table2);


4. NOT IN
NOT IN 연산자는 IN 연산자와 반대입니다. 이 연산자는 열의 값이 값 목록이나 하위 쿼리의 결과 집합에 없는지 여부에 따라 행을 필터링합니다. 값이 목록이나 결과 집합에 없으면 TRUE를 반환하고, 그렇지 않으면 FALSE를 반환합니다.

구문(값 목록 포함):

SELECT ...
FROM table1
WHERE column1 NOT IN (value1, value2, value3);


구문(하위 쿼리 포함):

SELECT ...
FROM table1
WHERE column1 NOT IN (SELECT column2 FROM table2);


이러한 연산자를 사용하면 여러 테이블 또는 결과 집합의 데이터를 결합, 필터링 및 조작할 수 있으므로 SQL 쿼리에서 검색되는 데이터를 더 잘 제어할 수 있습니다.


반응형

'SQL' 카테고리의 다른 글

[SQL] SQL 프로그래밍  (0) 2023.05.09
[SQL] MySQL 변수와 내장 함수  (2) 2023.05.09
[SQL] MySQL 데이터 유형과 종류  (0) 2023.05.08
[MySQL] RANK 함수  (0) 2023.04.24
[SQL] SQL MATH 함수  (0) 2023.04.24
반응형

목차

  1. SQL 변수 사용법
  2. 데이터 유형과 변환
  3. 문자열 내장 함수
  4. 숫자열 내장 함수
  5. 날짜/시간 내장 함수

SQL 변수 사용법

MySQL에는 사용자 정의 변수와 시스템 변수의 두 가지 유형의 변수가 있습니다. 사용자 정의 변수는 단일 MySQL 세션 내에서 생성, 설정 및 사용할 수 있는 세션별 변수입니다. 시스템 변수는 MySQL의 동작을 제어하는 전역 또는 세션 수준 변수입니다.

1. 사용자 정의 변수
사용자 정의 변수를 만들거나 업데이트하려면 다음 구문(Syntax)을 사용합니다.

SET @변수_이름 = 값;


예를 들어 다음과 같이 작성할 수 있습니다.

SET @my_variable = 42;


쿼리에서 사용자 정의 변수를 사용하려면 변수 이름 뒤에 '@' 기호를 사용하여 참조하세요.

SELECT * FROM employees WHERE employee_id = @my_variable;


사용자 정의 변수는 강력한 유형이 아니므로 데이터 유형은 변수에 할당된 값에 따라 결정된다는 점을 유의해야 합니다.

2. 시스템 변수
전역 또는 세션 시스템 변수의 값을 보려면 다음 구문(Syntax)을 사용합니다.

SHOW GLOBAL VARIABLES LIKE 'variable_name';
SHOW SESSION VARIABLES LIKE 'variable_name';


예를 들어, 'max_connections' 변수의 전역 값을 보려면 다음을 사용합니다.

SHOW GLOBAL VARIABLES LIKE 'max_connections';


전역 또는 세션 시스템 변수의 값을 설정하려면 다음 구문(Syntax)을 사용합니다.

SET GLOBAL variable_name = value;
SET SESSION variable_name = value;


예를 들어, 'max_connections' 변수의 전역 값을 설정하려면 다음을 사용합니다:

SET GLOBAL max_connections = 1000;


일부 시스템 변수는 'SUPER' 권한과 같은 적절한 권한을 가진 사용자만 설정할 수 있습니다.

쿼리 또는 문에서 시스템 변수를 사용할 때는 변수 이름 뒤에 '@@' 기호를 사용하여 참조할 수 있습니다:

SELECT * FROM employees LIMIT @@max_connections;


결론적으로 MySQL 변수를 사용하면 단일 세션 내에서 값을 저장 및 조작하거나 전역 또는 세션별 시스템 변수를 설정하여 MySQL의 동작을 제어할 수 있습니다.


데이터 유형과 변환

MySQL에서는 CAST(), CONVERT(), 암시적 유형 변환 등 다양한 함수와 기법을 사용하여 데이터 유형과 값을 변환할 수 있습니다.

1. CAST()
CAST() 함수는 한 데이터 유형에서 다른 데이터 유형으로 값을 변환하는 데 사용됩니다. CAST()의 구문(Syntax)은 다음과 같습니다:

CAST(value AS data_type)


예를 들어 VARCHAR 값을 INTEGER로 변환하려면 다음을 사용할 수 있습니다.

SELECT CAST('42' AS 부호 없는 정수);


2. CONVERT()
CONVERT() 함수는 CAST()와 유사하지만 문자 집합 변환 측면에서 더 많은 유연성을 제공합니다. CONVERT()의 구문(Syntax)은 다음과 같습니다.

CONVERT(value, data_type)


또는

CONVERT(value USING character_set)


예를 들어 VARCHAR 값을 DECIMAL로 변환하려면 다음과 같이 사용할 수 있습니다.

SELECT CONVERT('42.5', DECIMAL(10,2));


텍스트 값을 한 문자 집합에서 다른 문자 집합으로 변환하려면 다음을 사용합니다:

SELECT CONVERT('안녕하세요' USING utf8);

 

3. 암시적 유형 변환
MySQL은 표현식, 할당 또는 함수 인수에 사용될 때 한 데이터 유형에서 다른 데이터 유형으로 값을 자동으로 변환할 수 있습니다. 이를 암시적 유형 변환이라고 합니다. 예를 들어 숫자 컨텍스트에서 문자열 값을 사용하는 경우 MySQL은 문자열 값을 숫자 데이터 유형으로 변환하려고 시도합니다.

SELECT '42' + 0;        -- 문자열 '42'가 정수 값으로 변환됩니다.


암시적 유형 변환은 값을 대상 데이터 유형으로 변환할 수 없는 경우 예기치 않은 결과나 오류가 발생할 수 있다는 점에 유의해야합니다.


문자열 내장 함수

MySQL은 문자열 데이터를 조작하고 작업할 수 있는 다양한 내장 문자열 함수를 제공합니다. 다음은 일반적으로 사용되는 몇 가지 문자열 함수에 대한 개요입니다:

1. CONCAT(): 두 개 이상의 문자열을 연결합니다. 결과는 제공된 순서대로 모든 인수가 포함된 단일 문자열입니다.

구문(Syntax): CONCAT(str1, str2, ...)


2. LENGTH(): 문자열의 길이를 바이트 단위로 반환합니다.

구문(Syntax): LENGTH(str)


3. CHAR_LENGTH(): 문자열의 길이를 문자로 반환합니다. 이 함수는 멀티바이트 문자 집합에 유용합니다.

구문(Syntax): CHAR_LENGTH(str)


4. SUBSTRING(): 지정된 위치에서 시작하여 선택적 길이로 문자열에서 부분 문자열을 추출합니다.

구문(Syntax): SUBSTRING(str, start_position, [length])


5. REPLACE(): 문자열 내의 모든 부분 문자열을 새 부분 문자열로 바꿉니다.

구문(Syntax): REPLACE(str, from_substring, to_substring)


6. UPPER(): 문자열을 대문자로 변환합니다.

구문(Syntax): UPPER(str)


7. LOWER(): 문자열을 소문자로 변환합니다.

구문(Syntax): LOWER(str)


8. TRIM(): 문자열에서 선행 및 후행 공백을 제거합니다. 선택적 키워드 'LEADING', 'TRAILING' 또는 'BOTH'를 사용하여 제거할 공백을 지정할 수도 있으며, 공백 대신 사용자 지정 문자를 지정할 수도 있습니다.

구문(Syntax): TRIM([선행 | 후행 | 양쪽] [remstr] FROM str)


9. LEFT(): 문자열의 왼쪽에서 처음 N개의 문자를 반환합니다.

구문(Syntax): LEFT(str, N)


10. RIGHT(): 문자열의 오른쪽에서 처음 N개의 문자를 반환합니다.

구문(Syntax): RIGHT(str, N)


11. REVERSE(): 문자열의 문자를 반전시킵니다.

 

구문(Syntax): REVERSE(str)


12. CONCAT_WS(): 지정된 구분 기호로 두 개 이상의 문자열을 연결합니다.

 

구문(Syntax): CONCAT_WS(구분자, str1, str2, ...)


13. LOCATE(): 선택적 시작 위치와 함께 문자열 내에서 하위 문자열의 첫 번째 발생 위치를 반환합니다.

 

구문(Syntax): LOCATE(substr, str, [start_position])


14. LTRIM(): 문자열에서 선행 공백을 제거합니다.

 

구문(Syntax): LTRIM(str)


15. RTRIM(): 문자열에서 후행 공백을 제거합니다.

 

구문(Syntax): RTRIM(str)

숫자형 내장 함수

MySQL은 숫자 데이터에 대한 연산을 수행할 수 있는 다양한 내장 숫자 함수를 제공합니다.

1. ABS(): 숫자의 절대값을 반환합니다.

구문(Syntax): ABS(숫자)


2. ROUND(): 숫자를 가장 가까운 정수 또는 지정된 소수점 이하 자릿수로 반올림합니다.

구문(Syntax): ROUND(number, [decimal_places])


3. CEILING(): 숫자(숫자의 '상한'이라고도 함)보다 크거나 같은 가장 작은 정수값을 반환합니다.

구문(Syntax): CEILING(숫자)


4. FLOOR(): 숫자(숫자의 '바닥'이라고도 함)보다 작거나 같은 가장 큰 정수 값을 반환합니다.

구문(Syntax): FLOOR(숫자)

 

5. MOD(): 나눗셈 연산(모듈로 연산)의 나머지를 반환합니다.

구문(Syntax): MOD(number1, number2)


6. POWER(): 숫자를 다른 숫자의 거듭제곱으로 올립니다.

구문(Syntax): POWER(base, 지수)


7. SQRT(): 숫자의 제곱근을 계산합니다.

구문(Syntax): SQRT(숫자)


8. RAND(): 0(포함)과 1(제외) 사이의 임의의 부동 소수점 값을 생성합니다.

구문(Syntax): RAND([seed])


9. TRUNCATE(): 반올림하지 않고 지정된 소수점 이하 자릿수로 숫자를 잘라냅니다.

구문(Syntax): TRUNCATE(숫자, 소수 자릿수)


10. SIN(): 각도의 사인(라디안 단위)을 계산합니다.

구문(Syntax): SIN(각도)


11. COS(): 각도의 코사인을 계산합니다(라디안 단위).

구문(Syntax): COS(각도)


12. TAN(): 각도의 탄젠트를 계산합니다(라디안 단위).

구문(Syntax): TAN(각도)


13. ASIN(): 숫자의 아크사인(역사인)을 계산하여 결과를 라디안 단위로 반환합니다.

구문(Syntax): ASIN(숫자)


14. ACOS(): 숫자의 아크 코사인(역 코사인)을 계산하여 결과를 라디안 단위로 반환합니다.

구문(Syntax): ACOS(숫자)


15. ATAN(): 숫자의 호 탄젠트(역탄젠트)를 계산하여 결과를 라디안 단위로 반환합니다.

구문(Syntax): ATAN(숫자)

날짜/시간 내장 함수

MySQL은 날짜 및 시간 값을 조작하고 작업할 수 있는 다양한 내장 날짜 및 시간 함수를 제공합니다.

1. NOW(): 현재 날짜와 시간을 반환합니다.

구문(Syntax): NOW()


2. CURDATE(): 현재 날짜를 반환합니다.

구문(Syntax): CURDATE()


3. CURTIME(): 현재 시간을 반환합니다.

구문(Syntax): CURTIME()


4. DATE_ADD(): 날짜 또는 날짜/시간 값에 시간 간격을 추가합니다.

구문(Syntax): DATE_ADD(날짜, INTERVAL expr 단위)


5. DATE_SUB(): 날짜 또는 날짜/시간 값에서 시간 간격을 뺍니다.

구문(Syntax): DATE_SUB(날짜, INTERVAL expr 단위)


6. DATEDIFF(): 두 날짜 사이의 일 수를 계산합니다.

구문(Syntax): DATEDIFF(date1, date2)


7. DAYOFWEEK(): 날짜의 요일을 반환합니다(일요일은 1, 토요일은 7).

구문(Syntax): DAYOFWEEK(날짜)


8. DATE_FORMAT(): 지정된 형식을 사용하여 날짜 또는 날짜/시간 값의 서식을 지정합니다.

구문(Syntax): DATE_FORMAT(날짜, 형식)


9. STR_TO_DATE(): 지정된 형식을 사용하여 문자열을 날짜 또는 날짜/시간 값으로 변환합니다.

구문(Syntax): STR_TO_DATE(str, format)


10. UNIX_TIMESTAMP(): 날짜 또는 날짜/시간 값을 유닉스 타임스탬프('1970-01-01 00:00:00' UTC 이후 초수)로 변환합니다.

구문(Syntax): UNIX_TIMESTAMP([date])


11. FROM_UNIXTIME(): 유닉스 타임스탬프를 날짜 또는 날짜/시간 값으로 변환합니다.

 

구문(Syntax): FROM_UNIXTIME(timestamp, [format])


12. EXTRACT(): 날짜 또는 날짜/시간 값에서 날짜의 일부(예: 연도, 월 또는 일)를 추출합니다.

 

구문(Syntax) EXTRACT(단위 FROM 날짜)


13. YEAR(): 날짜 또는 날짜/시간 값의 연도 부분을 반환합니다.

 

구문(Syntax) YEAR(date)


14. MONTH(): 날짜 또는 날짜/시간 값의 월 부분을 반환합니다.

 

구문(Syntax) MONTH(date)


15. DAY(): 날짜 또는 날짜/시간 값의 일 부분을 반환합니다.

 

구문(Syntax): DAY(날짜)
반응형

'SQL' 카테고리의 다른 글

[SQL] SQL 프로그래밍  (0) 2023.05.09
[SQL] SQL 피벗과 UNION/IN 연산자  (0) 2023.05.09
[SQL] MySQL 데이터 유형과 종류  (0) 2023.05.08
[MySQL] RANK 함수  (0) 2023.04.24
[SQL] SQL MATH 함수  (0) 2023.04.24
반응형

목차

  1. 숫자 데이터 유형
  2. 텍스트/문자열 데이터 유형
  3. 날짜/시간 데이터 유형
  4.  geometry, json 데이터 유형

숫자 데이터 유형

MySQL은 데이터베이스에 다양한 종류의 숫자 값을 저장하기 위해 여러 가지 숫자 데이터 유형을 제공합니다. 이러한 데이터 유형은 정수, 부동 소수점, 고정 소수점의 세 가지 범주로 그룹화할 수 있습니다.

  1. 정수(Integer) 데이터 유형
    MySQL은 저장 크기와 값 범위가 각각 다른 네 가지 정수 데이터 유형을 지원합니다.

    • TINYINT: -128~127(부호) 또는 0~255(부호 없음) 사이의 값을 저장할 수 있는 매우 작은 정수입니다. 1바이트의 저장 공간을 차지합니다.

    • SMALLINT: -32,768~32,767(부호) 또는 0~65,535(부호 없음) 사이의 값을 저장할 수 있는 작은 정수입니다. 2바이트의 저장 공간을 차지합니다.

    • MEDIUMINT: -8,388,608~8,388,607(부호) 또는 0~16,777,215(부호 없음) 사이의 값을 저장할 수 있는 중간 크기의 정수입니다. 3바이트의 저장 공간을 차지합니다.

    • INT: -2,147,483,648 ~ 2,147,483,647(부호) 또는 0 ~ 4,294,967,295(부호 없음) 사이의 값을 저장할 수 있는 일반 정수입니다. 4바이트의 저장 공간을 차지합니다.

    • BIGINT: -9,223,372,036,854,775,808에서 9,223,372,036,854,775,807(부호) 또는 0에서 18,446,744,073,709,551,615(부호 없음) 사이의 값을 저장할 수 있는 큰 정수입니다. 8바이트의 저장 공간을 차지합니다. 

  2. 부동 소수점(Floating-point) 데이터 유형
    부동 소수점 데이터 유형은 대략적인 숫자 값을 저장하므로 정확한 정밀도가 필요하지 않은 계산에 유용합니다. MySQL은 두 가지 부동 소수점 유형을 지원합니다:

    • FLOAT: 단정밀도 부동 소수점 숫자로, ~1.18e-38 ~ ~3.4e+38의 값을 7자리 정밀도로 저장할 수 있습니다. 4바이트의 저장 공간을 차지합니다.

    • double: 2.23e-308 ~ ~1.8e+308의 값을 15자리 정밀도로 저장할 수 있는 배정밀도 부동소수점 수입니다. 8바이트의 저장 공간을 차지합니다.

  3. 고정 소수점(Fixed-point) 데이터 유형:
    MySQL은 소수점 뒤에 지정된 자릿수가 있는 정확한 숫자 값을 저장하는 고정 소수점 숫자도 지원합니다. 고정 소수점 유형은 하나입니다:

    • DECIMAL(M, D): 총 자릿수가 M인 정확한 숫자 값이며, 이 중 소수점 뒤의 자릿수는 D입니다. M은 1에서 65 사이이고 D는 0에서 30 사이일 수 있습니다. M의 기본값은 10이고 D는 0입니다. DECIMAL의 저장 요구 사항은 M과 D의 값에 따라 달라집니다.

테이블에서 열을 정의할 때 UNSIGNED 속성을 사용하여 열에 부호 있는 값 또는 부호 없는 값을 허용할지 여부를 지정할 수 있습니다. 부호 없는 값은 음수를 저장할 수 없으므로 주어진 숫자 유형에 대해 저장할 수 있는 최대 양수 값의 두 배가 됩니다.


텍스트/문자열 데이터 유형

MySQL은 데이터베이스에 텍스트 및 문자열 값을 저장하기 위한 여러 문자 데이터 유형을 제공합니다. MySQL의 기본 문자 데이터 유형은 다양한 크기와 저장 특성을 가진 CHAR, VARCHAR 및 TEXT입니다:

  1. CHAR
    지정된 길이(N)의 문자열을 저장하는 데 사용되는 고정 길이 문자 데이터 유형으로, N은 1에서 255자 사이일 수 있습니다. CHAR 열은 짧은 문자열을 후행 공백으로 채우거나 긴 문자열을 지정된 길이에 맞게 잘라내는 방식으로 정확히 N자의 문자열을 저장합니다. CHAR는 국가 코드나 우편 번호와 같이 길이가 일정한 문자열을 저장하는 데 적합합니다.

  2. VARCHAR
    지정된 최대 길이(M)의 문자열을 저장하는 데 사용되는 가변 길이 문자 데이터 유형으로, M은 1~65,535자 사이일 수 있습니다(사용되는 최대 행 크기 및 문자 집합에 따라 실제 최대 길이는 이보다 짧을 수 있음). CHAR 열과 달리 VARCHAR 열은 후행 공백으로 짧은 문자열을 채우지 않으며 문자열 값과 함께 정확한 문자열 길이를 저장합니다. VARCHAR는 이름이나 주소와 같이 가변 길이의 문자열을 저장하는 데 적합합니다.

  3. TEXT
    큰 텍스트 값을 저장하는 데 사용되는 가변 길이 문자 데이터 유형입니다. MySQL은 최대 길이와 저장 요구 사항이 다른 네 가지 유형의 TEXT 열을 제공합니다:

    • TINYTEXT: 최대 255바이트의 텍스트를 저장할 수 있는 작은 텍스트 열입니다. 저장된 텍스트의 최대 길이는 사용되는 문자 집합에 따라 다릅니다.

    • TEXT: 최대 65,535바이트의 텍스트를 저장할 수 있는 중간 크기의 텍스트 열입니다. 저장된 텍스트의 최대 길이는 사용되는 문자 집합에 따라 다릅니다.

    • MEDIUMTEXT: 최대 16,777,215바이트의 텍스트를 저장할 수 있는 더 큰 텍스트 열입니다. 저장된 텍스트의 최대 길이는 사용되는 문자 집합에 따라 다릅니다.

    • LONGTEXT: 최대 4,294,967,295바이트의 텍스트를 저장할 수 있는 가장 큰 텍스트 열입니다. 저장된 텍스트의 최대 길이는 사용되는 문자 집합에 따라 다릅니다.
  4. BINARY
    지정된 길이(N)의 이진 데이터를 저장하는 데 사용되는 고정 길이 이진 데이터 유형으로, N은 1바이트에서 255바이트 사이일 수 있습니다. CHAR 데이터 유형과 유사하게, BINARY 열은 짧은 이진 데이터에 후행 0바이트(0x00)를 추가하거나 긴 이진 데이터를 지정된 길이에 맞게 잘라내는 방식으로 정확히 N바이트의 값을 저장합니다. BINARY는 해시 또는 고정 길이 인코딩과 같은 고정 길이 바이너리 데이터를 저장하는 데 적합합니다.

  5. VARBINARY
    지정된 최대 길이(M)의 바이너리 데이터를 저장하는 데 사용되는 가변 길이 바이너리 데이터 유형으로, M은 1~65,535바이트 사이가 될 수 있습니다. VARCHAR 데이터 유형과 마찬가지로 VARBINARY 열은 더 짧은 이진 데이터에 패딩을 하지 않으며 이진 값과 함께 정확한 데이터 길이를 저장합니다. VARBINARY는 암호화된 문자열이나 압축 데이터와 같이 가변 길이의 이진 데이터를 저장하는 데 적합합니다.

  6. BLOB
    큰 바이너리 데이터 값을 저장하는 데 사용되는 BLOB(바이너리 대용량 객체) 데이터 유형입니다. MySQL은 최대 길이와 저장소 요구 사항이 다른 네 가지 유형의 BLOB 열을 제공합니다:

    • TINYBLOB: 최대 255바이트의 바이너리 데이터를 저장할 수 있는 작은 바이너리 열입니다.

    • BLOB: 최대 65,535바이트의 바이너리 데이터를 저장할 수 있는 중간 크기의 바이너리 열입니다.

    • MEDIUMBLOB: 최대 16,777,215바이트의 바이너리 데이터를 저장할 수 있는 더 큰 바이너리 열입니다.

    • LONGBLOB: 가장 큰 바이너리 열로, 최대 4,294,967,295바이트의 바이너리 데이터를 저장할 수 있습니다.

  7. ENUM
    미리 정의된 값 목록에서 하나의 값을 저장하는 데 사용되는 열거형 데이터 유형입니다. ENUM 열을 정의할 때는 유효한 문자열 값의 목록을 지정해야 합니다. ENUM 열의 저장 요구 사항은 열거형의 요소 수에 따라 1바이트 또는 2바이트입니다(최대 65,535개 요소). ENUM은 요일, 사용자 역할 또는 주문 상태와 같이 잘 정의된 작은 옵션 집합으로 값을 저장하는 데 적합합니다.

  8. SET
    미리 정의된 값 목록에서 값의 조합을 저장하는 데 사용되는 집합 데이터 유형입니다. SET 열을 정의할 때는 유효한 문자열 값 목록을 지정해야 합니다. SET 열은 최대 64개의 고유 값을 저장할 수 있으며 쉼표로 구분된 형식으로 목록의 여러 값을 포함할 수 있습니다. SET 열의 저장 요구 사항은 집합의 요소 수(최대 64개 요소)에 따라 1, 2, 3, 4 또는 8바이트입니다. SET은 사용자 권한이나 제품 기능과 같은 속성이나 플래그의 조합을 저장하는 데 적합합니다.

날짜/시간 데이터 유형

MySQL은 날짜 및 시간 값을 다양한 형식으로 저장하기 위한 여러 데이터 유형을 제공합니다.

  1. DATE
    이 데이터 유형은 날짜 값을 'YYYY-MM-DD' 형식으로 저장하며, 여기서 'YYYY'는 4자리 연도를, 'MM'은 2자리 월(01-12)을, 'DD'는 2자리 일(01-31)을 나타냅니다. DATE 데이터 유형의 유효한 날짜 범위는 '1000-01-01'부터 '9999-12-31'까지이며, 3바이트의 저장 공간을 차지합니다.

  2. TIME
    이 데이터 유형은 시간 값을 'hh:mm:ss' 형식으로 저장하며, 여기서 'hh'는 시(23), 'mm'는 분(00-59), 'ss'는 초(00-59)를 나타냅니다. TIME 데이터 유형의 유효한 시간 범위는 '-838:59:59'부터 '838:59:59'까지이며, 3바이트의 저장 공간을 차지합니다.

  3. DATETIME
    이 데이터 유형은 결합된 날짜 및 시간 값을 'YYYY-MM-DD hh:mm:ss' 형식으로 저장합니다. DATETIME 데이터 유형의 유효한 범위는 '1000-01-01 00:00:00'부터 '9999-12-31 23:59:59'까지이며, '9999-12-31 23:59:59'까지의 값은 5바이트, '1000-01-01 00:00:00' 이후의 값은 8바이트의 저장 공간을 차지합니다.

  4. TIMESTAMP
    이 데이터 유형은 날짜 및 시간 값을 결합하여 'YYYY-MM-DD hh:mm:ss' 형식으로 저장하며, DATETIME 데이터 유형과 유사합니다. 그러나 TIMESTAMP 값은 서로 다른 표준 시간대 간에 자동 변환이 가능하도록 유닉스 에포크('1970-01-01 00:00:00' UTC) 이후의 초 수로 저장됩니다. TIMESTAMP 데이터 유형의 유효한 범위는 '1970-01-01 00:00:01' UTC부터 '2038-01-19 03:14:07' UTC까지이며, 4바이트의 저장 공간을 차지합니다.

  5. YEAR
    이 데이터 유형은 연도 값을 2자리(YY) 또는 4자리(YYYY) 형식으로 저장합니다. 4자리 형식의 유효한 범위는 1901년부터 2155년까지이며, 2자리 형식은 1970년부터 2069년까지 연도를 나타내는 70부터 69까지의 값을 저장할 수 있습니다. YEAR 데이터 유형은 1바이트의 저장 공간을 차지합니다.

날짜 및 시간 데이터 유형으로 작업할 때 NOW(), CURDATE(), CURTIME(), DATE_ADD(), DATE_SUB() 등과 같은 다양한 MySQL 함수를 사용하여 날짜 및 시간 값을 조작, 비교 및 계산할 수 있습니다.


geometry, json 데이터 유형

MySQL은 공간 데이터를 위한 지리 데이터와 JSON 데이터를 저장하기 위한 JSON이라는 두 가지 추가 데이터 유형을 지원합니다. 다음은 이러한 데이터 유형에 대한 개요입니다:

  1. GEOMETRY
    지리 또는 기하학적 개체를 나타내는 점, 선, 다각형과 같은 공간 데이터를 저장하는 데 사용되는 데이터 유형입니다. 공간 데이터 유형은 지리 정보 시스템(GIS) 및 공간 데이터를 다루는 기타 애플리케이션에 유용합니다. MySQL은 다양한 유형의 공간 데이터를 위한 몇 가지 특수한 기하학 데이터 유형을 제공합니다:

    • POINT: 2차원 공간에서 단일 점을 나타냅니다.

    • LINESTRING: 선 또는 곡선을 이루는 점의 시퀀스를 나타냅니다.

    • POLYGON: 일련의 점으로 구성된 닫힌 도형을 나타냅니다.

    • MULTIPOINT: 여러 개의 포인트 객체 모음을 나타냅니다.

    •  MULTILINESTRING: 여러 LINESTRING 객체의 컬렉션을 나타냅니다.

    • MULTIPOLYGON: 여러 개의 다각형 객체 컬렉션을 나타냅니다.

    • GEOMETRYCOLLECTION: 모든 유형의 여러 GEOMETRY 객체 컬렉션을 나타냅니다.

지리 데이터 유형을 사용할 때 MySQL은 공간 데이터를 생성, 분석 및 조작하기 위해 ST_Distance(), ST_Within(), ST_Buffer() 등과 같은 공간 함수 집합을 제공합니다.

  1. JSON
    JSON 데이터 유형은 사람이 쉽게 읽고 쓸 수 있고 기계가 쉽게 구문 분석하고 생성할 수 있는 경량 데이터 교환 형식인 JSON(JavaScript Object Notation) 데이터를 저장하는 데 사용됩니다. JSON 데이터는 객체, 배열, 중첩된 값과 같은 복잡한 데이터 구조를 나타낼 수 있습니다.

    MySQL의 JSON 데이터 유형은 다음과 같은 이점을 제공합니다.

    • 유효성 검사: MySQL은 JSON 데이터의 유효성을 자동으로 검사하여 데이터베이스에 저장하기 전에 유효한 JSON 형식인지 확인합니다.

    • 스토리지 효율성: JSON 데이터는 바이너리 형식(바이너리 JSON 또는 BSON이라고 함)으로 저장되므로 원시 JSON 텍스트를 저장하는 것보다 더 압축적이고 효율적입니다.

    • 쿼리 기능: MySQL은 JSON_EXTRACT(), JSON_REPLACE(), JSON_ARRAY(), JSON_OBJECT() 등 JSON 데이터를 쿼리, 조작, 생성할 수 있는 다양한 JSON 함수 세트를 제공합니다.

MySQL에서 JSON 데이터 유형을 사용하면 유연하고 스키마가 필요 없는 방식으로 반정형 데이터를 효율적으로 저장하고 작업할 수 있어 동적 데이터나 다양한 속성을 가진 데이터를 다룰 때 특히 유용합니다.


 

반응형

'SQL' 카테고리의 다른 글

[SQL] SQL 피벗과 UNION/IN 연산자  (0) 2023.05.09
[SQL] MySQL 변수와 내장 함수  (2) 2023.05.09
[MySQL] RANK 함수  (0) 2023.04.24
[SQL] SQL MATH 함수  (0) 2023.04.24
[SQL] SQL GROUP 함수  (0) 2023.04.24

[MySQL] RANK 함수

이지IT
|2023. 4. 24. 21:13
반응형
RANK 관련 함수

SQL 창 함수는 현재 행과 관련된 일련의 행에서 계산을 수행하는 함수 클래스입니다. OVER() 절과 함께 사용되며 결과 집합의 특정 행 창을 기반으로 계산을 수행할 수 있습니다. 창 함수는 행을 집계 함수처럼 그룹화하지 않습니다. 대신 결과 집합 내 행의 "창"에서 작동합니다. 다음은 몇 가지 일반적인 창 함수와 예제입니다.

1. ROW_NUMBER(): 결과 집합 내의 각 행에 고유 번호를 할당합니다.

SELECT id, product, sale_date, amount,
       ROW_NUMBER() OVER (ORDER BY sale_date) AS row_num
FROM sales;

 

2. RANK():
동일한 값을 가진 행에 대해 동일한 순위를 사용하여 결과 집합 내의 각 개별 행에 고유한 순위를 할당합니다. 동일한 값을 가진 행은 동일한 순위를 받고 다음 순위에 대한 시퀀스에 간격이 나타납니다.

SELECT id, product, sale_date, amount,
       RANK() OVER (ORDER BY amount DESC) AS rank
FROM sales;

 

3. DENSE_RANK(): RANK()와 유사하지만 동일한 순위 값이 있는 경우 순위 시퀀스에 간격이 없습니다.

SELECT id, product, sale_date, amount,
       DENSE_RANK() OVER (ORDER BY amount DESC) AS dense_rank
FROM sales;

 

4. NTILE(n):
행을 지정된 수의 그룹(n)으로 분배합니다. 각 그룹은 가능한 경우 동일한 수의 행을 포함합니다. 값이 같은 행은 같은 그룹에 배치됩니다.

SELECT id, product, sale_date, amount,
       NTILE(4) OVER (ORDER BY amount) AS quartile
FROM sales;

 

5. LAG(열, n, 기본값_값):
결과 집합 내에서 현재 행보다 n행 앞에 있는 행에 대해 지정된 열의 값을 반환합니다. 행이 없으면 default_value가 반환됩니다.

SELECT id, product, sale_date, amount,
       LAG(amount, 1) OVER (ORDER BY sale_date) AS prev_amount
FROM sales;

 

6. LEAD(열, n, 기본값_값):
결과 집합 내에서 현재 행 다음의 n행에 대해 지정된 열의 값을 반환합니다. 행이 없으면 default_value가 반환됩니다.

SELECT id, product, sale_date, amount,
       LEAD(amount, 1) OVER (ORDER BY sale_date) AS next_amount
FROM sales;

 

7. PARTITION BY의 예:

SELECT name, subject, score, RANK() OVER (PARTITION BY subject ORDER BY score DESC) AS rank
FROM students;


이 쿼리는 각 과목 내 점수를 기준으로 학생의 순위를 매깁니다.

 

8. CUME_DIST()(PostgreSQL, SQL 서버 및 Oracle):
CUME_DIST()는 결과 집합 내 값의 누적 분포를 계산하는 상대 순위 함수입니다. 지정된 순서 열에서 현재 행의 값보다 작거나 같은 행의 비율을 나타내는 0과 1 사이의 분수로 행의 상대적 순위를 반환합니다.

SELECT name, score, CUME_DIST() OVER (ORDER BY score DESC) AS cum_dist
FROM students;


이 쿼리는 학생 점수의 누적 분포를 계산합니다.

9. PERCENT_RANK()(PostgreSQL, SQL 서버 및 Oracle):
PERCENT_RANK()는 결과 집합 내 행의 백분위수 순위를 계산하는 상대 순위 함수입니다. 지정된 순서 열에 있는 모든 값 중에서 현재 행 값의 상대적 위치를 나타내는 0과 1 사이의 값을 반환합니다. 계산은 순위를 기준으로 하지만 결과는 0과 1 사이에서 정규화됩니다.

SELECT name, score, PERCENT_RANK() OVER (ORDER BY score DESC) AS pct_rank
FROM students;


이 쿼리는 학생 점수의 백분위수 순위를 계산합니다.

반응형

'SQL' 카테고리의 다른 글

[SQL] MySQL 변수와 내장 함수  (2) 2023.05.09
[SQL] MySQL 데이터 유형과 종류  (0) 2023.05.08
[SQL] SQL MATH 함수  (0) 2023.04.24
[SQL] SQL GROUP 함수  (0) 2023.04.24
[SQL] SQL, SQL server 날짜와 시간 데이터 가져오기  (0) 2023.04.23

[SQL] SQL MATH 함수

이지IT
|2023. 4. 24. 14:43
반응형

목차

  1. 기본 숫자 함수
  2. 삼각 함수

기본 숫자 함수

MySQL은 계산을 수행하고 숫자 데이터를 조작하는 데 사용할 수 있는 다양한 수학 함수를 제공합니다. 다음은 몇 가지 일반적인 MySQL 수학 함수에 대한 개요입니다.

1. ABS(x): x의 절대값을 반환합니다.

SELECT ABS(-5);는 5를 반환합니다.


2. CEIL(x) 또는 CEILING(x): x보다 크거나 같은 가장 작은 정수 값을 반환합니다.

SELECT CEIL(3.7);은 4를 반환합니다.


3. FLOOR(x): x보다 작거나 같은 가장 큰 정수 값을 반환합니다.

 SELECT FLOOR(3.7);은 3을 반환합니다.


4. ROUND(x, d): x 값을 소수점 d 자리까지 반올림합니다. d를 지정하지 않으면 기본값은 0입니다.

 SELECT ROUND(3.456, 2);는 3.46을 반환합니다.


5. TRUNCATE(x, d): x 값을 반올림하지 않고 소수점 d 자리까지 자릅니다.

 SELECT TRUNCATE(3.456, 2);는 3.45를 반환합니다.


6. POW(x, y) 또는 POWER(x, y): x의 y승 값을 반환합니다.

 SELECT POW(2, 3);은 8을 반환합니다.


7. SQRT(x): x의 제곱근을 반환합니다.

 SELECT SQRT(9);는 3을 반환합니다.


8. RAND([seed]): 0과 1 사이의 임의의 부동 소수점 값을 반환합니다. 선택적 시드 값을 제공하면 난수 생성기가 해당 값으로 초기화되어 다음과 같은 결정적 시퀀스를 생성합니다. 난수.

 SELECT RAND();는 0과 1 사이의 난수를 반환합니다.


9. MOD(x, y): x를 y로 나눈 나머지를 반환합니다(x modulo y).

 SELECT MOD(10, 3);는 1을 반환합니다.


10. GREATEST(x1, x2, ..., xn): 인수 목록 중 가장 큰 값을 반환합니다.

 SELECT GREATEST(1, 5, 2, 8);은 8을 반환합니다.


11. LEAST(x1, x2, ..., xn): 인수 목록 중 가장 작은 값을 반환합니다.

 SELECT LEAST(1, 5, 2, 8);은 1을 반환합니다.

12. LOG(x, 밑): LOG 함수는 주어진 숫자 x의 자연 로그(밑 e)를 반환합니다. 선택적 base 매개변수가 제공되면 지정된 밑으로 x의 로그를 반환합니다. 'base'가 제공되지 않으면 기본값은 자연 로그(밑 e)입니다. 

SELECT LOG(100, 10);는 log10(100)이 2이므로 2를 반환합니다.


13. SQUARE(x): MySQL에는 SQUARE 기능이 내장되어 있지 않습니다. 그러나 POWER 기능을 사용하여 동일한 결과를 얻을 수 있습니다. POWER 함수는 y의 거듭제곱으로 올린 x의 값을 반환합니다. 숫자를 제곱하려면 'y'를 2로 설정합니다.

 SELECT POWER(4, 2);는 4의 제곱이 16이므로 16을 반환합니다.


14. PI(): PI 함수는 약 3.14159265358979323846인 수학 상수 π(pi)의 값을 반환합니다. 인수가 필요하지 않습니다.

 SELECT PI();는 약 3.141592653589793을 반환합니다.


삼각 함수

SQL은 COS, SIN, TAN 및 DEGREES와 같은 삼각 함수를 제공하여 각도 및 삼각법과 관련된 계산을 수행합니다. 다음은 각 기능에 대한 간략한 설명과 사용 방법의 예입니다.

1. COS(x): x의 코사인을 반환합니다. 여기서 x는 라디안으로 지정됩니다.

SELECT COS(PI());


2. SIN(x): x의 사인을 반환합니다. 여기서 x는 라디안으로 표시됩니다.

SELECT SIN(PI() / 2);


3. TAN(x): x의 탄젠트를 반환합니다. 여기서 x는 라디안으로 표시됩니다.

SELECT TAN(PI() / 4);


4. DEGREES(x): x를 라디안에서 각도로 변환합니다.

SELECT DEGREES(PI());


5. 삼각 함수(COS, SIN, TAN)에 대한 입력은 라디안이어야 합니다. 필요한 경우 RADIANS(x) 함수를 사용하여 각도를 라디안으로 변환할 수 있습니다.

각도를 라디안으로 변환하고 SIN 함수를 사용하는 예시

SELECT SIN(RADIANS(90));


이 예제는 90도를 라디안으로 변환하고 각도의 사인을 계산합니다.

반응형

'SQL' 카테고리의 다른 글

[SQL] MySQL 데이터 유형과 종류  (0) 2023.05.08
[MySQL] RANK 함수  (0) 2023.04.24
[SQL] SQL GROUP 함수  (0) 2023.04.24
[SQL] SQL, SQL server 날짜와 시간 데이터 가져오기  (0) 2023.04.23
[SQL] SQL 문자열 함수들과 사용 예시  (0) 2023.04.23