데이터베이스 개발



SQL

정의

SQL(Structured Query Language)은 관계형 데이터베이스를 관리하고 운영하는 데 사용되는 구조화된 쿼리 언어입니다. 데이터베이스 관리 시스템에서 가장 널리 사용되는 언어 중 하나입니다.

주요 기능

기본 문법

-- 데이터 쿼리
SELECT * FROM 테이블 이름 WHERE 조건;

--데이터 삽입
INSERT INTO 테이블 이름(열 1, 열 2) VALUES(값 1, 값 2);

--데이터 업데이트
UPDATE 테이블 이름 SET 열 1 = 값 1 WHERE 조건;

-- 데이터 삭제
DELETE FROM 테이블 이름 WHERE 조건;

--테이블 생성
CREATE TABLE 테이블 이름(
    열 이름 1 데이터 유형,
    열 이름 2 데이터 유형
);

일반적인 데이터 유형

이점



MySQL

관계형 데이터베이스

MySQL은 SQL을 쿼리 언어로 사용하고 중소 규모 및 대규모 애플리케이션에 적합한 인기 있는 오픈 소스 관계형 데이터베이스 관리 시스템(RDBMS)입니다.

특성

사용 예

mysql -u root -p
CREATE DATABASE example_db;
USE example_db;
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT);
INSERT INTO users (name, age) VALUES ('Alice', 30);
SELECT * FROM users;

적용 가능한 시나리오



SQLite

경량 데이터베이스

SQLite는 관리를 위해 별도의 서버가 필요하지 않은 임베디드 데이터베이스로 경량 애플리케이션에 적합합니다.

특성

사용 예

sqlite3 example.db
CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER);
INSERT INTO users (name, age) VALUES ('Alice', 30);
SELECT * FROM users;

적용 가능한 시나리오



PostgreSQL

PostgreSQL(종종 Postgres라고도 함)은 강력한 오픈 소스 ORDBMS(객체 관계형 데이터베이스 시스템)입니다. 30년 이상의 활발한 개발을 기반으로 안정성, 기능적 견고성, 성능에 대한 높은 평가를 받고 있으며 "세계에서 가장 발전된 오픈 소스 데이터베이스"로 알려져 있습니다.


핵심 기능

기술 아키텍처

PostgreSQL은 클라이언트-서버 아키텍처를 채택하고 각 연결에 독립적인 핸들러를 할당하므로 단일 연결의 충돌이 전체 데이터베이스 서버의 안정성에 영향을 미치지 않도록 보장합니다.

일반적인 확장 키트

Postgres의 힘은 주로 풍부한 생태계 확장에서 비롯됩니다.

장점과 단점 비교

이점 결점
높은 데이터 무결성 및 보안 높은 빈도로 많은 양의 데이터를 쓰는 경우 VACUUM 메커니즘으로 인해 성능 변동이 발생할 수 있습니다.
복잡한 데이터 분석 및 비즈니스 로직 지원 메모리 소비는 일반적으로 MySQL에 비해 높습니다.
오픈 소스 커뮤니티는 매우 활발하며 벤더 종속이 없습니다. 설정해야 할 매개변수가 많으며 초보자는 성능을 구성하고 최적화하기 위해 긴 학습 곡선이 필요합니다.

적용 가능한 시나리오



T-SQL

전체 이름이 Transact-SQL인 T-SQL은 Microsoft와 Sybase가 개발한 SQL 표준의 확장 버전입니다. Microsoft SQL Server 및 Azure SQL 관련 서비스의 핵심 통신 언어입니다. 표준 SQL과 비교하여 T-SQL은 프로그래밍 기능을 추가하여 데이터를 쿼리할 뿐만 아니라 복잡한 논리 작업도 처리할 수 있습니다.


언어 특징


T-SQL과 표준 SQL의 주요 차이점

기능 유형 표준 SQL(ANSI) T-SQL (Microsoft)
문자열 연결 이중 수직 막대를 사용하세요 || 더하기 기호 사용 +
반환되는 열 수 제한 먼저 가져오기 사용 TOP 키워드를 사용하세요
데이터 유형 변환 CAST CAST 및 CONVERT(형식 지원)
프로그램 로직 주로 기본적인 문의사항 완전한 절차적 프로그래밍 언어 기능

기본 문법 예

다음 코드는 T-SQL에서 변수, 논리적 판단 및 데이터 쿼리를 결합하는 방법을 보여줍니다.

-- 변수 선언 및 설정
DECLARE @Threshold INT = 100;
@CurrentStock INT를 선언하세요.

-- 특정 제품의 재고 가져오기
@CurrentStock = 재고 수량 선택
제품에서
제품 ID = 5인 경우;

-- 논리적 판단
IF @CurrentStock < @임계값
시작
    PRINT '경고: 재고가 미리 설정된 임계값보다 낮습니다. ';
    -- 보충 로직을 실행합니다...
종료
그 외
시작
    SELECT * FROM 제품 WHERE ProductID = 5;
끝

애플리케이션 시나리오

T-SQL은 다음 분야에서 널리 사용됩니다.



T-SQL 프로그램 개발

T-SQL은 표준 SQL을 확장하여 완전한 프로그래밍 기능을 제공합니다. 변수, 논리 제어 및 오류 처리를 통해 개발자는 데이터베이스 수준에서 복잡한 비즈니스 논리를 작성할 수 있습니다.


변수 선언 및 할당

T-SQL에서 모든 사용자 지정 변수는 @ 기호로 시작해야 합니다. 선언에는 DECLARE를 사용하고 할당에는 SET 또는 SELECT를 사용합니다.

-- 변수 선언
@EmployeeCount INT를 선언하세요.
DECLARE @DepartmentName NVARCHAR(50);

-- 할당
SET @DepartmentName = 'IT 부서';

--쿼리 결과에서 값 할당
SELECT @EmployeeCount = 개수(*)
직원으로부터
WHERE 부서 = @DepartmentName;

-- 출력 결과
@EmployeeCount를 인쇄하세요.

프로세스 제어 IF...ELSE

IF...ELSE 문을 사용하면 조건에 따라 다양한 코드 블록을 실행할 수 있습니다. 블록에 여러 문이 포함된 경우 BEGIN...END로 래핑해야 합니다.

@StockLevel INT를 선언하세요.
SET @StockLevel = 10;

IF @StockLevel < 5
시작
    PRINT '재고가 매우 부족합니다. 즉시 재입고해 주세요. ';
종료
ELSE IF @StockLevel < 20
시작
    PRINT '재고가 부족하여 재입고를 권장합니다. ';
종료
그 외
시작
    PRINT '재고 있습니다. ';
끝

TRY...CATCH 처리 오류

