메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Oracle (토론 | 기여)님의 2025년 5월 14일 (수) 12:08 판 (Oracle (토론)의 414판 편집을 되돌림)

데이터 베이스 용어

영문 용어 한글 용어 설명
SQL 질의어 Structured Query Language,SQL은 데이터베이스에서 데이터를 관리하거나 조작하기 위해 설계된 표준 프로그래밍 언어
QUERY 쿼리 질의어,SQL 문장에서 데이터를 조회하는 명령어를 Query 라 함.
질의 > 학생들(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 컬럼(열) 컬럼은 세로 줄, 열을 의미, 엑셀에서 세로줄과 유사
  • 데이터값을 조회 하기위한 타이틀
=================== 
| Name   | Age | City      |
===================
ROW 로우(행) 로우는 줄,행을 의미, 엑셀에서 가로줄과 유사 , 주로 1개의 줄을 레코드라고 한다.
  • 데이터의 값이 저장되어 있다.
| Alice  | 24  | New York |
---------------------------------
| Bob    | 30  | Chicago   |
INDEX 인덱스 데이터를 빠르게 검색하기 위해 사용하는 특별한 데이터 구조, 책에 있는 목차(INDEX) 와 유사
VIEW 데이터베이스에서는 가상 테이블을 의미, 테이블에 있는 일부 속성(컬럼)을 사용하고 할때 사용

DDL DML DCL TCL

DDL (Data Definition Language; 데이터 정의 언어)

  1. 데이터 정의어
    :데이터베이스의 구조를 만들고 변경,수정 하는 명령어
    1. - CREATE TABLE : 테이블 생성
    2. - ALTER TABLE  : 테이블 수정
    3. - DROP TABLE  : 테이블 삭제
    4. - CREATE INDEX : 인덱스 생성
    5. - ALTER INDEX  : 인덱스 수정
    6. - DROP INDEX  : 인덱스 삭제

DML (Data Manipulation Language; 데이터 조작 언어)

  1. 데이터 조작어
    :테이블 안의 데이터를 넣고, 바꾸고, 지우고, 조회하는 데 사용해요.
    1. - SELECT
    2. - SELECT INTO
    3. - INSERT
    4. - DELETE
    5. - UPDATE
    6. - CREATE SEQUENCE
    7. - ALTER SEQUENCE
    8. - DROP SEQUENCE

DCL (Data Control Language : 데이터 제어 언어)

  1. 데이터 제어어
    사용자 권한을 관리해요. 누가 무엇을 할 수 있는지 정해요.
    1. - CREATE USER
    2. - ALTER USER
    3. - GRANT
  2. TCL (Transaction Control Language; 트랜잭션 제어 언어)
    1. - COMMIT
    2. - 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

SELECT 기본 구문

명령어 설명
SELECT 테이블에 있는 속성을 지정하여 데이터를 조회하는 명령어 (주로 속성(컬럼)을 기술)
FROM 데이터가 있는 테이블이나 뷰를 지정하는 명령어 (주로 테이블, 뷰, 인라인뷰 등을 기술)
WHERE 데이터를 조회하는 조건을 지정하는 명령어 (주로 조건을 기술)
GROUP BY 특정 속성을 기준으로 그룹화하여 검색할 때 사용하는 명령어 (주로 SELECT 절에 사용된 속성을 그룹핑할 때 기술)
HAVING 그룹화된 속성에 조건을 지정하는 명령어 (주로 ~보다 크거나 작은 경우, 같은 경우를 지정)
ORDER BY 정렬 명령어 (주로 속성값에 오름차순, 내림차순 속성을 지정)

SELECT 기본 예제

  • 테스트용 테이블 생성 및 관련 데이터 입력 SQL
    • employees : 사원 테이블
    • sales  : 판매 테이블
    • customers : 고객 테이블
    • orders  : 주문 테이블
    • students  : 학생 테이블

  • `employees` 사원 테이블 생성
CREATE TABLE employees (
    employee_id   NUMBER PRIMARY KEY,
    department_id NUMBER,
    salary        NUMBER,
    hire_date     DATE
);

-- 샘플 데이터 입력 
INSERT INTO employees VALUES (1, 10, 4800, TO_DATE('2006-03-15', 'YYYY-MM-DD'));
INSERT INTO employees VALUES (2, 10, 5200, TO_DATE('2007-06-01', 'YYYY-MM-DD'));
INSERT INTO employees VALUES (3, 20, 6000, TO_DATE('2005-08-20', 'YYYY-MM-DD'));
INSERT INTO employees VALUES (4, 20, 5500, TO_DATE('2004-11-10', 'YYYY-MM-DD'));
INSERT INTO employees VALUES (5, 30, 7000, TO_DATE('2006-12-25', 'YYYY-MM-DD'));
commit;
  • `sales` 판매 테이블 생성
CREATE TABLE sales (
    sale_id          NUMBER PRIMARY KEY,
    sale_date        DATE,
    product_category VARCHAR2(50),
    sale_amount      NUMBER
);

INSERT INTO sales VALUES (1, TO_DATE('2023-01-15', 'YYYY-MM-DD'), '전자제품', 300000);
INSERT INTO sales VALUES (2, TO_DATE('2023-02-10', 'YYYY-MM-DD'), '전자제품', 400000);
INSERT INTO sales VALUES (3, TO_DATE('2023-04-05', 'YYYY-MM-DD'), '가전',     500000);
INSERT INTO sales VALUES (4, TO_DATE('2023-07-20', 'YYYY-MM-DD'), '가전',     600000);
INSERT INTO sales VALUES (5, TO_DATE('2023-10-03', 'YYYY-MM-DD'), '도서',     200000);
INSERT INTO sales VALUES (6, TO_DATE('2023-10-15', 'YYYY-MM-DD'), '도서',     850000);
commit;
  • `students` 학생 테이블 생성
CREATE TABLE students (
    student_id NUMBER PRIMARY KEY,
    department VARCHAR2(100),
    score      NUMBER
);

::<source lang=sql>
INSERT INTO students VALUES (1, '컴퓨터공학과', 90);
INSERT INTO students VALUES (2, '컴퓨터공학과', 85);
INSERT INTO students VALUES (3, '전자공학과',   88);
INSERT INTO students VALUES (4, '전자공학과',   82);
INSERT INTO students VALUES (5, '심리학과',     78); -- 제외됨 (80 미만)
INSERT INTO students VALUES (6, '경영학과',     95);
INSERT INTO students VALUES (7, '경영학과',     90);
commit;
  • `customers` 고객, `orders` 주문 테이블 생성
CREATE TABLE customers (
    customer_id   NUMBER PRIMARY KEY,
    customer_name VARCHAR2(100)
);

CREATE TABLE orders (
    order_id     NUMBER PRIMARY KEY,
    customer_id  NUMBER,
    order_amount NUMBER,
    order_date   DATE,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

-- 고객
INSERT INTO customers VALUES (1, '홍길동');
INSERT INTO customers VALUES (2, '김영희');
INSERT INTO customers VALUES (3, '이철수');

-- 주문
INSERT INTO orders VALUES (101, 1, 2000000, TO_DATE('2022-02-15', 'YYYY-MM-DD'));
INSERT INTO orders VALUES (102, 1, 3500000, TO_DATE('2022-06-10', 'YYYY-MM-DD'));
INSERT INTO orders VALUES (103, 2, 1500000, TO_DATE('2022-07-20', 'YYYY-MM-DD'));
INSERT INTO orders VALUES (104, 2, 2000000, TO_DATE('2022-09-12', 'YYYY-MM-DD'));
INSERT INTO orders VALUES (105, 3, 500000,  TO_DATE('2022-03-01', 'YYYY-MM-DD'));
commit;

예제 1. 부서/사원 조회

  1. 부서별 평균 급여가 5000 이상인 부서 중
  2. 2005년 이후 입사한 사원만 조회하여
  3. 평균 급여가 높은 순으로 정렬
SELECT department_id AS 부서번호
     , COUNT(*) AS 사원수
     , ROUND(AVG(salary), 0) AS 평균급여
     , MAX(hire_date) AS 최근입사일
  FROM employees
-- 2005년 이후 입사한 사원만 조회
 WHERE hire_date > TO_DATE('2005-01-01', 'YYYY-MM-DD')
-- 부서별 평균 급여가 5000 이상인 부서
 GROUP BY department_id
HAVING AVG(salary) >= 5000
-- 평균 급여가 높은 순으로 정렬
ORDER BY 평균급여 DESC;

예제 2. 제품 판매 분석

  1. 2023년 분기별, 카테고리별 판매액 집계
  2. 총 판매액이 100만원 이상인 그룹만 표시
  3. 분기와 카테고리 순으로 정렬
SELECT TO_CHAR(sale_date, 'Q') AS 분기
     , product_category AS 카테고리
     , COUNT(*) AS 판매건수
     , SUM(sale_amount) AS 총판매액
     , AVG(sale_amount) AS 평균판매액
  FROM sales
-- 2023년 분기별,  
 WHERE sale_date BETWEEN TO_DATE('2023-01-01', 'YYYY-MM-DD') AND TO_DATE('2023-12-31', 'YYYY-MM-DD')
-- 판매액 별,카테고리별 그룹
 GROUP BY TO_CHAR(sale_date, 'Q'), product_category
-- 총 판매액이 100만원 이상
HAVING SUM(sale_amount) >= 1000000
 ORDER BY 분기 ASC, 총판매액 DESC;

예제 3. 학생 성적 조회

  1. 각 학과별로 성적이 80점 이상인 학생들만 집계
  2. 학과 평균이 85점 이상인 그룹만 선택
  3. 평균 점수 순으로 정렬
SELECT department AS 학과
     , COUNT(*) AS 학생수
     , ROUND(AVG(score), 1) AS 평균점수
     , MAX(score) AS 최고점수
     , MIN(score) AS 최저점수
  FROM students
-- 성적이 80점 이상인 
 WHERE score >= 80
-- 학과  평균이 85점 이상인 그룹만
 GROUP BY department
HAVING AVG(score) >= 85
-- 평균 점수 순으로 정렬
 ORDER BY 평균점수 DESC;

예제 4. 고객 구매 패턴 조회(ANSI SQL)

  1. 연간 구매액 500만원 이상
  2. 2022년에 구매한 고객별 구매 통계
  3. 총 구매액 순으로 정렬
SELECT c.customer_id AS 고객ID
     , c.customer_name AS 고객명
     , COUNT(o.order_id) AS 주문횟수
     , SUM(o.order_amount) AS 총구매액
     , MAX(o.order_date) AS 최근구매일
  FROM customers c
  JOIN orders o 
   ON c.customer_id = o.customer_id
-- 2022년에 연간 
 WHERE o.order_date BETWEEN TO_DATE('2022-01-01', 'YYYY-MM-DD') AND TO_DATE('2022-12-31', 'YYYY-MM-DD')
-- 구매액이 500만원이상 구매한 고객아이디,고객명 그룹별
 GROUP BY c.customer_id, c.customer_name
HAVING SUM(o.order_amount) >= 5000000
-- 총 구매액 순으로 정렬 
 ORDER BY 총구매액 DESC;