2번째 줄: | 2번째 줄: | ||
{{:SELECT 기본 구문 작성 순서}} | {{:SELECT 기본 구문 작성 순서}} | ||
{{:GROUP BY 절}} | |||
=== [[WITH 절]] === | === [[WITH 절]] === | ||
=== [[SQL 조인]] === | === [[SQL 조인]] === |
2025년 5월 14일 (수) 00:57 판
데이터 베이스 기본 용어
- 데이터베이스 (Database, DB)
- 데이터를 체계적으로 저장하고 관리하는 시스템
- 단순히 정보를 모아놓는 것 이상으로, 효율적인 검색, 수정, 삭제 등이 가능
- 데이터 (Data)
- 현실 세계의 사실이나 값을 기록한 것
- 예를 들어, 고객의 이름, 주문 번호, 제품 가격 등이 데이터가 될 수 있음.
- 스키마 (Schema)
- 데이터베이스의 전체적인 구조와 제약 조건을 정의한 것을 말함
- 예를 들어, 건물을 짓기 전 설계도면과 같다고 생각하면 됨
- SQL (질의어)
- Structured Query Language,SQL은 데이터베이스에서 데이터를 관리하거나 조작하기 위해 설계된 표준 프로그래밍 언어
- QUERY(쿼리 - Query,SQL,질의어는 같은 의미를 가진다.)
- SQL 문장에서 데이터를 조회하는 명령어를 Query 라 함.
- 데이터를 검색(SELECT), 삽입(INSERT), 수정(UPDATE), 삭제(DELETE)하는 등의 작업을 할 때 사용
질의 > 학생들(STUDENTS) 에서 나이가 18보다 큰 학생의 이름과 ,나이를 조회 SQL > SELECT name, age FROM STUDENTS WHERE age > 18;
- TABLE (테이블)
- 데이터를 정리하고 표시하기 위한 행(row)과 열(column)로 구성된 구조, 표 처럼 행과 열로 구성되어 있음
- 엑셀 스프레드시트와 비슷하다고 생각하면 돰
=================== | Name | Age | City | =================== | Alice | 24 | New York | --------------------------------- | Bob | 30 | Chicago | ---------------------------------
- 테이블 생성 예시
CREATE TABLE students ( id INT PRIMARY KEY, name VARCHAR(100), age INT, city VARCHAR(100) );
- COLUMN (컬럼(열))
- 컬럼은 세로 줄, 열을 의미, 엑셀에서 세로줄과 유사
- Column/Field/Attribute 이라고 함
- 테이블에서 특정 종류의 데이터를 담고 있는 세로줄
- 예를 들어, '고객 이름', '주소', '전화번호' 등이 열이 됨
- 데이터값을 조회 하기위한 타이틀
=================== | Name | Age | City | ===================
- ROW (로우(행))
- 로우는 줄,행을 의미, 엑셀에서 가로줄과 유사 , 주로 1개의 줄을 레코드라고 한다.
- Row/Record/Tuple 라고 한다.
- 데이터의 값이 저장되어 있다.
| Alice | 24 | New York | --------------------------------- | Bob | 30 | Chicago |
- INDEX (인덱스)
- 데이터를 빠르게 검색하기 위해 사용하는 특별한 데이터 구조, 책에 있는 목차(INDEX) 와 유사
- VIEW (뷰)
- 데이터베이스에서는 가상 테이블을 의미, 테이블에 있는 일부 속성(컬럼)을 사용하고 할때 사용
- 기본 키 (Primary Key, PK): 테이블에서 각 행을 고유하게 식별할 수 있는 하나 이상의 열(또는 열들의 집합)이에요. 주민등록번호처럼 각 행을 유일하게 구분하는 역할을 해요.
- 외래 키 (Foreign Key, FK): 다른 테이블의 기본 키를 참조하는 열이에요. 여러 테이블 간의 관계를 설정하는 데 사용돼요. 예를 들어, 주문 테이블에 고객 테이블의 고객 ID가 외래 키로 있을 수 있어요.
- SELECT: 데이터베이스에서 데이터를 조회할 때 사용하는 SQL 명령문이에요.
- INSERT: 데이터베이스에 새로운 데이터를 추가할 때 사용하는 SQL 명령문이에요.
- UPDATE: 데이터베이스에 저장된 기존 데이터를 수정할 때 사용하는 SQL 명령문이에요.
- DELETE: 데이터베이스에 저장된 데이터를 삭제할 때 사용하는 SQL 명령문이에요.
- 트랜잭션 (Transaction): 데이터베이스의 상태를 변경시키는 논리적인 작업 단위예요. 모든 작업이 성공적으로 완료되거나, 아니면 모든 작업이 취소되어 원래 상태로 돌아가는 '원자성'을 가져요. (예: 은행 계좌 이체)
- 커밋 (Commit): 트랜잭션의 모든 변경 사항을 데이터베이스에 영구적으로 반영하는 명령이에요.
- 롤백 (Rollback): 트랜잭션 도중 오류가 발생하거나 취소하고 싶을 때, 변경 사항을 모두 취소하고 이전 상태로 되돌리는 명령이에요.
- 인덱스 (Index): 데이터베이스 테이블에서 원하는 데이터를 빠르게 찾을 수 있도록 돕는 구조예요. 책의 찾아보기와 비슷하다고 생각하시면 돼요. 인덱스가 없으면 데이터를 찾기 위해 모든 데이터를 스캔해야 할 수 있어요.
- 백업 (Backup): 데이터 손실에 대비하여 데이터베이스의 데이터를 복사해 두는 작업이에요.
- 복구 (Recovery): 손상된 데이터베이스를 백업된 데이터를 이용하여 이전 상태로 되돌리는 작업이에요.
데이터베이스 시스템 관련 용어
- DBMS (Database Management System): 데이터베이스를 관리하고 운영하는 소프트웨어 시스템이에요. Oracle, MySQL, SQL Server, PostgreSQL 등이 대표적인 DBMS예요.
- 서버 (Server): 데이터베이스를 저장하고 쿼리 요청을 처리하는 컴퓨터 또는 프로그램이에요.
- 클라이언트 (Client): 서버에 접속하여 데이터베이스를 이용하는 사용자 프로그램이나 응용 프로그램이에요.
이 외에도 업무에 따라 더 전문적인 용어들이 있겠지만, 위에 설명해 드린 용어들은 데이터베이스를 이용한 업무를 할 때 가장 기본적이고 핵심적인 개념들이니 알아두시면 많은 도움이 될 거예요.
현업에서 사용하는 업무 용어
모델링
- 데이터베이스에서 사용하는 테이블과 컬럼을 설계 하는 업무
- 주로 논리 모델은 모델링 단계를 의미하고 물리모델은 데이터베이스에 적용하는 단계를 의미함
Entity(엔터티)
- 주로 논리모델링에서 사용하는 용어로 속성을 포함하고 있는 객체를 의미함.
- 물리모델에서는 엔터티를 테이블이라 함.
ERD
- Entity Relationship Diagram
엔터티의 관계를 다이어그램으로 나타낸 도표
DW(데이터웨어하우스)
- 현업 업무는 실시간 업무를 처리 하는 기간계와 통계성 업무를 처리하는 정보계로 나누어짐
- OLTP 업무는 기간계 , OLAP 업무는 정보계라 칭함
ASIS 시스템
- 현재 개발중인 시스템(TOBE)에서 과거(이전)나 현재 운영중인 시스템을 부를때 칭함.
- 주로 레거시 나 AS-IS 라 칭함
TOBE 시스템
- 현재 개발중인 시스템을 칭함
- 주로 차세대라 칭함.
SQL 종류
- DDL DML DCL TCL
DDL (Data Definition Language; 데이터 정의 언어)
- 데이터 정의어
- :데이터베이스의 구조를 만들고 변경,수정 하는 명령어
- - CREATE TABLE : 테이블 생성
- - ALTER TABLE : 테이블 수정
- - DROP TABLE : 테이블 삭제
- - CREATE INDEX : 인덱스 생성
- - ALTER INDEX : 인덱스 수정
- - DROP INDEX : 인덱스 삭제
DML (Data Manipulation Language; 데이터 조작 언어)
- 데이터 조작어
- :테이블 안의 데이터를 넣고, 바꾸고, 지우고, 조회하는 데 사용해요.
- - SELECT
- - SELECT INTO
- - INSERT
- - DELETE
- - UPDATE
- - CREATE SEQUENCE
- - ALTER SEQUENCE
- - DROP SEQUENCE
DCL (Data Control Language : 데이터 제어 언어)
- 데이터 제어어
- 사용자 권한을 관리해요. 누가 무엇을 할 수 있는지 정해요.
- - CREATE USER
- - ALTER USER
- - GRANT
- TCL (Transaction Control Language; 트랜잭션 제어 언어)
- - COMMIT
- - ROLLBACK
DDL (Data Definition Language; 데이터 정의 언어)
- CREATE / ALTER / DROP [테이블 or 인덱스]
CREATE TABLE (테이블 생성)
CREATE TABLE 테이블명 ( 컬럼명 컬럼 타입 , ... , <column-name-n> <type> ) [tablespace 테이블스페이스명] -- 생략시 default tablespace에 생성. ;
ALTER TABLE (테이블 변경)
- 컬럼 추가
ALTER TABLE 테이블명 ADD ( 컬럼명 데이터타입, ...<column-name-n> <type> );
- 컬럼 수정
ALTER TABLE 테이블명 MODIFY ( 컬럼명 새로운타입 );
- 컬럼 삭제
ALTER TABLE 테이블명 DROP COLUMN 컬럼명;
DROP TABLE (테이블 삭제)
DROP TABLE 테이블명 ;
CREATE INDEX (인덱스 생성)
CREATE INDEX 인덱스명 ON 테이블명 ( 컬럼1,컬럼2, ... );
ALTER INDEX (인덱스 수정)
- 인덱스 재생성 (통계정보 수집은 동시에 )
-- COLLECTING STATISTICS ON INDEX ALTER INDEX 인덱스 REBUILD COMPUTE STATISTICS; -- 인덱스를 통계정보화 함께 리빌드 한다.
- 인덱스명 변경
-- RENAME INDEX ALTER INDEX 인덱스명 RENAME TO 새 인덱스명;
DROP INDEX (인덱스 삭제)
DROP INDEX 인덱스명;
DML (Data Manipulation Language; 데이터 조작 언어)
SELECT (조회)
SELECT 컬럼명1, 컬럼명2, ..., <column-name-n> FROM 테이블명1,테이블명2, ..., <table-name-n> WHERE <조건 표현 구문 > GROUP BY <그룹핑 컬럼>, ..., <grouping-column-name-n> HAVING <그룹핑 표현구문> ORDER BY <정렬 컬럼1>, ..., <order-column-name-n> ;
INSERT (입력)
- 전체 데이터 입력시
-- INSERT ALL VALUES INSERT INTO 테이블명 VALUES ( 값1, ..., <value-n> );
- 부분 데이터 입력시
-- INSERT SOME VALUES INSERT INTO 테이블명 ( 컬럼명1, ..., <column-name-n> ) VALUES ( 값1, ..., <value-n> );
DELETE (삭제)
DELETE FROM 테이블명 WHERE 조건표현구문;
UPDATE (갱신)
UPDATE 테이블명 SET 컬럼명 = <value> WHERE 조건표현구문
CREATE SEQUENCE (순서/번호 채번)
CREATE SEQUENCE 시퀀스명 MINVALUE <min-value> MAXVALUE <max-value> START WITH <start-value> INCREMENT BY <step-value> CACHE <cache-value>
ALTER SEQUENCE (순번 변경)
-- ALTER MINVALUE 최소값 변경 ALTER SEQUENCE 시퀀스명 MINVALUE <new-min-value>; -- ALTER MAXVALUE 최대값 변경 ALTER SEQUENCE 시퀀스명 MAXVALUE <new-max-value>; -- ALTER INCREMENT 증가값 변경 ALTER SEQUENCE 시퀀스명 INCREMENT BY <new-step-value>; -- SET CYCLE OR NOCYCLE 순환 여부 변경 ALTER SEQUENCE 시퀀스명 <CYCLE | NOCYCLE>; -- ALTER CACHE 캐시 건수 변경 ALTER SEQUENCE 시퀀스명 CACHE <new-cache-value>;
DROP SEQUENCE
DROP SEQUENCE 시퀀스명;
DCL (Data Control Language; 데이터 제어 언어)
- CREATE USER
CREATE USER 유저명 IDENTIFIED BY <user-password>;
- ALTER USER
ALTER USER 유저명 IDENTIFIED BY <new-user-password>;
- GRANT
GRANT 권한 TO 유저명;
TCL (Transaction Control Language; 트랜잭션 제어 언어)
- COMMIT
- ROLLBACK
GROUP BY 절
- (영문): GROUP BY is used to group rows that have the same values in specified columns into summary rows.
- (한글): GROUP BY는 특정 컬럼 값을 기준으로 같은 값들끼리 묶어서 결과를 보여주는 SQL 절입니다.
특징
집계 함수(예: COUNT(), SUM(), AVG(), MAX(), MIN())와 함께 자주 사용됩니다.
데이터를 그룹별 요약하거나 분류해서 볼 수 있습니다.
사용 방법
SELECT 컬럼명, 집계함수 FROM 테이블명 GROUP BY 컬럼명;
예제
employees 테이블 예시
emp_id | name | department | salary |
---|---|---|---|
1 | John | Sales | 3000 |
2 | Alice | Sales | 3200 |
3 | Bob | IT | 4000 |
4 | Carol | IT | 4200 |
5 | David | HR | 2800 |
예제 1: 부서별 평균 급여 구하기
SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department;
- 조회 결과
department | avg_salary |
---|---|
Sales | 3100 |
IT | 4100 |
HR | 2800 |
설명: department(부서)별로 묶어서, 각 부서의 salary(급여) 평균을 구한 것입니다.
예제 2: 부서별 직원 수 구하기
SELECT department, COUNT(*) AS num_employees FROM employees GROUP BY department;
- 조회 결과
department | num_employees |
---|---|
Sales | 2 |
IT | 2 |
HR | 1 |
설명: GROUP BY department를 통해 부서별로 직원 수를 센 것입니다.
주의사항
GROUP BY에 사용하지 않은 컬럼은 SELECT절에 직접 쓸 수 없습니다. (단, 집계 함수(max(),count(),sum()..) 안에 들어가는 경우는 예외)
GROUP BY는 정렬 기능이 아닙니다. 정렬은 ORDER BY를 사용해야 합니다.
GROUP BY 절 고급
HAVING 절
HAVING은 GROUP BY로 그룹화한 결과에 조건을 거는 절입니다.
WHERE는 그룹화 전에 조건, HAVING은 그룹화 후 조건입니다.
예제 테이블: sales
id | product | region | amount |
---|---|---|---|
1 | Laptop | Seoul | 2000 |
2 | Laptop | Busan | 1500 |
3 | Phone | Seoul | 1000 |
4 | Phone | Busan | 1200 |
5 | Laptop | Seoul | 2200 |
6 | Phone | Seoul | 1300 |
예제 1: 지역별로 제품 판매 총합이 3000 이상인 경우만 보기
SELECT region, SUM(amount) AS total_sales FROM sales GROUP BY region HAVING SUM(amount) >= 3000;
결과
region | total_sales |
---|---|
Seoul | 5500 |
설명: GROUP BY region으로 지역별로 묶고, HAVING을 통해 총합이 3000 이상인 지역만 필터링합니다.
다중 컬럼 GROUP BY
개념 • 두 개 이상의 컬럼을 기준으로 복합적으로 그룹화할 수 있습니다.
예제 2: 지역 + 제품별 판매 총액 구하기
SELECT region, product, SUM(amount) AS total_sales FROM sales GROUP BY region, product;
결과
지역 | 제품 | 매출액(USD) |
---|---|---|
Seoul | Laptop | 4,200 |
Seoul | Phone | 2,300 |
Busan | Laptop | 1,500 |
Busan | Phone | 1,200 |
설명: region과 product를 동시에 그룹화하여, 각 지역-제품 조합별로 총 판매량을 계산했습니다.
GROUP BY + JOIN 활용
복잡한 데이터 분석에는 JOIN과 GROUP BY를 함께 사용합니다.
예제 테이블
- employees
사원 ID | 이름 | 부서 ID |
---|---|---|
1 | John | 10 |
2 | Alice | 10 |
3 | Bob | 20 |
- departments
부서 ID | 부서 이름 |
---|---|
10 | Sales |
20 | IT |
- salaries
사원 ID | 급여 (USD) |
---|---|
1 | 3,000 |
2 | 3,500 |
3 | 4,000 |
부서별 평균 급여 구하기 (JOIN 사용)
SELECT d.dept_name, AVG(s.salary) AS avg_salary FROM employees e JOIN departments d ON e.dept_id = d.dept_id JOIN salaries s ON e.emp_id = s.emp_id GROUP BY d.dept_name;
결과
부서명 | 평균 급여(USD) |
---|---|
Sales | 3,250 |
IT | 4,000 |
전체 평균 | 3,625 |
설명: 여러 테이블을 JOIN해서 dept_name 기준으로 묶고 평균 급여를 계산했습니다.
ROLLUP (고급)
ROLLUP은 그룹별 합계 외에 **전체 합계(총계)**까지 같이 보여줍니다.
예제 4: 제품별 판매 총액과 전체 총액까지 보여주기
SELECT product, SUM(amount) AS total_sales FROM sales GROUP BY ROLLUP(product);
결과
제품 | 매출액(USD) |
---|---|
Laptop | 3,700 |
Phone | 3,500 |
전체 합계 | 7,200 |
설명: NULL은 전체 총합을 의미합니다. 제품별 합계 + 전체 합계를 한 번에 볼 수 있습니다.
요점정리
개념 | 설명 | 사용 예시 |
---|---|---|
GROUP BY | 특정 컬럼 값으로 행을 그룹화 | SELECT dept, COUNT(*) FROM emp GROUP BY dept |
HAVING | 그룹화된 결과에 필터링 조건 적용 (WHERE 절과 유사하지만 그룹 후 적용) |
SELECT dept, AVG(salary) FROM emp GROUP BY dept HAVING AVG(salary) > 5000 |
다중 그룹화 | 두 개 이상 컬럼으로 계층적 그룹화 | SELECT dept, gender, COUNT(*) FROM emp GROUP BY dept, gender |
JOIN + GROUP BY | 여러 테이블 연결 후 그룹화 수행 | SELECT d.dept_name, COUNT(e.emp_id) FROM emp e JOIN dept d ON e.dept_id = d.dept_id GROUP BY d.dept_name |
ROLLUP | 그룹별 소계 + 총계를 한 번에 출력 (다차원 분석용) |
SELECT dept, gender, SUM(salary) FROM emp GROUP BY ROLLUP(dept, gender) |