T-SQL에서 제공하는 TRY...CATCH 메커니즘은 최신 프로그래밍 언어(예: C# 또는 Java)와 유사하며 실행 중 예외를 캡처하여 비정상적인 프로그램 중단을 방지할 수 있습니다.

시도해 보세요
    -- 실행을 시도하는 코드
    INSERT INTO Sales(주문 ID, 제품 ID, 수량)
    값(1001, 'P01', -5); -- 제약 조건 오류가 발생한다고 가정합니다.
시도 종료
잡기 시작
    -- 오류 발생 시 처리
    선택
        ERROR_NUMBER() AS 오류 번호,
        ERROR_MESSAGE() AS 오류 메시지,
        ERROR_SEVERITY() 심각도;
        
    --롤백 트랜잭션
    IF @@TRANCOUNT > 0
        롤백 트랜잭션;
엔드캐치


ID 필드 대신 이름 사용

적용 조건

장점

잠재적인 문제

적용 사례

프로필 유형 데이터 테이블과 같은:

CREATE TABLE config_types (
  name VARCHAR(50) PRIMARY KEY,
  description TEXT
);

INSERT INTO config_types (name, description) VALUES ('general', 'General settings');
SELECT * FROM config_types WHERE name = 'general';


관계형 데이터베이스 디자인 상속 개체

데이터베이스 구조 설계

동물 형태

이 테이블은 모든 "동물"의 공통 속성을 저장합니다.

필드 이름 데이터 유형 설명하다
id INT 동물의 고유 식별자
species VARCHAR(50) 동물의 종류
age INT 동물 나이

고양이 테이블

이 테이블은 동물 테이블의 ID를 상속하고 "cat"이라는 고유한 속성을 저장합니다.

필드 이름 데이터 유형 설명하다
id INT 동물 테이블의 id에 해당합니다.
breed VARCHAR(50) 고양이 품종
favorite_food VARCHAR(50) 고양이가 좋아하는 음식

SQL 테이블 생성 명령

CREATE TABLE animal (
    id INT PRIMARY KEY AUTO_INCREMENT,
    species VARCHAR(50) NOT NULL,
    age INT NOT NULL
);

CREATE TABLE cat (
    id INT PRIMARY KEY,
    breed VARCHAR(50),
    favorite_food VARCHAR(50),
    FOREIGN KEY (id) REFERENCES animal(id)
);
    

데이터 삽입 예

INSERT INTO animal (species, age) VALUES ('Cat', 3);

INSERT INTO cat (id, breed, favorite_food) VALUES (1, 'Siamese', 'Fish');
    

HTML 테이블 표시 예

동물 정보

동물 ID 유형 나이
1 Cat 3

고양이 관련 정보

동물 ID 다양성 음식을 사랑해
1 Siamese Fish

설명하다

이 예에서는animal테이블에는 모든 동물의 공통 속성이 저장되며,cat테이블에는 고양이의 고유한 속성이 저장됩니다.cat테이블에id참고사항입니다animal표의id, 이는 상속 관계임을 나타냅니다.

모든 동물에 대한 정보 쿼리

SELECT * FROM animal;
    

모든 고양이에 대한 정보 쿼리

이 쿼리는 동물 테이블에서 상속된 공통 속성을 포함하여 모든 고양이에 대한 전체 정보를 반환합니다.

SELECT animal.id, animal.species, animal.age, cat.breed, cat.favorite_food
FROM animal
JOIN cat ON animal.id = cat.id;
    

특정 동물에 대한 정보(특정 ID 등) 조회

SELECT * FROM animal WHERE id = 1;
    

특정 고양이(예: 특정 품종)에 대한 정보 쿼리

SELECT animal.id, animal.species, animal.age, cat.breed, cat.favorite_food
FROM animal
JOIN cat ON animal.id = cat.id
WHERE cat.breed = 'Siamese';
    

설명하다

이 쿼리 예제에서는JOIN할 것이다animal테이블과cat테이블을 결합하여 고양이에 대한 완전한 정보를 얻습니다. 이 접근 방식을 사용하면 쿼리 결과에 상속된 속성과 고유한 속성이 모두 포함됩니다.



FOREIGN KEY

사용

FOREIGN KEY(외부 키)는 두 데이터 테이블 간의 연결을 설정하여 데이터의 참조 무결성을 보장하는 데 사용됩니다. 예를 들어 한 데이터 테이블의 필드 값은 다른 데이터 테이블의 기본 키 또는 고유 값을 참조해야 합니다.

문법

CREATE TABLE 하위 테이블(
  필드 이름 데이터 유형,
  FOREIGN KEY(외래 키 필드) REFERENCES 상위 데이터 테이블(기본 키 필드)
);

주문, 고객 등 일대다 관계를 설정합니다.

-- 상위 데이터 테이블(고객) 생성
CREATE TABLE 고객(
  customer_id INT 기본 키,
  이름 VARCHAR(50)
);

--하위 테이블(주문) 생성 및 외래 키 설정
CREATE TABLE 주문(
  order_id INT 기본 키,
  고객_ID INT,
  주문_날짜 DATE,
  FOREIGN KEY (customer_id) REFERENCES 고객(customer_id)
);

주의할 점

고급 사용법

통과할 수 있다ON DELETE그리고ON UPDATE외래 키 동작을 지정합니다.

CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  customer_id INT,
  order_date DATE,
  FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
  ON DELETE CASCADE
  ON UPDATE CASCADE
);

행동 옵션



CREATE TABLE에 설명 추가

COMMENT를 사용하여 필드 설명 설정

MySQL에서는 다음을 사용할 수 있습니다.COMMENT필드에 메모를 추가합니다.

CREATE TABLE 사용자(
  id INT PRIMARY KEY COMMENT '사용자 고유 식별 코드',
  name VARCHAR(50) COMMENT '사용자 이름',
  age INT COMMENT '사용자의 나이'
);

COMMENT를 사용하여 테이블 주석 설정

CREATE TABLE 사용자(
  ID INT 기본 키,
  이름 VARCHAR(50),
  나이INT
) COMMENT = '사용자 정보 테이블';

현장 노트 보기

필드의 설명은 다음 구문을 통해 쿼리할 수 있습니다.

SHOW FULL COLUMNS FROM users;

필드 노트 수정

ALTER TABLE 사용자 MODIFY COLUMN 이름 VARCHAR(50) COMMENT '수정된 설명';

적용 범위

PostgreSQL 설정 참고 사항

COMMENT ON COLUMN users.name IS '사용자 이름';


SQL 열 이름은 예약어를 사용합니다.

SQL 쿼리에서 필드 이름이 데이터베이스 시스템의 예약어(키워드)와 충돌하면 구문 오류가 발생합니다. 이 문제를 해결하려면 예방과 해결 측면 모두에서 포괄적인 고려가 필요합니다.

1. 근본적인 해결책: 예약어 사용을 피하세요(데이터베이스 설계)

이는 가장 권장되는 접근 방식이며 문제의 원인을 제거하는 것을 목표로 합니다.

2. 기술적 해결 방법: 식별 기호를 따옴표로 묶어서 표시(프로그램 코드 구현)

예약어 사용을 피할 수 없는 경우(예: 기존 데이터베이스 구조로 작업할 때) 필드 이름을 적절한 따옴표로 묶어 이것이 SQL 명령이 아니라 식별자임을 SQL 엔진에 명확하게 알려야 합니다.

데이터베이스 시스템 따옴표
MySQL / MariaDB 백틱(`) SELECT `interval`, `time` FROM table;
PostgreSQL / Oracle 큰따옴표(") SELECT "interval", "time" FROM table;
SQL Server 대괄호([]) SELECT [interval], [time] FROM table;

3. 프로그램 코드 자동화(SQL을 동적으로 생성)

Python과 같은 프로그래밍 언어에서 SQL 문을 동적으로 생성해야 하는 경우 생성된 명령문이 안전하고 올바른지 확인하기 위해 자동으로 따옴표를 실행하는 기능을 구현해야 합니다.

4. ORM 프레임워크의 장점

ORM(예: SQLAlchemy 또는 Django ORM)을 사용하는 경우 프레임워크는 서로 다른 데이터베이스 간의 예약어 및 따옴표 차이를 자동으로 처리하고 기본 SQL 출력을 추상화하므로 개발 작업이 크게 단순화되고 코드 안정성이 향상됩니다.



SQL DATETIME 비교

TIMESTAMPDIFF 사용

두 DATETIME 필드 사이의 시간 차이를 초 단위로 계산합니다.

SELECT * FROM table_name
WHERE TIMESTAMPDIFF(SECOND, datetime_column1, datetime_column2) < 5;

ABS(TIMESTAMPDIFF) 사용

순서 효과를 방지하려면 시간 차이가 절대값인지 확인하세요.

SELECT * FROM table_name
WHERE ABS(TIMESTAMPDIFF(SECOND, datetime_column1, datetime_column2)) < 5;

DATEDIFF 사용(일 비교에만 해당)

같은 날인지 비교하고 싶다면 DATEDIFF를 사용할 수 있습니다.

SELECT * FROM table_name
WHERE DATEDIFF(datetime_column1, datetime_column2) = 0;

TIMESTAMP를 사용하여 직접 빼기

MySQL과 같이 타임스탬프 작업을 지원하는 데이터베이스에 적용 가능합니다.

SELECT * FROM table_name
WHERE ABS(UNIX_TIMESTAMP(datetime_column1) - UNIX_TIMESTAMP(datetime_column2)) < 5;


MySQL은 밀리초 타임스탬프를 처리합니다.

귀하가 제공한 값1763251200000표준 **밀리초 타임스탬프**(Unix Epoch 시간(밀리초))입니다.

MySQL 내장 함수(예:FROM_UNIXTIME) 기본 처리는 **두 번째 수준 타임스탬프**입니다. 따라서 사용하기 전에 밀리초 타임스탬프를 초로 변환해야 합니다.

수정: 1000으로 나누기

MySQL 함수에 필요한 두 번째 수준 타임스탬프를 얻으려면 밀리초 값을 $1000$로 나눕니다.

1763251200000 / 1000 = 1763251200

1. DATETIME 형식으로 변환

사용FROM_UNIXTIME()함수는 두 번째 수준 타임스탬프를 표준 MySQL로 변환합니다.DATETIME체재:

SELECT FROM_UNIXTIME(1763251200000 / 1000);

사용 중인 MySQL 버전이 밀리초를 지원하고 결과에서 밀리초 정밀도를 유지하려는 경우 두 번째 매개변수를 사용할 수 있습니다.

SELECT FROM_UNIXTIME(1763251200000 / 1000, '%Y-%m-%d %H:%i:%s.%f');

안에:

2. UNIX_TIMESTAMP로 변환(초)

밀리초 값을 정수로 저장하려는 경우(예:INT또는BIGINT) 필드를 두 번째 수준 타임스탬프로 설정한 경우 간단한 나누기 작업만 필요합니다.

SELECT 1763251200000 / 1000;

또는 데이터가 테이블 필드에 저장된 경우(예: 필드 이름이timestamp_ms):

SELECT timestamp_ms / 1000 AS unix_timestamp_s FROM your_table;

3. DATETIME/TIMESTAMP 필드에 저장

이 값을 다음과 같은 항목에 삽입하면DATETIME또는TIMESTAMP입력란을 입력해야 합니다.VALUES부분적으로 변환을 수행합니다.

INSERT INTO your_table (datetime_column) 
VALUES (FROM_UNIXTIME(1763251200000 / 1000));

4. UTC 시간대 처리

FROM_UNIXTIME()이 함수는 UTC 타임스탬프를 MySQL 서버에 대해 구성된 시간대로 변환합니다. 타임스탬프가 UTC를 기반으로 하고 결과도 UTC가 되도록 하려면 서버 또는 연결 시간대가 올바르게 설정되어 있는지 확인하거나 다음을 사용해야 합니다.CONVERT_TZ함수는 명시적인 시간대 처리를 수행합니다.



FLOAT 형식

FORMAT() 사용

MySQL에서는 다음을 사용합니다.FORMAT()부동 소수점 숫자의 형식을 지정합니다.

형식 선택(123.4567, 2); -- 결과: '123.46'

ROUND() 사용

ROUND()고정된 소수 자릿수로 반올림하는 데 사용됩니다.

SELECT ROUND(123.4567, 2); -- 결과: 123.46

CAST() 또는 CONVERT() 사용

고정된 소수 자릿수를 유지하려면 FLOAT를 DECIMAL로 변환하세요.

SELECT CAST(123.4567 AS DECIMAL(10,2)); -- 결과: 123.46
SELECT 변환(123.4567, 십진수(10,2)); -- 결과: 123.46

데이터 테이블 필드에 적용

SELECT id, FORMAT(price, 2) AS formatted_price FROM products;

형식 필드

데이터 테이블 생성 시 소수점 이하 자릿수를 직접 설정할 수 있습니다.

CREATE TABLE 제품(
  ID INT 기본 키,
  가격 DECIMAL(10,2) -- 소수점 이하 두 자리
);


쿼리 필드 합계

MAX() 사용

필드의 최대값을 가져옵니다.

SELECT MAX(price) AS max_price FROM products;

최소() 사용

필드의 최소값을 가져옵니다.

SELECT MIN(price) AS min_price FROM products;

AVG() 사용

필드의 평균을 계산합니다.

SELECT AVG(price) AS avg_price FROM products;

MAX, MIN, AVG 동시 쿼리

SELECT 
  MAX(price) AS max_price, 
  MIN(price) AS min_price, 
  AVG(price) AS avg_price
FROM products;

카테고리별로 계산

SELECT category, 
       MAX(price) AS max_price, 
       MIN(price) AS min_price, 
       AVG(price) AS avg_price
FROM products
GROUP BY category;

하위 쿼리를 사용하여 최대값 찾기

다른 쿼리 결과의 최대값을 찾습니다.

SELECT MAX(price) FROM (SELECT price FROM products WHERE category = 'electronics') AS subquery;

ORDER BY + LIMIT 사용

정렬 후 최대값을 구합니다.

SELECT price FROM products WHERE category = 'electronics' ORDER BY price DESC LIMIT 1;

WITH(공통 테이블 표현식, CTE) 사용

WITH filtered_products AS (
  SELECT price FROM products WHERE category = 'electronics'
)
SELECT MAX(price) FROM filtered_products;

기하평균 공식

기하 평균 계산 공식:

GM = (x1 * x2 * ... * xn)^(1/n)

EXP() 및 LOG() 사용

SQL에서는 로그 연산을 사용하여 기하 평균을 계산할 수 있습니다.

SELECT EXP(AVG(LOG(price))) AS geometric_mean FROM products WHERE price > 0;

POWER() 사용

사용POWER()n번째 근을 계산합니다.

SELECT POWER(EXP(SUM(LOG(price))), 1 / COUNT(price)) AS geometric_mean 
FROM products WHERE price > 0;

주의할 점

SELECT EXP(AVG(LOG(price))) AS geometric_mean FROM products WHERE price > 0;


SQL은 필드의 표준 편차를 계산합니다.

STDDEV()를 사용하여 표준편차 계산

MySQL/MariaDB에서는 다음을 사용할 수 있습니다.STDDEV()표준편차를 계산합니다.

예:

SELECT STDDEV(salary) AS salary_stddev FROM employees;

상위 표준편차와 표본 표준편차 구별

SQL은 표준 편차를 계산하는 두 가지 방법을 제공합니다.

예:

SELECT 
    STDDEV_POP(salary) AS population_stddev, 
    STDDEV_SAMP(salary) AS sample_stddev
FROM employees;

수동으로 표준편차 계산

SQL 버전이 지원하지 않는 경우STDDEV(), 다음 수식을 사용할 수 있습니다.

SELECT SQRT(
    SUM(POW(salary - (SELECT AVG(salary) FROM employees), 2)) / COUNT(salary)
) AS salary_stddev
FROM employees;

결론적으로



SQL WHERE 절

SQLWHERE절은 테이블에서 추출하는 데 사용됩니다.지정된 조건을 만족하는 레코드 추출(열/행). 필요한 데이터를 정확하게 필터링하는 데 사용되는 DML(데이터 조작 언어)의 가장 기본적이고 중요한 부분 중 하나입니다.


역할과 목적


기본 문법

WHERE조항은 일반적으로 다음과 같습니다FROM조항 이후:

SELECT column_name(s)
FROM table_name
WHERE condition;

또는 정보를 수정하거나 삭제하는 데 사용되는 경우:

UPDATE table_name
SET column1 = value1
WHERE condition;

일반적으로 사용되는 비교 및 ​​논리 연산자

WHERE연산자는 조건을 설정하기 위해 절에서 사용됩니다. 가장 일반적인 것들은 다음과 같습니다:

연산자 유형 연산자 설명하다
비교 연산자 = 동일한
비교 연산자 >, <, >=, <= 보다 큼, 보다 작음, 크거나 같음, 작거나 같음
비교 연산자 <>또는!= 같지 않음
논리 연산자 AND 여러 조건을 동시에 충족
논리 연산자 OR 조건 중 하나라도 만족
논리 연산자 NOT 조건이 충족되지 않음
특수 연산자 BETWEEN 일정 범위 내(경계 포함)
특수 연산자 LIKE 퍼지 일치 문자열 패턴(일치%또는_
특수 연산자 IN 값은 목록의 모든 항목입니다.
특수 연산자 IS NULL / IS NOT NULL 필드 값이 NULL인지 여부

사용 예

라는 이름의 파일이 있다고 가정합니다.Employees테이블을 포함하여EmployeeID, LastName(성),Salary(급여) 그리고Department(부서).

예시 1: 단일 조건

부서가 'Sales'인 모든 직원을 찾습니다.

SELECT EmployeeID, LastName
FROM Employees
WHERE Department = 'Sales';

예 2: 숫자 비교 및 ​​논리 AND

급여가 50,000 이상이고 부서가 'HR'이 아닌 직원을 찾습니다.

SELECT *
FROM Employees
WHERE Salary >= 50000 AND Department != 'HR';

예시 3: BETWEEN 범위

급여가 60,000에서 80,000(포함) 사이인 직원을 찾습니다.

SELECT *
FROM Employees
WHERE Salary BETWEEN 60000 AND 80000;

예 4: IN 나열

'마케팅' 또는 '재무' 부서의 직원을 찾으세요.

SELECT *
FROM Employees
WHERE Department IN ('Marketing', 'Finance');

이는 다음을 사용하는 것과 동일합니다.WHERE Department = 'Marketing' OR Department = 'Finance'



SQL GROUP BY 절

SQLGROUP BY절은 다음과 같은 데 사용됩니다.SELECT명령문에서 동일한 값(또는 여러 필드의 값 조합)이 있는 행은 요약 열로 그룹화됩니다. SQL과 함께 자주 사용됩니다.요약 기능각 그룹의 요약 값을 계산하는 데 함께 사용됩니다.


역할과 목적


기본 문법

GROUP BY조항이 있어야합니다WHERE조항이지만 그 이후에는HAVING그리고ORDER BY조항 전.

SELECT 열 이름(들), 집계_함수(열_to_summarize)
FROM table_name
WHERE Condition_on_rows - (선택 사항) 그룹화하기 전에 단일 행을 필터링합니다.
GROUP BY column_name(s) -- 그룹화에 사용되는 열을 지정합니다.
HAVING Condition_on_groups -- (선택 사항) 그룹화 후 그룹 필터링
ORDER BY 컬럼_이름;

중요한 규칙:에 나타나는 모든 것SELECT목록에는 있지만아니요요약 함수로 둘러싸인 열은 다음과 같습니다.~ 해야 하다에 포함됨GROUP BY조항에.


사용 예

라는 이름의 파일이 있다고 가정합니다.Products테이블을 포함하여Category(제품 카테고리) 및Price(가격).

수요: 각 제품 카테고리의 평균 가격과 제품 수량을 구합니다.

SELECT Category, AVG(Price) AS AveragePrice, COUNT(ProductID) AS TotalProducts
FROM Products
GROUP BY Category;

예시 설명


다중 열 그룹화

여러 필드를 기준으로 그룹화할 수 있습니다. 지정된 모든 필드의 값이 동일한 경우에만 행이 함께 그룹화됩니다.

수요 : 제품 카테고리(Category)와 공급업체(Supplier) 조합별 총 매출을 구합니다.

SELECT Category, Supplier, SUM(SalesAmount) AS TotalSales
FROM SalesRecords
GROUP BY Category, Supplier
ORDER BY Category, Supplier;

그러면 각 행이 고유한 카테고리 + 공급업체 조합의 총 매출을 나타내는 결과가 생성됩니다.


일반적으로 사용되는 요약 함수

기능 기능
COUNT() 그룹의 행 수를 계산합니다.
SUM() 그룹에 있는 숫자 필드의 합계를 계산합니다.
AVG() 그룹에 있는 숫자 필드의 평균을 계산합니다.
MAX() 그룹에 있는 필드의 최대값을 찾습니다.
MIN() 그룹에 있는 필드의 최소값을 찾습니다.


SQL HAVING 절

SQL에서는HAVING절은 그룹(Group) 결과를 필터링하는 데 사용되며 일반적으로 다음과 함께 사용됩니다.GROUP BY절이 함께 사용됩니다.

하지만WHERE절은 단일 열(Rows)의 행을 필터링하는 데 사용되지만 그룹 기반 요약 값이 필요한 경우(예:COUNT(), SUM(), AVG()요약 함수의 결과를 기다려서 그룹을 필터링하는 경우)를 사용해야 합니다.HAVING절.


HAVING과 WHERE의 차이점

특징 WHERE 절 HAVING 절
실행 타이밍 데이터를 그룹화하기(GROUP BY) 전에 원래 행을 필터링합니다. 데이터를 그룹화(GROUP BY)한 후 요약된 그룹을 필터링합니다.
사용 가능한 조건 요약 함수(예: COUNT, SUM, AVG)는 직접 사용할 수 없습니다. 필터 조건을 설정하려면 집계 함수를 사용해야 합니다.
애플리케이션 객체 단일 열 값입니다. 그룹 결과.

기본 문법

SELECT 열_이름(들), 집계_함수(열_이름)
FROM table_name
WHERE Condition_on_rows - (选择性) 过滤单行
GROUP BY 컬럼_이름
HAVING Condition_on_groups -- (必须) 过滤群组
ORDER BY 컬럼_이름;

사용 예

라는 파일이 있다고 가정하자.Orders테이블을 포함하여CustomerID(고객 ID) 및TotalAmount(총 주문 금액). 우리는 모두 알고 싶어평균 주문 금액이 500개를 초과합니다.고객의.

SQL 쿼리

SELECT CustomerID, AVG(TotalAmount) AS AverageOrder
FROM Orders
GROUP BY CustomerID
HAVING AVG(TotalAmount) > 500;

예시 설명


복합 조건 예

총 주문 건수가 **3**이고 평균 주문 금액이 1000** 미만인 모든 고객을 찾고 싶다고 가정해 보겠습니다.

SQL 쿼리

SELECT CustomerID, COUNT(OrderID) AS TotalOrders, AVG(TotalAmount) AS AverageOrder
FROM Orders
GROUP BY CustomerID
HAVING COUNT(OrderID) >= 3 AND AVG(TotalAmount) < 1000;

예시 설명



하위 쿼리를 사용하는 SQL 참조 별칭

문제 설명

존재하다SELECT쿼리에서 정의된 경우expr1 AS field1, 들어갈 수 있나요?expr2에 사용field1

답변: 아니요. SQL 쿼리가 실행되는 순서 때문에 그렇습니다.

SQL의 실행 순서에 따라 별칭이 동일할 수 없음이 결정됩니다.SELECT내부적으로 다시 인용:

SELECT 가격 * 1.1 AS new_price, new_price + 10 AS 최종 가격 FROM 제품; -- 오류

오류 메시지:

Unknown column 'new_price' in 'field list'

해결책

방법 1: 하위 쿼리 사용

하위 쿼리에서 먼저 계산할 수 있습니다.new_price, 외부 쿼리에서 참조됩니다.

SELECT new_price, new_price + 10 AS final_price
FROM (SELECT price * 1.1 AS new_price FROM products) AS subquery;

방법 2: CTE 사용(WITH 문)

SQL이 CTE(공용 테이블 표현식)를 지원하는 경우 사용 가능WITH단순화하려면:

WITH cte AS (
    SELECT price * 1.1 AS new_price FROM products
)
SELECT new_price, new_price + 10 AS final_price FROM cte;

방법 3: 표현식 반복

단순한 연산이라면 직접 계산을 반복할 수도 있습니다(그러나 가독성이 좋지 않아 권장하지 않습니다).

SELECT price * 1.1 AS new_price, price * 1.1 + 10 AS final_price FROM products;

결론적으로



JOIN

가입 소개

JOIN은 여러 데이터 테이블의 관련 데이터를 병합하고 특정 필드(일반적으로 외래 키)를 기반으로 관계를 설정하는 데 사용됩니다.

INNER JOIN

두 데이터 테이블의 조건을 만족하는 데이터만 반환됩니다.

SELECT orders.order_id, customers.name
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;

LEFT JOIN

왼쪽 테이블의 모든 데이터를 반환합니다. 오른쪽 테이블에 해당 데이터가 없으면 표시됩니다.NULL

SELECT customers.name, orders.order_id
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id;

RIGHT JOIN

오른쪽 테이블의 모든 데이터를 반환합니다. 왼쪽 테이블에 해당 데이터가 없으면 표시됩니다.NULL

SELECT customers.name, orders.order_id
FROM orders
RIGHT JOIN customers ON orders.customer_id = customers.customer_id;

FULL JOIN

왼쪽 및 오른쪽 테이블의 모든 데이터를 반환하고, 일치하는 항목이 없으면 표시합니다.NULL

MySQL은 FULL JOIN을 지원하지 않습니다.LEFT JOIN그리고RIGHT JOIN조합 시뮬레이션.

SELECT customers.name, orders.order_id
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id
UNION
SELECT customers.name, orders.order_id
FROM customers
RIGHT JOIN orders ON customers.customer_id = orders.customer_id;

CROSS JOIN

두 테이블의 가능한 모든 조합(데카르트 곱)을 반환합니다.

SELECT customers.name, products.product_name
FROM customers
CROSS JOIN products;

SELF JOIN

직원 상사 관계와 같은 동일한 테이블 내의 연관에 사용됩니다.

SELECT A.name AS employee, B.name AS manager
FROM employees A
JOIN employees B ON A.manager_id = B.employee_id;


.sql 실행 시 다른 .sql 포함

SOURCE 또는 \i 지시문을 사용하세요.

MySQL 또는 MariaDB

`SOURCE` 지시문을 사용하여 MySQL 또는 MariaDB 스크립트에 다른 `.sql` 파일을 포함할 수 있습니다.
-- abc.sql
SOURCE other_file.sql;
SOURCE another_file.sql;

PostgreSQL (psql)

PostgreSQL에서는 `\i` 지시문을 사용하여 다른 `.sql` 파일을 포함할 수 있습니다.
-- abc.sql
\i other_file.sql
\i another_file.sql

배치 스크립트를 사용하여 실행

SQL 클라이언트가 직접 파일 포함을 지원하지 않는 경우 배치 스크립트를 사용하여 여러 `.sql` 파일을 순차적으로 실행할 수 있습니다.

Linux 셸 예

#!/bin/bash
mysql -u user -p database_name < abc.sql
mysql -u user -p database_name < other_file.sql

고급 방법: SQL 파일 전처리

SQL 클라이언트가 파일 포함을 직접 지원하지 않는 경우 기본 SQL 파일을 실행하기 전에 참조된 `.sql` 파일과 병합할 수 있습니다.

쉘 스크립트를 사용하여 파일 병합

cat abc.sql other_file.sql another_file.sql > combined.sql
mysql -u user -p database_name < combined.sql

주의할 점

1. **실행 순서**: 데이터 테이블이나 함수와의 종속성 문제를 방지하려면 포함된 파일이 올바른 순서로 실행되는지 확인하세요. 2. **라이브러리별 구문**: 다양한 라이브러리의 명령 구문이 다를 수 있습니다. 해당 설명서를 참조하세요. 3. **파일 경로**: '.sql' 파일을 참조하려면 절대 또는 상대 경로를 올바르게 사용하세요. 4. **액세스 권한**: SQL 클라이언트에 포함된 파일을 읽을 수 있는 권한이 있는지 확인합니다.

요약

위의 방법을 통해 SQL 스크립트를 모듈화하여 쉽게 관리하고 재사용할 수 있습니다.

다른 .sql 파일을 포함할 때 매개변수 전달

MySQL과 마리아DB

MySQL 및 MariaDB는 `SOURCE` 지시문에 매개변수 전달을 직접 지원하지 않지만 포함된 .sql 파일과 함께 변수를 사용할 수 있습니다. 방법은 다음과 같습니다.

변수를 사용하여 매개변수 전달

1. 기본 SQL 파일에서 변수를 설정합니다.
   SET @param1 = 'value1';
   SOURCE other_file.sql;
   
2. `other_file.sql`의 참조 변수:
   SELECT * FROM table WHERE column = @param1;
   

PostgreSQL (psql)

PostgreSQL은 `\set` 명령을 통해 변수를 설정하고 이를 다른 파일에 전달하는 것을 지원합니다.

변수를 사용하여 매개변수 전달

1. 기본 SQL 파일에서 변수를 설정합니다.
   \set param1 'value1'
   \i other_file.sql
   
2. `other_file.sql`에서 변수를 사용합니다.
   SELECT * FROM table WHERE column = :'param1';
   

명령줄 도구를 사용하여 매개변수 전달

명령줄을 통해 실행할 때 SQL 파일에 매개변수를 전달하는 것이 일반적인 방법입니다.

MySQL 명령줄 예

1. `sed` 또는 기타 도구를 사용하여 실행 시 매개변수를 교체합니다.
   sed "s/{param1}/value1/g" abc.sql | mysql -u user -p database_name
   
2. SQL 파일에서 `{param1}` 자리 표시자를 사용하고 명령줄 도구로 대체합니다.

PostgreSQL 명령줄 예

1. `psql` 명령에서 직접 매개변수를 설정합니다.
   psql -d database_name -v param1=value1 -f abc.sql
   
2. `:'param1'`을 사용하여 SQL 파일의 변수를 나타냅니다.

코드를 사용하여 SQL 생성

Python 또는 Bash와 같은 프로그래밍 언어를 통해 SQL을 동적으로 생성하는 것도 또 다른 솔루션입니다. 1. 프로그램의 매개변수가 포함된 SQL 파일을 동적으로 구성합니다. 2. 생성된 SQL 파일을 실행합니다.

주의할 점

1. **보안**: 사용자가 입력한 매개변수를 SQL에 직접 삽입하지 말고 SQL 삽입 위험을 고려하세요. 2. **환경 변수**: 일부 도구는 환경 변수를 사용하여 매개변수로 전달하는 것을 지원합니다.

요약

SQL 파일의 매개변수 전달이 항상 직접 지원되는 것은 아니지만 도구 및 데이터베이스의 특성에 따라 유연성을 갖고 변수, 명령줄 도구 또는 프로그래밍 언어를 통해 전달할 수 있습니다.

저장 프로시저

저장 프로시저(미리 저장된 루틴) 소개

저장 프로시저(저장 루틴 또는 저장 프로시저)는 미리 컴파일되어 데이터베이스에 저장되고 효율성을 향상시키고 코드 중복을 줄이기 위해 호출을 통해 실행할 수 있는 SQL 문 집합입니다.

저장 프로시저 만들기

DELIMITER //
CREATE PROCEDURE GetAllProducts()
BEGIN
  SELECT * FROM products;
END //
DELIMITER ;

저장 프로시저 호출

CALL GetAllProducts();

매개변수가 있는 저장 프로시저

입력 매개변수

특정 카테고리의 제품 검색:

DELIMITER //
CREATE PROCEDURE GetProductsByCategory(IN category_name VARCHAR(50))
BEGIN
  SELECT * FROM products WHERE category = category_name;
END //
DELIMITER ;

부르다:

CALL GetProductsByCategory('electronics');

출력 매개변수

카테고리의 총 항목 수를 계산합니다.

DELIMITER //
CREATE PROCEDURE GetProductCountByCategory(IN category_name VARCHAR(50), OUT total_count INT)
BEGIN
  SELECT COUNT(*) INTO total_count FROM products WHERE category = category_name;
END //
DELIMITER ;

부르다:

CALL GetProductCountByCategory('electronics', @count);
SELECT @count;

프로그램에서 사용할 변수 저장

DELIMITER //
CREATE PROCEDURE CalculateTotalRevenue()
BEGIN
  DECLARE total DECIMAL(10,2);
  SELECT SUM(price) INTO total FROM sales;
  SELECT total AS total_revenue;
END //
DELIMITER ;

부르다:

CALL CalculateTotalRevenue();

저장 프로시저에서 조건부 제어 사용

IF 조건

DELIMITER //
CREATE PROCEDURE CheckStock(IN product_id INT, OUT stock_status VARCHAR(20))
BEGIN
  DECLARE stock INT;
  SELECT quantity INTO stock FROM inventory WHERE id = product_id;

  IF stock > 10 THEN
    SET stock_status = 'In Stock';
  ELSEIF stock > 0 THEN
    SET stock_status = 'Low Stock';
  ELSE
    SET stock_status = 'Out of Stock';
  END IF;
END //
DELIMITER ;

부르다:

CALL CheckStock(1, @status);
SELECT @status;

저장된 프로그램 내에서 LOOP 사용

DELIMITER //
CREATE PROCEDURE CountDown(IN start_num INT)
BEGIN
  DECLARE i INT;
  SET i = start_num;

  loop_label: LOOP
    IF i <= 0 THEN
      LEAVE loop_label;
    END IF;
    SELECT i;
    SET i = i - 1;
  END LOOP;
END //
DELIMITER ;

부르다:

CALL CountDown(5);

저장된 프로그램 삭제

DROP PROCEDURE IF EXISTS GetAllProducts;

결론적으로



저장 프로시저의 매개변수 기본값

MySQL/MariaDB는 매개변수의 기본값을 직접 설정하는 것을 지원하지 않습니다.

MySQL 및 MariaDB에서는 SQL Server 또는 PostgreSQL과 달리 저장 프로시저 매개변수를 기본값으로 직접 설정할 수 없습니다. 그러나 다음을 사용할 수 있습니다.IF사전 설정된 값을 시뮬레이션하는 조건문입니다.

방법 1: IF 조건을 사용하여 기본값 설정

쿼리하고 싶다고 가정 해 보겠습니다.users테이블, 매개변수인 경우user_id제공되지 않은 경우 기본 쿼리 ID는 1입니다.

구분 기호 //
프로시저 생성 GetUserById(IN user_id INT)
시작
    user_id가 NULL인 경우
        SET 사용자_ID = 1; --기본값
    종료하면;

    SELECT * FROM 사용자 WHERE id = user_id;
끝 //
구분 기호;

실행방법

GetUserById(NULL) 호출; -- ID = 1을 쿼리합니다.
GetUserById(5)를 호출합니다. -- 쿼리 ID = 5

방법 2: COALESCE()를 사용하여 기본값 설정

COALESCE()매개변수가 NULL인 경우 지정된 기본값을 반환합니다.

DELIMITER //
CREATE PROCEDURE GetUserById(IN user_id INT)
BEGIN
    SELECT * FROM users WHERE id = COALESCE(user_id, 1);
END //
DELIMITER ;

실행방법

GetUserById(NULL) 호출; -- 기본값은 1입니다.
GetUserById(10)를 호출합니다. -- 쿼리 ID = 10

방법 3: 선택적 매개변수 사용(해결 방법)

매개 변수를 선택 사항으로 지정하려면 여러 저장 프로시저를 만들 수 있습니다. 예를 들어:

DELIMITER //
CREATE PROCEDURE GetAllUsers()
BEGIN
    SELECT * FROM users;
END //

CREATE PROCEDURE GetUserById(IN user_id INT)
BEGIN
    SELECT * FROM users WHERE id = user_id;
END //
DELIMITER ;

실행방법

GetAllUsers() 호출; -- 매개변수 없음, 모두 쿼리
GetUserById(3)를 호출합니다. -- 쿼리 ID = 3

결론적으로



저장 프로시저의 반환 값

방법 1: OUT 매개변수를 사용하여 값 반환

MySQL/MariaDB의 저장 프로시저는 지원되지 않습니다.RETURN쿼리 결과를 반환하지만 사용할 수 있습니다.OUT매개변수는 값을 다시 전달합니다.

DELIMITER //
CREATE PROCEDURE GetUserCount(OUT user_count INT)
BEGIN
    SELECT COUNT(*) INTO user_count FROM users;
END //
DELIMITER ;

저장 프로시저를 호출하고 반환 값을 가져옵니다.

CALL GetUserCount(@total);
@전체 선택; -- 사용자 수 표시

방법 2: SELECT를 사용하여 결과 집합 반환

쿼리 결과를 직접 반환하려면SELECT그게 다야 :

DELIMITER //
CREATE PROCEDURE GetUserById(IN user_id INT)
BEGIN
    SELECT * FROM users WHERE id = user_id;
END //
DELIMITER ;

저장 프로시저 호출

GetUserById(5)를 호출합니다. -- ID 5를 가진 사용자를 쿼리합니다.

방법 3: RETURN을 사용하여 단일 값 반환

MySQL은 지원하지만RETURN, 그러나 일반적으로 프로세스를 제어하는 ​​데 사용되는 단일 값만 반환할 수 있습니다.

구분 기호 //
절차 만들기 GetMaxSalary()
시작
    DECLARE max_salary DECIMAL(10,2);
    SELECT MAX(급여) INTO max_salary FROM 직원;
    RETURN max_salary; -- 하지만 이는 MySQL에서 직접 값을 반환하지 않습니다.
끝 //
구분 기호;

MySQL은 직접적으로CALLRETURN 값을 얻으려면 OUT 매개변수를 사용하는 것이 좋습니다.

DELIMITER //
CREATE PROCEDURE GetMaxSalary(OUT max_salary DECIMAL(10,2))
BEGIN
    SELECT MAX(salary) INTO max_salary FROM employees;
END //
DELIMITER ;
전화 GetMaxSalary(@max);
@최대 선택; -- 최대 급여 표시

방법 4: 여러 값 반환

여러 개 사용OUT매개변수는 다양한 계산 결과를 반환합니다.

DELIMITER //
CREATE PROCEDURE GetUserStats(OUT total_users INT, OUT avg_age DECIMAL(5,2))
BEGIN
    SELECT COUNT(*) INTO total_users FROM users;
    SELECT AVG(age) INTO avg_age FROM users;
END //
DELIMITER ;

저장 프로시저를 호출하고 여러 반환 값을 얻습니다.

CALL GetUserStats(@total, @avg);
SELECT @전체, @avg; -- 총 사용자 수와 평균 연령 표시

결론적으로



CALL 저장 프로시저 외부에서 반환 값 사용

방법 1: OUT 매개변수를 사용하여 변수에 저장

MySQL 저장 프로시저는 다음을 통해 액세스할 수 있습니다.OUT매개변수는 CALL 외부에서 사용할 수 있는 값을 반환합니다.SELECT이 값을 가져옵니다.

저장 프로시저 만들기

DELIMITER //
CREATE PROCEDURE GetTotalUsers(OUT total_users INT)
BEGIN
    SELECT COUNT(*) INTO total_users FROM users;
END //
DELIMITER ;

저장 프로시저를 호출하고 반환 값을 사용하십시오.

GetTotalUsers(@total) 호출;
@total AS UserCount를 선택합니다. -- CALL 외부에서 반환 값을 사용합니다.

방법 2: 변수를 사용하여 반환된 쿼리 결과 저장

저장 프로시저를 사용하는 경우SELECT반환된 결과는 변수에 직접 저장할 수 없지만 사용할 수는 있습니다.INSERT INTO ... SELECT

저장 프로시저 만들기

DELIMITER //
CREATE PROCEDURE GetMaxSalary()
BEGIN
    SELECT MAX(salary) AS max_salary FROM employees;
END //
DELIMITER ;

변수를 사용하여 쿼리 결과에 액세스

임시 테이블 생성 temp_result (max_salary DECIMAL(10,2));

INSERT INTO temp_result EXECUTE GetMaxSalary();

temp_result에서 max_salary를 선택하세요. -- CALL 외부에서 사용됨

방법 3: 준비된 문을 사용하여 결과에 동적으로 액세스

저장 프로시저에서 생성된 결과를 변수에서 액세스해야 하는 경우 다음을 사용할 수 있습니다.PREPARE그리고EXECUTE

저장 프로시저 만들기

DELIMITER //
CREATE PROCEDURE GetUserById(IN user_id INT)
BEGIN
    SELECT name FROM users WHERE id = user_id;
END //
DELIMITER ;

변수 호출 및 저장

SET @sql = 'CALL GetUserById(5)';
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

결론적으로



MySQL 함수 콜백

문제 설명

MySQL/MariaDB에서는 Stored Function(함수)를 반환할 수 없습니다.SELECT결과가 설정됩니다. 그렇지 않으면 오류가 발생합니다.

ERROR 1415 (0A000): Not allowed to return a result set from a function

해결책

방법 1: 대신 저장 프로시저 사용

함수는 결과 집합을 반환할 수 없지만 저장 프로시저는 가능합니다.

잘못된 기능:

구분 기호 //
함수 만들기 GetUsers()
반품표
시작
    RETURN (SELECT * FROM 사용자); -- 이는 허용되지 않습니다.
끝 //
구분 기호;

올바른 저장 프로시저:

DELIMITER //
CREATE PROCEDURE GetUsers()
BEGIN
    SELECT * FROM users;
END //
DELIMITER ;

저장 프로시저 호출:

CALL GetUsers();

방법 2: 함수를 사용하여 단일 값 반환

단일 값(예: 개수 또는 최대값)만 반환해야 하는 경우 다음을 사용할 수 있습니다.RETURN

DELIMITER //
CREATE FUNCTION GetUserCount()
RETURNS INT DETERMINISTIC
BEGIN
    DECLARE total INT;
    SELECT COUNT(*) INTO total FROM users;
    RETURN total;
END //
DELIMITER ;

사용 기능:

SELECT GetUserCount();

방법 3: 임시 테이블 사용

함수 내에서 여러 행의 결과를 반환해야 하는 경우 함수가 임시 테이블에 데이터를 삽입한 다음 외부에서 쿼리하도록 할 수 있습니다.

DELIMITER //
CREATE FUNCTION PopulateTempUsers()
RETURNS INT DETERMINISTIC
BEGIN
    CREATE TEMPORARY TABLE IF NOT EXISTS temp_users AS (SELECT * FROM users);
    RETURN 1;
END //
DELIMITER ;

임시 테이블을 사용하여 데이터를 읽습니다.

SELECT PopulateTempUsers();
SELECT * FROM temp_users;

결론적으로



HeidiSQL

소개

HeidiSQL은 MySQL, MariaDB, PostgreSQL 및 MS SQL Server를 지원하는 무료 오픈 소스 SQL 클라이언트입니다. 데이터베이스 관리, SQL 쿼리 실행, 데이터 가져오기/내보내기 등을 위한 GUI를 제공합니다.

주요 기능

다운로드 및 설치

1. HeidiSQL을 다운로드하려면 공식 웹사이트로 이동하세요.https://www.heidisql.com/download.php2. 설치 프로그램을 실행하고 안내에 따라 설치를 완료하세요.
3. HeidiSQL을 열고 새 연결을 설정합니다.

MySQL/MariaDB에 연결

1. HeidiSQL을 시작합니다.
2. "추가"를 클릭하여 새 연결을 만듭니다.
3. 설정:
   - 호스트 이름/IP: 127.0.0.1 또는 원격 서버 IP
   - 사용자 이름: 루트 또는 다른 사용자
   - 비밀번호 : 해당 비밀번호
   - 포트: 3306(MySQL/MariaDB)
4. "열기"를 클릭하여 데이터베이스에 연결하세요.

SQL 쿼리 실행

HeidiSQL 쿼리 창에 SQL 문을 입력합니다.

SELECT * FROM users WHERE status = 'active';

결과를 보려면 "실행" 버튼을 클릭하세요.

데이터 가져오기/내보내기

SQL 내보내기

1. 데이터베이스를 마우스 오른쪽 버튼으로 클릭하고 → "SQL 내보내기"를 선택합니다.
2. 내보낼 데이터 테이블을 선택하세요
3. 내보내기 형식(.sql, .csv, .json) 설정
4. "내보내기"를 클릭하세요

SQL 가져오기

1. HeidiSQL을 열고 대상 데이터베이스를 선택합니다.
2. "도구" → "SQL 파일 실행"을 클릭하세요.
3. .sql 파일을 선택하고 실행합니다.

사용자 권한 관리

1. "도구" → "사용자 권한 관리"로 들어갑니다.
2. 관리할 사용자를 선택하세요
3. 데이터베이스 권한 설정(SELECT, INSERT, UPDATE, DELETE 등)
4. '저장'을 클릭하세요.

결론적으로



HeidiSQL은 새로운 저장 프로시저를 추가합니다.

1단계: 데이터베이스에 연결

1. HeidiSQL을 시작합니다.
2. MySQL 또는 MariaDB 서버에 연결합니다.
3. 왼쪽의 데이터베이스 목록에서 대상 데이터베이스를 선택합니다.

2단계: 새 저장 프로시저 만들기

1. 왼쪽의 데이터베이스 이름을 마우스 오른쪽 버튼으로 클릭하고 "새로 만들기" → "프로그램 저장"을 선택합니다.
2. HeidiSQL은 새로운 SQL 편집 창을 열고 기본 저장 프로시저 템플릿을 제공합니다.

3단계: 저장 프로시저 작성

다음은 사용자 테이블의 모든 데이터를 반환하는 간단한 예입니다.

DELIMITER //
CREATE PROCEDURE GetAllUsers()
BEGIN
    SELECT * FROM users;
END //
DELIMITER ;

4단계: 저장 프로시저 실행

1. "이동" 버튼(녹색 번개 모양)을 클릭하세요.
2. 실행이 성공하면 왼쪽의 "프로그램 저장" 열에서 해당 프로그램을 확인할 수 있습니다.

5단계: 저장 프로시저 테스트

CALL GetAllUsers();

고급: 매개변수가 있는 저장 프로시저

사용자 ID를 기반으로 한 쿼리와 같이 데이터를 필터링하려면 매개변수를 전달합니다.

DELIMITER //
CREATE PROCEDURE GetUserById(IN user_id INT)
BEGIN
    SELECT * FROM users WHERE id = user_id;
END //
DELIMITER ;

매개변수를 사용하여 저장 프로시저를 호출합니다.

CALL GetUserById(1);

저장된 프로그램 삭제

DROP PROCEDURE IF EXISTS GetAllUsers;

결론적으로



데이터베이스 애플리케이션 개발 솔루션

오늘날의 소프트웨어 개발 환경에서 데이터베이스 애플리케이션은 단순한 데이터 저장에서 AI, 엣지 컴퓨팅, 자동화된 운영 및 유지 관리를 통합하는 포괄적인 솔루션으로 발전했습니다. 다음은 현재 주류 개발 모델입니다.


AI 통합 및 RAG 아키텍처 솔루션

LLM(대형 언어 모델)의 인기로 인해 RAG(검색 증강 생성)가 개발 표준이 되었습니다. 이 유형의 솔루션은 구조화되지 않은 데이터의 벡터화 및 검색에 중점을 둡니다.

서버리스 및 클라우드 네이티브 솔루션

운영 및 유지 관리를 단순화하고 시작 비용을 줄이기 위해 개발자는 특히 웹 애플리케이션에서 널리 사용되는 자동 확장 기능이 있는 데이터베이스 서비스를 선택하는 경향이 있습니다.

풀엔드형 안전 개발 솔루션

TypeScript 생태계에서는 데이터베이스 정의를 프런트엔드 유형과 동기화하는 것이 시스템 안정성을 보장하는 데 중요합니다.

분산 및 엣지 데이터베이스 솔루션

글로벌 액세스에 대처하고 지연 시간을 줄이기 위해 데이터를 사용자 가까이에 배치하는 것이 추세가 되었습니다.


개발계획 비교표

계획 카테고리 기술을 대표하다 핵심 장점
AI 우선 pgvector, Milvus 의미 검색 및 지식 기반 구축 지원
서버리스 유형 Supabase, Vercel Postgres 부담 없는 운영 및 유지관리, 수량에 따른 과금
효율적인 개발 유형 Drizzle ORM, Prisma 매우 높은 유형 안전성 및 개발 속도
분산형 아키텍처 CockroachDB, TiDB 지역 간 배포, 자동 내결함성


데이터베이스 애플리케이션 프런트엔드 인터페이스

최신 데이터베이스 애플리케이션 개발에서 프런트 엔드는 더 이상 데이터를 표시하는 것뿐만 아니라 백엔드 데이터베이스와의 유형 동기화, 상태 관리 및 서버 측 렌더링 성능도 강조합니다. 현재 주류 선택은 다음과 같습니다.


React 생태계와 메타 프레임워크

이는 현재 가장 높은 시장 점유율과 가장 풍부한 커뮤니티 지원을 제공하는 솔루션이며 특히 복잡한 데이터베이스 관리 시스템에 적합합니다.

Vue 생태계 솔루션

간단한 학습 곡선과 고도로 통합된 도구 체인으로 잘 알려져 있으며 중견 기업과 대기업의 백엔드 관리 시스템에서 깊은 사랑을 받고 있습니다.

유형 안전 및 UI 구성 요소 도구

개발 효율성을 높이고 데이터 전송 오류를 줄이기 위해 최신 프런트 엔드는 다음 도구에 크게 의존합니다.

로우 코드 및 사내 도구 개발

기업 내에서 사용되는 데이터베이스 관리 인터페이스의 경우 개발자는 더 빠른 통합 솔루션을 선택하는 경우가 많습니다.


프런트엔드 솔루션 선택 비교표

구성표 이름 적용 가능한 시나리오 핵심 장점
Next.js + Tailwind SaaS 제품, 최신 웹 애플리케이션 SEO 친화적, 최고의 성능 최적화
Vue + Element Plus 기업 내부 백엔드 및 관리 시스템 풍부한 구성 요소와 매우 빠른 개발
TanStack Query 데이터 업데이트 빈도가 높은 애플리케이션 강력한 캐시 관리 및 자동 동기화
Retool 비상 내부 유지 관리 도구 드래그 앤 드롭으로 CSS를 작성할 필요가 거의 없음


데이터베이스 웹 UI

최신 데이터베이스 웹 관리 도구를 사용하면 팀은 데스크톱 소프트웨어를 설치할 필요 없이 브라우저를 통해 직접 데이터에 액세스할 수 있습니다. 다음은 기능적 위치에 따라 네 가지 범주로 나뉩니다.


1. 범용 관리 도구

이 유형의 도구는 여러 데이터베이스 연결(예: MySQL, PostgreSQL, SQL Server)을 지원하며 다양한 환경을 관리하는 개발자에게 적합합니다.

2. 데이터베이스별 관리 인터페이스

원 제조사나 커뮤니티에 의해 특정 데이터베이스에 맞게 심층적으로 최적화된 UI입니다.

3. 로우코드 및 스프레드시트 인터페이스

데이터베이스를 Excel과 유사한 직관적인 인터페이스로 변환하여 기술 담당자가 아니거나 내부 백엔드를 빠르게 구축하는 데 적합합니다.

4. 클라우드 플랫폼 기본 인터페이스

데이터가 클라우드 서비스 제공업체에서 호스팅되는 경우 기본 웹 콘솔은 일반적으로 가장 높은 수준의 통합을 갖습니다.



CloudBeaver

CloudBeaver는 DBeaver 팀이 개발한 오픈 소스 웹 기반 데이터베이스 관리 솔루션입니다. Java 백엔드와 React 프론트엔드 아키텍처를 사용하여 사용자가 브라우저를 통해 다양한 데이터베이스를 안전하게 관리할 수 있도록 하며, 이는 원격 액세스나 팀 협업이 필요한 시나리오에 매우 적합합니다.


핵심 기능적 특징

Community Edition과 Enterprise Edition의 차이점

CloudBeaver는 오픈 소스 Community Edition(Community)과 상용 Enterprise Edition(Enterprise)을 제공합니다. 주요 차이점은 고급 기능 지원에 있습니다.

특징 지역 사회 기업 (Enterprise)
SQL 데이터베이스 지원 대부분의 주류 SQL을 지원합니다. NoSQL(MongoDB, Redis) 포함
클라우드 서비스 통합 기본 배선 AWS, GCP, Azure 리소스 검색에 대한 기본 지원
입증 계정 비밀번호 SSO, SAML, LDAP, Kerberos 지원
고급 도구 기본 쿼리 AI 도우미(SQL 생성), 시각적 쿼리 빌더

적용 가능한 시나리오

CloudBeaver 설치 방법:

CloudBeaver에 가장 권장되는 설치 방법은 Docker를 사용하는 것입니다. 이미 필요한 모든 Java 환경과 드라이버가 패키지되어 있기 때문입니다. 세 가지 주요 배포 경로가 있습니다.


1. Docker를 사용하여 빠르게 시작

이는 가장 간단한 방법으로, 한 줄의 지침을 실행하여 서비스를 시작하면 됩니다. 기본적으로 포트 8978에서 수신 대기합니다.

docker run --name cloudbeaver -d -p 8978:8978 dbeaver/cloudbeaver:latest

실행 후 브라우저 입력 열기http://localhost:8978설정 마법사에 들어갈 수 있습니다.

2. Docker Compose 사용(프로덕션 환경에 권장)

컨테이너가 다시 시작된 후에도 설정이 손실되지 않도록 Compose 파일을 통해 데이터 지속성을 쉽게 관리할 수 있습니다.


version: '3'
services:
  cloudbeaver:
    image: dbeaver/cloudbeaver:latest
    container_name: cloudbeaver
    restart: unless-stopped
    ports:
      - "8978:8978"
    volumes:
      - ./cloudbeaver-data:/opt/cloudbeaver/workspace

위 내용을 다음과 같이 저장하세요.docker-compose.yml, 그런 다음 실행docker-compose up -d

3. 독립형 실행파일 설치(Standalone)

환경에서 Docker를 사용할 수 없는 경우 컴파일된 바이너리 파일을 다운로드하여 수동으로 설치할 수 있습니다.

설치 후 초기 설정

처음 웹 인터페이스에 들어가면 시스템이 다음 구성을 안내합니다.




email: [email protected]
T:0000
資訊與搜尋 | 回dev首頁
email: Yan Sa [email protected] Line: 阿央
電話: 02-27566655 ,03-5924828
阿央
泱泱科技
捷昱科技泱泱企業